Dump analyse
- Introductie
- Installatie en basics van WinDbg (debugger)
- Symbols
- Modes van WinDbg
- Hoe om te gaan met hangende systemen of programma's
- Remote (op afstand) debuggen
- WinDbg commando's
- WinDbg sneltoetsen (shortcuts)
- Problemen
- Links
Introductie
Op deze pagina gaat het vooral over het debuggingprogramma
WinDbg
.
Je kan dat programma voor 2 doelen gebruiken:
- Het analyseren van memory dumps.
Die kunnen of automatisch genomen worden, bij een crash, of onder bepaalde omstandigheden geforceerd worden door de gebruiker. - Het debuggen van een lopend systeem of programma.
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
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:
- minidumps
Deze staan doorgaans in%systemroot%\Minidump
. Ze zijn maar 64 KB, en voor elke crash wordt er een nieuwe aangemaakt. - kernel dumps
Dit is het type dump waar je het meeste mee kan. Hij heetMEMORY.DMP
, en zit in%systemroot%
. - full dumps
Dumps die door Dr. Watson genomen worden zijn m.i. full dumps, zitten in%allusersprofile%\Documents\DrWatson
, en hetenUSER.DMP
.
Symbols
De linker kan een file aanmaken die
symbols (namen van variabeles, procedures, etc.) bevat.
Zo'n file heeft een .PDB
-extensie.
PDB staat voor Program DataBase.
De symbols zijn niet nodig voor het uitvoeren van het programma, maar wel handig voor het debuggen van een programma. Je krijgt dan nl. niet alleen getallen (adressen) te zien, maar ook de namen die erbij horen.
Visual Studio
maakt altijd een .PDB
-file aan in dezelfde map als
de binary.
De .PDB
-files van Microsoft code kan je ophalen
op
http://msdl.microsoft.com/download/symbols.
Dit zijn wel uitgeklede versies ervan (public symbols).
O.a. missen de locale variabelen van functies.
Modes van WinDbg
Naast het analyseren van dumps, waar deze pagina oorspronkelijk voor bedoeld was, heb je ook live debugging.
Bij user mode live debugging kan je de debugger koppelen aan een al lopend proces, of met de debugger een proces starten.
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
Tegenwoordig (begin 2018) gelden de volgende voorwaarden om hier goed mee te kunnen werken:
- Check of je network interface card (NIC) in de lijst staat van "Supported Ethernet NICs for Network Kernel Debugging in Windows 8.1" (ergens op MSDN te vinden).
- Bepaal het IP-adres van de host.
- Selecteer een poortnummer tussen 49152 en 65535.
- Verbind host en target met kabel (via router of switch) (beter geen wireless verbinding gebruiken, en ook beter maar 1 NIC op de target om verwarring te voorkomen).
- Schakel de firewalls aan beide kanten uit.
- Tik op de target de volgende commando's in (elevated commandoregel):
bcdedit /debug on bcdedit /dbgsettings net hostip:a.b.c.d port:x
Je krijgt dan een sleutel die je nodig hebt op de host. - Reboot de target.
- Start
WinDbg
op de host, en klik opFile - Kernel Debug
- Open het
Net
tabblad in het dialoogvenster, en voer poortnummer en sleutel in. - Vervolgens wordt verbinding gemaakt, en moet je klikken op
Debug - Break
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:
- \DEBUGGING (ongeacht welke verbinding je maakt)
- \BAUDRATE=115200, als je de systemen via een nulmodemkabel verbindt
- \DEBUGPORT=1394, als je minimaal Windows XP hebt, en beide systemen firewire ondersteunen
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 de call 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 voorntoskrnl.exe
. Zoek vooral naar non-Microsoft modules. kv
- Geeft als extra de parameters van de subroutine-aanroepen.
kM
- Geeft de framenummers als links weer. Door er op te klikken krijg je extra informatie over bv. de parameters.
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)
Dit zijn de ingebouwde commando's, zoals breakpoint en het lezen van en schrijven naar geheugen en registers.
De volgende commando's:
- bp (breakpoint): in programma's een breakpoint zetten
- dt (dump type)
- dv (dump variables)
- g (go): laat het programma lopen
- l
- r (registers)
- x
- vercmd (verify command)
- ~
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 metl+*
zet je alle opties aan.
lmvm
lmvm module
geeft informatie over de .PDB
-file(s) van die module.
ln
Hiermee krijg je de module te zien die bij een bepaald adres hoort. In feite is dit het omgekeerde van het x-commando.
x
x program_name!wildcard
- Als je bv.
x notepad!*font*
doet, krijg je alle entry points inKladblok (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
Dit zijn zgn. extension commands, die meekomen met debugger extensions of plugins. Je kan ze ook zelf maken.
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.
!itoldyouso
!itoldyouso
- Kijkt of de module en de
.PDB
-file met elkaar in sync zijn.
Dit commando is vergelijkbaar met !chksym.
!lmi
!lmi
- Staat voor Loaded Module Info.
Voorbeeld:lmi Notepad
laat allerlei info over de geladen versie vanNotepad
en bijbehorende.PDB
zien.
!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
Dit zijn debugger meta commands. Hebben vooral te maken met instellingen van de debugger.
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. Is bv. nuttig als je een nieuw symbol path hebt ingesteld.
.reload /f module_naam
- Forceer het herladen van de symbols voor module module_naam.
WinDbg sneltoetsen (shortcuts)
Snel- toets |
Betekenis |
---|---|
F5 | Go commando: programma gaat lopen (evt. tot eerstvolgende breakpoint). |
F10 | Spring over een functieaanroep heen (Step over) |
F11 | Ga in de functie. |
F6 | Koppel de debugger aan een lopend proces (Attach to proces) |
Open executable | Ctrl+E |
Source file path | Ctrl+P |
Breakpoint toggle | F9 |
Watch | Alt+2 |
Alt+3 | |
Memory | Alt+5 |
Registers | Alt+4 |
Call stack | Alt+6 |
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.
Links
- Introduction to Windbg Series 1 Part 1 - THE Debugger
- Deel 1 van een uitgebreide YouTube-serie over Windows Debugger. Ik heb wel de indruk dat het misschien beter is om eerst een soortgelijke serie over programmeren in C/C++ van dezelfde persoon te bekijken.
Reageer via E-mail (dalmolen@xs4all.nl)
Deze pagina is voor het laatst gewijzigd op: 25-01-23 21:57:31