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:


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:

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 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 voor ntoskrnl.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

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.

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 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

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 van Notepad 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)

Local variables
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.


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.


    Tweeten

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

Deze pagina is voor het laatst gewijzigd op: 25-01-23 21:57:31