KB » Computer » Dump analyse

Dump analyse

    Tweeten

Introductie

Op deze pagina gaat het vooral over het debuggingprogramma WinDbg.

Je kan dat programma voor 2 doelen gebruiken:

Hieronder vind je hoe je een PC moet instellen zodat er automatisch dumps worden genomen bij crashes e.d.

Het debuggingprogramma wordt hier beschreven, de commando's ervan in een aparte sectie.

Zorg ervoor dat er dumps genomen worden

Open het System applet.

Windows 7

Klik op het tabblad Geavanceerd (Advanced).

Klik op Instellingen (Settings) in het frame (Startup and Recovery)

Haal het vinkje weg bij (Automatically restart), omdat je anders niet eens ziet dat je een blue screen krijgt, en wat er op staat.

Kies in de lijst (Write debugging information) het dump type, en evt. waar de dump heen moet. Kernel dump is aan te bevelen als je serieus aan het debuggen wilt.

Windows XP

Haal het vinkje weg bij (Automatically reboot), omdat je anders niet eens ziet dat je een blue screen krijgt, en wat er op staat.

Kies daaronder het dump type, en evt. waar de dump heen moet. Kernel dump is aan te bevelen als je serieus aan het debuggen wilt.


Installatie en basics van WinDbg (debugger)

De benodigde software (Debugging Tools)

Tot enige tijd geleden moest je het pakket Debugging Tools for Windows downloaden en installeren. Er was 1 versie voor alle Windows NT varianten.

Nu (augustus 2012) heb je de Windows SDK for Windows 7 and .Net Framework 4 nodig. De te downloaden file heet winsdk_web.exe. Bij het installeren moet je aanvinken wat je allemaal op het systeem wilt hebben, en ik kies gemakshalve maar voor alles. Maar je kunt ook vinkjes plaatsen voor Debugging Tools for Windows en Debugging Tools

Onderdeel van de Debugging Tools for Windows is het programma WinDbg. Dit is het handigste voor beginners, omdat het een grafische interface heeft.

Symbols

Om DLL's, executables e.d. te kunnen analyseren moet de debugger weten welke namen er allemaal in gedefinieerd zijn. Deze symbols kan je eenmalig downloaden, maar het is een gigantisch pakket en mij nog niet gelukt om er op deze manier mee te werken.

De andere optie is alleen de symbols die nodig zijn op te laten halen van de Microsoft symbol server. De debugger bepaalt dat aan de hand van wat hij tegenkomt in de dump. Maak een map aan waar je wilt dat de symbols terechtkomen, en doe (in WinDbg): File - Symbol File Path - srv*symbolfolder*http://msdl.microsoft.com/download/symbols Als je het pad niet steeds opnieuw wilt invoeren, doe dan een keer File - Save Workspace.

Openen van de dump

Start WinDbg, en doe File - Open Crash Dump (Ctrl+D).

Er zijn 3 soorten dumps:


Hoe om te gaan met hangende systemen of programma's

Dumps maken van hangende programma's

Als een programma (niet de PC) hangt kan je een dump forceren.

Ga naar de command line, en tik in: drwtsn32 -p process_id waarbij process_id het process id is zoals je dat bv. met Process Explorer ziet.


Analyseren van een ander systeem dat hangt of gecrashed is

Het systeem dat je wilt analyseren (de target) moet gestart zijn in debugging mode. Die optie kan je kiezen vanuit het F8 menu, maar dan werk je met een default baudrate van 19200. Beter is om via Boot.ini enkele opties toe te voegen aan de bestaande Windows regel, of een nieuwe regel toe te voegen met wat extra opties.

Je kan de systemen verbinden met een nulmodemkabel, firewirekabel (XP en hoger) of USB 2.0 (Vista en hoger). Afhankelijk van het type verbinding moet je de volgende opties specificeren:

Tenslotte doe je op het host systeem (waarop je de debugger draait) File - Kernel Debug (Ctrl+K). Als de target hangt moet je na het tot stand komen van de verbinding ook nog Debug - Break (Ctrl+Break) doen. Daarna kan je commando's gaan intikken.


WinDbg commando's

Er zijn 3 groepen commando's: gewone, commando's die beginnen met een punt (zijn bedoeld om de debugger te besturen) en commando's die beginnen met een uitroepteken (debugger extensions, uitbreidingen op de normale set commando's).

Maar eerst een paar belangrijke commando's.

Hele belangrijke commando's

De volgende commando's:

!analyze

!analyze -v
Belangrijkste analyse commando (de 'v' staat voor verbose). Altijd als eerste doen!

k

