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 <programma.exe>.
Het bewuste programma wordt dan intern gemarkeerd dat het Windows Debug informatie bevat, en <programma.map> wordt omgezet naar <programma.dbg>.

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

Stem of voeg toe aanUitleg over het gebruik van deze icons :Voeg dit artikel toe aan Del.icio.us Voeg toe aan je Google bladwijzers Plaats dit bericht op Twitter Geef dit als tip aan je Hyves-vrienden Voeg toe aan je Facebook-profiel Deel met je LinkedIn-contacten Abonneer je op de RSS-feed van deze site Verstuur deze pagina per e-mail via Feedburner Print deze pagina of genereer een PDF-bestand