Warum läuft meine Windows -Konsolenanwendung beim Leerlauf aus? (Und warum zeigt der Rauchwaffe bei Kernel32.dll?)

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

Frage

Ich habe eine Windows-Anwendung mit mehreren gestörter Konsolen, die ungefähr eine private Speicher von ungefähr 4 KB pro Minute oder so zu veröffentlichen scheint.

Um das Leck zu lokalisieren, habe ich jeden Thread in der Anwendung nach und nach aufgehängt, bis das Leck gestoppt wurde, und zu meiner Überraschung scheint der Täter ein Thread namens "Win32Thread" zu sein.

Es sieht nicht aus wie ein Thread, den ich explizit begonnen habe.

Wenn ich die Anwendung anhaft und breche, sieht die Stapelverfolgung so aus:

    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 

Hat jemand eine Idee, warum dies plötzlich auslaufen würde?

Die Anwendung wurde für etwa 40 Stunden auf einem Gewinn2K3 SP2 -Dual -Core -System ausgeführt.

Alle Ideen werden sehr geschätzt.

War es hilfreich?

Lösung

Dieser Stack -Trace sieht aus wie in Code im Zusammenhang mit Timern. Ich würde vermuten, dass Ihr Code (oder eine Bibliothek, die Sie verwenden) einen Timer mit Verwendung gestartet haben timeSetEvent oder eine ähnliche Funktion. In diesem Fall würde das Leck wahrscheinlich in Ihrer Timer -Rückruffunktion liegen.

Durch das Starten eines Multimedia -Timers wird ein Thread erstellt, und Ihr Rückruf wird aus diesem Thread aufgerufen. Ein periodischer Timer würde erklären, warum es im Leerlauf leckt.

Andere Tipps

Hat Ihre Bewerbung APCs (asynchrone Prozeduranrufe) oder geplante Timer -Ereignisse? Multimedia -Timer -Rückrufe würden.

Wenn Ihr Rückruf C-Laufzeitanrufe verwendet, trifft diese Anrufe einmalige lokale Zuteilungen (träge, zum ersten Mal zugewiesen, dass die Funktion in einem Thread aufgerufen wird), um ihre Arbeit zu erledigen (_tcstol, Sprintf usw.). Weil der Faden nicht mit begonnen () oder mit BeginnThreadEx () begonnen wurde, kann dieser Speicher nicht aufgeräumt werden, wenn der Faden stirbt, so dass sich dies als Leck manifestieren würde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top