Perché il mio finestre di console perdita di applicazione al minimo? (E perché il punto pistola fumante in kernel32.dll ??)
-
18-09-2019 - |
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.
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.