dinsdag 16 oktober 2007

Adv. debugging: Stack dumps met Process Explorer

In een eerder artikel heb ik uitgelegd hoe je zelf een stack dump kunt maken. Dit vooral bruikbaar bij exceptions, en soms ook voor het debuggen van een bepaalde situatie (”hoe komt hij hier?”).
Maar hoe kun je de stack bekijken als je programma vastloopt? In Delphi kun je het programma pauzeren en de stack bekijken, maar wat als het net buiten Delphi of op een (andere) server draait?

Process Explorer biedt dan uitkomst. Zoals ik al zei in een eerder artikel over Process Explorer: het is een super programma waar ik niet zonder kan. Je kunt er namelijk ook de stack mee bekijken van elke thread van een willekeurig programma. Dubbelklik hiervoor op een programma in de tree van Process Explorer en selecteer de “Threads” tab:

Dubbelklik vervolgens op een thread (hierboven is maar 1 thread) of klik op de “Stack” knop:

Het probleem is echter dat je dan geen beschrijvende namen ziet: alleen bijvoorbeeld een offset van 0×60664 bytes.

De truc hiervoor is om eerst een .map file te maken, en deze naar een .dbg file om te zetten:
Delphi -> Project Options -> Linker -> Map file -> Detailed
(zet ook eerst “optimization” UIT en “Stack frames” AAN op de compiler tab). Druk op “build” om opnieuw het programma te builden en om een map file te krijgen. Vervolgens moet van deze Delphi .map file omgezet worden naar een Windows debug file (.dbg).
Gebruik hiervoor “map2dbg”:
http://www.wischik.com/lu/programmer/ms-dbg.zip
Dit klein programmaatje moet via de command line (bijv. batch bestand) uitgevoerd worden:
map2dbg.exe .
Het bewuste programma wordt dan intern gemarkeerd dat het Windows Debug informatie bevat, en wordt omgezet naar .

Daarna moet in Process Explorer de directory als “symbol path” opgeven waar de bewuste .dbg file staat:
Options -> Configure Symbols

Als je dan een stack dump opvraagt, krijg je wel de volledige namen te zien:

Opmerking: map2dbg lijkt niet (altijd) te werken met Delphi 2007.
Bovenstaande demo lukte met 2007 niet en met Delphi 7 wel…

Soms heb je een nieuwe versie van “dbghelp.dll” en “imagehlp.dll” nodig:
http://msdl.microsoft.com/download/symbols/debuggers/dbg_x86_6.5.3.8.exe

Geen opmerkingen: