Frage

Ich habe eine Explosion einig Heapbeschädigung aufzuspüren. Ich habe Standard Seitenheap-Überprüfung aktiviert mit

gflags /p /enable myprogram.exe

und dies gelingt bei der Bestätigung der Korruption:

===========================================================
VERIFIER STOP 00000008: pid 0x1040: corrupted suffix pattern 

    10C61000 : Heap handle
    19BE0CF8 : Heap block
    00000010 : Block size
    00000000 : 
===========================================================

Wenn ich auf ganze Seite Heap Überprüfung drehen (gflags /p /enable myprogram.exe /full) in der Erwartung, dass dies ein Fehler zu der Zeit auftreten wird bewirken, dass die Korruption eingeführt wird, bekomme ich nichts mehr.

Ich begann meine Hoffnungen aufstehen beim Lesen Advanced Windows Debugging: Speicherbeschädigung Teil II-Heaps , das ist ein Kapitel von Advanced Windows Debugging . Ich installierte WinDbg und heruntergeladen Debug-Symbole für user32.dll, kernel32.dll, ntdll.dll nach http://support.microsoft. com / kb / 311503 . Nun, wenn das Programm im Debugger stoppt kann ich diesen Befehl Informationen über den Haufen Seite zu sehen:

0:000> dt _DPH_BLOCK_INFORMATION 19BE0CF8-0x20
ntdll!_DPH_BLOCK_INFORMATION
   +0x000 StartStamp       : 0xabcdaaaa
   +0x004 Heap             : 0x90c61000 
   +0x008 RequestedSize    : 0x10
   +0x00c ActualSize       : 0x38
   +0x010 FreeQueue        : _LIST_ENTRY [ 0x0 - 0x0 ]
   +0x010 TraceIndex       : 0
   +0x018 StackTrace       : (null) 
   +0x01c EndStamp         : 0xdcbaaaaa

Ich bin bestürzt über den (null) Stack-Trace. Nun http://msdn.microsoft.com/ en-us / library / ms220938% 28VS.80% 29.aspx sagt:

  

Das Feld Stacktrace einen Nicht-Null-Wert enthält aus verschiedenen Gründen nicht immer wird. Zunächst einmal Stack-Trace Erkennung wird nur auf x86-Plattformen unterstützt und zweitens auch auf x86-Rechner der Stack-Trace-Erkennungsalgorithmen sind nicht absolut zuverlässig. Wenn der Block ein zugeordneter Block Spur des Stapels ist für die Zuteilung Moment. Wenn der Block freigegeben wurde, der Stack-Trace ist für die freie Zeit.

Aber ich frage mich, ob jemand irgendwelche Gedanken über die Erhöhung der Chancen, die Stack-Trace aus dem Zuweisungs Moment hat.

Vielen Dank für das Lesen!

War es hilfreich?

Lösung

Ah ha! Stellt sich heraus, ich brauchte mehr gflags Optionen zu aktivieren:

gflags /i myprogram.exe +ust

, die diesen Effekt hat:

ust - Create user mode stack trace database

Es scheint einfach, wenn ich Parameter Beschreibung zu sehen. Wie dumm von mir. Aber ich scheine auch die Größe der Trace-Datenbank festlegen zu müssen, bevor sie wirksam werden:

gflags /i myprogram.exe /tracedb 512

... oder was auch immer (in MB).

Andere Tipps

Laut Microsoft der malloc-Funktion in der C-Laufzeit (CRT) Modul verwendet die Rahmenzeiger Auslassung (FPO) in einigen Windows-Versionen. Sie können nicht die vollständige Stapelinformation der malloc-Funktion sehen. (Http://support.microsoft.com/kb/268343)

Wenn möglich, versuchen die Debug-Version CRT zu verknüpfen, beispielsweise Link mit / MDd Option, um dieses Problem zu lösen.

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