k
Laat stack zien. Hierop zie je van onder naar beneden de uitgevoerde procedure calls. Voor het uitroepteken staat de naam van de module (DLL of executable), achter het uitroepteken de naam van de procedure. nt! staat voor ntoskrnl.exe. Zoek vooral naar non-Microsoft modules.
kv
Geeft nog wat extra adressen, waar ik op dit moment niets mee kan.
kP
Laat de parameters van elke functie in de call stack zien. Hangt van de context af of het werkt.
kn
Laat het framenummer van elke functie in de call stack zien. Je kan daarna met .frame naar het gewenste frame overschakelen.

lm

lm
Lijst (zonder extra info) van loaded modules.
lm kv
Geeft van elke geladen module heel veel extra info ('k' staat voor 'kernel modules', 'v' voor verbose). Let bv. op de timestamp van elke module, om te zien of er hele oude bij zitten.
lm kv m wildcard-naam
Geeft van elke geladen module waarvan de naam overeenkomt met de wildcard heel veel extra info ('m' staat voor match, 'k' voor 'kernel modules', 'v' voor verbose). Een voorbeeld van een wildcard is nv*, als je bv. alle drivers van nVidia wilt zien.

Gewone commando's (niet beginnend met speciaal teken)

De volgende commando's:

bp

bp punt_in_programma
Zet een breakpoint in een programma, bv. MyProgram!main

g

g
Start het programma, of laat het verder gaan (na bv. een breakpoint).

r

r
Laat de inhoud van de registers zien.

dv

dv
Laat de inhoud van de locale variabelen in de huidige functie zien.

dt

dt naam_van_variabele
Laat de waarde van locale variabelen met een complex type zien.

l

l-
Laat zien of de debugger in stappen van regels in de broncode (source-level) werkt (default) of in stappen van assembly instructies.
l+optie
Zet de optie optie aan. t staat standaard aan (source-level debugging).
l-
Zet de optie optie uit. Als je aan assembly level debugging wilt doen gebruik je het commando l-t
l-*
Zet alle opties uit.
En met l+* zet je alle opties aan.

x

x program_name!wildcard
Als je bv. x notepad!*font* doet, krijg je alle entry points in Kladblok (Notepad) te zien met 'font' in hun naam.

~

~
Laat een overzicht zien van alle actieve threads in het proces dat je aan het debuggen bent.
~nummers
Schakel over naar thread nummer
~*k
Laat de call stacks van alle threads zien.

vercommand

vercommand
Laat het commando zien waarmee de debugger gestart is.

! commando's

De volgende commando's:

!process

!process 0 0
Lijst van processen die actief waren.

!thread

!thread
Info over thread (die actief was?).

!irp

!irp
Toont IO request packet.

!vm

!vm

!poolused

!poolused

!sym

!sym noisy
Laat extra informatie zien tijden het ophalen van symbols, wat handig is in geval van problemen.
!sym quiet
Maakt !sym noisy weer ongedaan.

!chain

!chain
Laat zien welke DLL's met debugger extensions (! commando's) standaard geladen worden.

!extension_module.help

!extension_module.help
Laat de commando's zien die door deze module ondersteund worden.

. commando's

De volgende commando's:

.symfix

.symfix
Zet automatisch het pad naar de Microsoft symbol server.

.sympath

.sympath
Laat het pad naar de symbol server zien.
.sympath SRV*symbol_map*pad
Zet het pad naar de symbol server, en sla de symbols op in symbol_map.

.reload

.reload
Herlaadt de symbols voor alle geladen modules, maar ze worden pas echt geladen als de debugger ze nodig heeft.
.reload /f module_naam
Forceer het herladen van de symbols voor module module_naam.

WinDbg sneltoetsen (shortcuts)

Snel-
toets
Betekenis
F5 g commando: programma gaat lopen (evt. tot eerstvolgende breakpoint).
F10 Spring over een functieaanroep heen.
F11 Ga in de functie.
F6 Koppel de debugger aan een lopend proces.

Problemen

No export ... (stacks | process | dlls) found

Niet alle extensies (de commando's die beginnen met '!' zitten in een debugger extensie) worden automatisch geladen.

Probeer bv. load kdexts.dll.

Sommige commando's zijn bedoeld voor kernel mode, en sommige voor user mode.

Could not attach to process

Je krijgt de volgende meldingen als je met F6 de debugger probeert te koppelen aan een proces:

Could not attach to process pid, NTSTATUS 0xC00000BB The request is not supported.

Oorzaak is dat je een 32-bits debugger aan een 64-bits proces probeert te koppelen.




    Tweeten

© Henk Dalmolen
Reageer via E-mail (dalmolen@xs4all.nl)

Deze pagina is voor het laatst gewijzigd op: 8-12-2014 23:44:46