Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Deze handleiding laat zien hoe u WinDbg gebruikt om fouten in toepassingen in de gebruikersmodus op te sporen. U oefent essentiële foutopsporingsvaardigheden door het koppelen aan een actief proces, het instellen van onderbrekingspunten en het diagnosticeren van toepassingscrashes.
In dit artikel:
- WinDbg koppelen aan Kladblok en eenvoudige foutopsporing verkennen
- Fouten opsporen in uw eigen toepassing en een crash analyseren
- Beheers essentiële foutopsporingscommando's.
Wat u leert
- WinDbg koppelen aan een actief proces
- Symboolbestanden configureren voor leesbare foutopsporingsuitvoer
- Onderbrekingspunten instellen en programma-uitvoering beheren
- Applicatiecrashes analyseren
- Navigeren in threads en aanroepstacks
Vereiste voorwaarden
- WinDbg geïnstalleerd op uw computer. Zie Het WinDbg Windows-foutopsporingsprogramma downloaden en installeren voor installatie-instructies.
- Basiskennis van opdrachtregelinterfaces
- (Optioneel) Een gecompileerde toepassing met foutopsporingssymbolen voor de tweede oefening
Geschatte tijd die moet worden voltooid: 30 minuten
Kladblok openen en WinDbg koppelen
Ga naar de installatiemap en open WinDbg.exe.
Selecteer in het menu Bestand de optie Start uitvoerbare. Ga in het dialoogvenster Uitvoerbaar starten naar de map met notepad.exe. (Het notepad.exe bestand bevindt zich meestal in
C:\Windows\System32.) Voer bij Bestandsnaamnotepad.exein. Selecteer openen.
Configureer symboolbestanden zodat WinDbg leesbare functie- en variabelenamen kan weergeven.
Voer in de opdrachtregel onder aan het WinDbg-venster deze opdracht in:
De uitvoer is vergelijkbaar met het volgende voorbeeld:
Symbol search path is: srv* Expanded Symbol search path is: cache*;SRVWat zijn symbolen? Symboolbestanden (PDB) bevatten informatie over codemodules, zoals functienamen en variabelenamen. Zonder symbolen ziet u alleen geheugenadressen.
Voer vervolgens deze opdracht in:
De opdracht
.reloadvertelt WinDbg om de eerste zoekopdracht uit te voeren om symboolbestanden te zoeken en te laden.Als u de symbolen voor de modulenotepad.exe wilt zien, voert u deze opdracht in:
Notitie
Als er geen uitvoer wordt weergegeven, voert u
.reload /fin om de symboolbelasting te forceren. Gebruik !sym luidruchtig om aanvullende informatie over het laden van symbolen weer te geven.Als u symbolen wilt zien in de notepad.exe module die deze bevatten
main, gebruikt u de opdracht Symbolen onderzoeken om modules weer te geven die overeenkomen met het masker:x notepad!wWin*De uitvoer is vergelijkbaar met het volgende voorbeeld:
00007ff6`6e76b0a0 notepad!wWinMain (wWinMain) 00007ff6`6e783db0 notepad!wWinMainCRTStartup (wWinMainCRTStartup)Als u een onderbrekingspunt op
notepad!wWinMainwilt plaatsen, voert u deze opdracht in:Voer deze opdracht in om te controleren of u het onderbrekingspunt hebt ingesteld:
De uitvoer is vergelijkbaar met het volgende voorbeeld:
0 e Disable Clear 00007ff6`6e76b0a0 0001 (0001) 0:**** notepad!wWinMainVoer dit commando in om het Kladblok-proces te starten:
Kladblok wordt uitgevoerd totdat het bij de
WinMain-functie komt en vervolgens in het foutopsporingsprogramma wordt ingebroken.Breakpoint 0 hit notepad!wWinMain: 00007ff6`6e76b0a0 488bc4 mov rax,rspAls u een lijst met codemodules wilt zien die momenteel zijn geladen in het Kladblok-proces, voert u deze opdracht in:
De uitvoer is vergelijkbaar met het volgende voorbeeld:
0:000> lm start end module name 00007ff6`6e760000 00007ff6`6e798000 notepad (pdb symbols) C:\ProgramData\Dbg\sym\notepad.pdb\BC04D9A431EDE299D4625AD6201C8A4A1\notepad.pdb 00007ff8`066a0000 00007ff8`067ab000 gdi32full (deferred) 00007ff8`067b0000 00007ff8`068b0000 ucrtbase (deferred) 00007ff8`06a10000 00007ff8`06aad000 msvcp_win (deferred) 00007ff8`06ab0000 00007ff8`06ad2000 win32u (deferred) 00007ff8`06b40000 00007ff8`06e08000 KERNELBASE (deferred) 00007ff8`07220000 00007ff8`072dd000 KERNEL32 (deferred) 00007ff8`07420000 00007ff8`07775000 combase (deferred) 00007ff8`07820000 00007ff8`079c0000 USER32 (deferred) 00007ff8`079c0000 00007ff8`079f0000 IMM32 (deferred) 00007ff8`07c00000 00007ff8`07c2a000 GDI32 (deferred) 00007ff8`08480000 00007ff8`085ab000 RPCRT4 (deferred) 00007ff8`085b0000 00007ff8`0864e000 msvcrt (deferred) 00007ff8`08c40000 00007ff8`08cee000 shcore (deferred) 00007ff8`08db0000 00007ff8`08fa5000 ntdll (pdb symbols) C:\ProgramData\Dbg\sym\ntdll.pdb\53F12BFE149A2F50205C8D5D66290B481\ntdll.pdb 00007fff`f8580000 00007fff`f881a000 COMCTL32 (deferred)Als u een stacktracering wilt zien, voert u deze opdracht in:
De uitvoer is vergelijkbaar met het volgende voorbeeld:
0:000> k 00 000000c8`2647f708 00007ff6`6e783d36 notepad!wWinMain 01 000000c8`2647f710 00007ff8`07237034 notepad!__scrt_common_main_seh+0x106 02 000000c8`2647f750 00007ff8`08e02651 KERNEL32!BaseThreadInitThunk+0x14 03 000000c8`2647f780 00000000`00000000 ntdll!RtlUserThreadStart+0x21Als u Kladblok opnieuw wilt starten, voert u deze opdracht in:
Volgend: U verbreekt de uitvoering en verkent de geladen modules.
Om in Kladblok een scheidingspunt toe te voegen, gaat u naar het menu Bestand en selecteert u Scheiding.
Voer de volgende opdrachten in om een onderbrekingspunt in
ZwWriteFilein te stellen en te controleren:Om Kladblok opnieuw te starten, voert u g in. Voer in het kladblokvenster tekst in. Op het menu Bestand, selecteer Opslaan. De actieve code crasht bij
ZwCreateFile. Voer de opdracht k in om de stacktracering te zien.
In het WinDbg-venster, links van de opdrachtregel, worden de processor- en threadnummers weergegeven. In dit voorbeeld is het huidige processornummer 0 en is het huidige threadnummer 11 (
0:011>). In het venster wordt de stacktracering weergegeven voor thread 11 die wordt uitgevoerd op processor 0.Als u een lijst met alle threads in het Kladblok-proces wilt zien, voert u het volgende commando in (de tilde):
De uitvoer is vergelijkbaar met het volgende voorbeeld:
0:011> ~ 0 Id: 5500.34d8 Suspend: 1 Teb: 000000c8`262c4000 Unfrozen 1 Id: 5500.3960 Suspend: 1 Teb: 000000c8`262c6000 Unfrozen 2 Id: 5500.5d68 Suspend: 1 Teb: 000000c8`262c8000 Unfrozen 3 Id: 5500.4c90 Suspend: 1 Teb: 000000c8`262ca000 Unfrozen 4 Id: 5500.4ac4 Suspend: 1 Teb: 000000c8`262cc000 Unfrozen 5 Id: 5500.293c Suspend: 1 Teb: 000000c8`262ce000 Unfrozen 6 Id: 5500.53a0 Suspend: 1 Teb: 000000c8`262d0000 Unfrozen 7 Id: 5500.3ca4 Suspend: 1 Teb: 000000c8`262d4000 Unfrozen 8 Id: 5500.808 Suspend: 1 Teb: 000000c8`262da000 Unfrozen 10 Id: 5500.3940 Suspend: 1 Teb: 000000c8`262dc000 Unfrozen . 11 Id: 5500.28b0 Suspend: 1 Teb: 000000c8`262de000 Unfrozen 12 Id: 5500.12bc Suspend: 1 Teb: 000000c8`262e0000 Unfrozen 13 Id: 5500.4c34 Suspend: 1 Teb: 000000c8`262e2000 UnfrozenIn dit voorbeeld bevatten 14 threads indexen 0 tot en met 13.
Als u de stacktracering voor thread 0 wilt bekijken, voert u de volgende opdrachten in:
De uitvoer is vergelijkbaar met het volgende voorbeeld:
0:011> ~0s 0:011> ~0s win32u!NtUserGetProp+0x14: 00007ff8`06ab1204 c3 ret 0:000> k # Child-SP RetAddr Call Site 00 000000c8`2647bd08 00007ff8`07829fe1 win32u!NtUserGetProp+0x14 01 000000c8`2647bd10 00007fff`f86099be USER32!GetPropW+0xd1 02 000000c8`2647bd40 00007ff8`07d12f4d COMCTL32!DefSubclassProc+0x4e 03 000000c8`2647bd90 00007fff`f8609aba SHELL32!CAutoComplete::_EditWndProc+0xb1 04 000000c8`2647bde0 00007fff`f86098b7 COMCTL32!CallNextSubclassProc+0x9a 05 000000c8`2647be60 00007ff8`0782e858 COMCTL32!MasterSubclassProc+0xa7 06 000000c8`2647bf00 00007ff8`0782de1b USER32!UserCallWinProcCheckWow+0x2f8 07 000000c8`2647c090 00007ff8`0782d68a USER32!SendMessageWorker+0x70b 08 000000c8`2647c130 00007ff8`07afa4db USER32!SendMessageW+0xdaOm debugging af te sluiten en los te koppelen van het Kladblok-proces, voert u deze opdracht in:
Open uw eigen toepassing en voeg WinDbg toe
Stel dat u deze kleine consoletoepassing hebt geschreven en gebouwd:
...
void MyFunction(long p1, long p2, long p3)
{
long x = p1 + p2 + p3;
long y = 0;
y = x / p2;
}
void main ()
{
long a = 2;
long b = 0;
MyFunction(a, b, 5);
}
Voor deze oefening wordt ervan uitgegaan dat de ingebouwde toepassing (MyApp.exe) en het symboolbestand (MyApp.pdb) zich in C:\MyApp\x64\Debug bevinden. Stel ook dat de broncode van de toepassing zich in C:\MyApp\MyApp and that the target machine compiled MyApp.exebevindt.
Open WinDbg.
Selecteer in het menu Bestand de optie Start uitvoerbare. Navigeer in het dialoogvenster Start uitvoerbaar bestand naar C:\MyApp\x64\Debug. Voer voor bestandsnaamMyApp.exein. Selecteer openen.
Voer deze opdrachten in:
.sympath+ C:\MyApp\x64\Debug
Deze opdrachten geven WinDbg aan waar symbolen en broncode voor uw toepassing moeten worden gevonden. In dit geval hoeft u de locatie van de broncode niet in te stellen met behulp van .srcpath , omdat de symbolen volledig gekwalificeerde paden naar de bronbestanden hebben.
Voer deze opdrachten in:
Uw applicatie breekt in in het foutopsporingsprogramma wanneer deze de
mainfunctie bereikt.WinDbg geeft uw broncode en het opdrachtvenster weer.
In het menu "Debug" selecteer Stap in (of selecteer F11). Ga door met stappen totdat u in
MyFunctionstapt. Wanneer u in de regely = x / p2stapt, loopt uw toepassing vast en breekt deze in het foutopsporingsprogramma in.De uitvoer is vergelijkbaar met het volgende voorbeeld:
(1450.1424): Integer divide-by-zero - code c0000094 (first chance) First chance exceptions are reported before any exception handling. This exception may be expected and handled. MyApp!MyFunction+0x44: 00007ff6`3be11064 f77c2428 idiv eax,dword ptr [rsp+28h] ss:00000063`2036f808=00000000Voer deze opdracht in:
WinDbg geeft een analyse van het probleem weer (in dit geval deling door 0).
FAULTING_IP: MyApp!MyFunction+44 [c:\myapp\myapp\myapp.cpp @ 7] 00007ff6`3be11064 f77c2428 idiv eax,dword ptr [rsp+28h] EXCEPTION_RECORD: ffffffffffffffff -- (.exr 0xffffffffffffffff) ExceptionAddress: 00007ff63be11064 (MyApp!MyFunction+0x0000000000000044) ExceptionCode: c0000094 (Integer divide-by-zero) ExceptionFlags: 00000000 NumberParameters: 0 ... STACK_TEXT: 00000063`2036f7e0 00007ff6`3be110b8 : ... : MyApp!MyFunction+0x44 00000063`2036f800 00007ff6`3be1141d : ... : MyApp!main+0x38 00000063`2036f840 00007ff6`3be1154e : ... : MyApp!__tmainCRTStartup+0x19d 00000063`2036f8b0 00007ffc`b1cf16ad : ... : MyApp!mainCRTStartup+0xe 00000063`2036f8e0 00007ffc`b1fc4629 : ... : KERNEL32!BaseThreadInitThunk+0xd 00000063`2036f910 00000000`00000000 : ... : ntdll!RtlUserThreadStart+0x1d STACK_COMMAND: dt ntdll!LdrpLastDllInitializer BaseDllName ;dt ntdll!LdrpFailureData ;.cxr 0x0 ;kb FOLLOWUP_IP: MyApp!MyFunction+44 [c:\myapp\myapp\myapp.cpp @ 7] 00007ff6`3be11064 f77c2428 idiv eax,dword ptr [rsp+28h] FAULTING_SOURCE_LINE: c:\myapp\myapp\myapp.cpp FAULTING_SOURCE_FILE: c:\myapp\myapp\myapp.cpp FAULTING_SOURCE_LINE_NUMBER: 7 FAULTING_SOURCE_CODE: 3: void MyFunction(long p1, long p2, long p3) 4: { 5: long x = p1 + p2 + p3; 6: long y = 0; > 7: y = x / p2; 8: } 9: 10: void main () 11: { 12: long a = 2; ...
Volgende stappen
Nadat u fouten hebt opgespoord in zowel een systeemtoepassing als uw eigen code, kunt u geavanceerdere foutopsporingsscenario's verkennen:
- Aan de slag met WinDbg (kernelmodus) - Fouten opsporen in Windows-kernel en -stuurprogramma's
- Debugger operatie - Leer meer over de concepten van debugger operaties
- Foutopsporingstechnieken - Geavanceerde methoden voor foutopsporing verkennen
Samenvatting van opdrachten
Dit zijn de essentiële commando's die u in deze tutorial gebruikt:
Configuratie en symbolen
- .sympath (Pad van symbool instellen) - Configureren waar WinDbg symboolbestanden vindt
- .reload (Module opnieuw laden) - Symboolbestanden laden
Uitvoering beheren:
- g (Go) - Uitvoering van programma voortzetten
- bu (Onderbrekingspunt instellen) - Uitvoering onderbreken bij een specifieke functie
-
Step Into(F11) - Voer één instructie uit en stap in functies
Uw programma inspecteren:
- x (Symbolen onderzoeken) - Lijstfuncties en -variabelen
- lm (Geladen modules weergeven) - Alle geladen DLL's en uitvoerbare bestanden weergeven
- k (Backtrace van aanroepstack weergeven) - De aanroepstack bekijken
- ~ (Threadstatus) - Alle threads weergeven
- !analyze -v - Crashes automatisch analyseren
Naslaginformatie:
- bl (onderbrekingspuntlijst)
- ~s (Actieve thread instellen)
- .sympath+
- .srcpath (bronpad instellen)
- qd (afsluiten en loskoppelen)
Zie ook
Aan de slag met WinDbg (kernelmodus)
bewerking voor foutopsporingsprogramma's
Het WinDbg Windows-foutopsporingsprogramma downloaden en installeren