Perché il mio finestre di console perdita di applicazione al minimo? (E perché il punto pistola fumante in kernel32.dll ??)

StackOverflow https://stackoverflow.com/questions/2206930

Domanda

Ho un finestre un'applicazione console multi-threded che sembra essere perdite di memoria privata circa 4 KB ogni minuto o giù di lì.

Nel tentativo di localizzare la perdita, ho gradualmente sospesa ogni thread nell'applicazione fino a quando la perdita si fermò, e con mia sorpresa il colpevole sembra essere un filo chiamato "Win32Thread".

Non sembra come un filo che ho esplicitamente iniziato.

Se io attribuisco e rompere l'applicazione, l'analisi dello stack si presenta così:

    ntdll.dll!_KiFastSystemCallRet@0()  
    ntdll.dll!_NtCancelTimer@8()  + 0xc bytes   
    ntdll.dll!_RtlpResetTimer@12()  + 0x15 bytes    
>   ntdll.dll!_RtlpServiceTimer@12()  + 0xfd bytes  
    ntdll.dll!_KiUserApcDispatcher@16()  + 0x25 bytes   
    kernel32.dll!_BaseThreadStart@8()  + 0x34 bytes 

Qualcuno ha qualche idea del perché questo sarebbe improvvisamente perdite?

L'applicazione come stato corrente per circa un 40 ore in un sistema dual core Win2k3 SP2.

Tutte le idee sono apprezzate greately.

È stato utile?

Soluzione

Questa traccia dello stack sembra che sia in codice relativo al timer. Direi che il codice (o una libreria si usa) ha iniziato un timer utilizzando timeSetEvent o una funzione simile. In tal caso, la perdita sarebbe probabilmente nella vostra funzione di timer di callback.

A partire un timer multimediale provoca un filo da creare, e il callback si chiamerà da quel thread. Un timer periodico spiegherebbe il motivo per cui le perdite, mentre al minimo.

Altri suggerimenti

La vostra applicazione ha (chiamate di procedura asincrona) APC o eventi timer in programma? callback del timer Multimedia avrebbe fatto.

Se la richiamata utilizza le chiamate di runtime C, queste chiamate rende una tantum filo allocazioni locali (pigramente, assegnato prima volta la funzione viene chiamata in un thread) per fare il loro lavoro (_tcstol, sprintf, ecc). Perché il filo non è stato avviato con BeginThread () o beginthreadex () questa memoria non può essere pulito quando il filo muore, in modo che sarebbe manifestarsi come una perdita.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top