Delen via


Aan de slag met WinDbg (gebruikersmodus)

WinDbg is een kernelmodus en foutopsporingsprogramma voor gebruikersmodus dat is opgenomen in Hulpprogramma's voor foutopsporing voor Windows. Met de volgende praktische oefeningen kunt u aan de slag met WinDbg als foutopsporingsprogramma in de gebruikersmodus.

Zie Download en installeer de WinDbg Windows-debuggervoor informatie over hoe u de foutopsporingsprogramma's voor Windows kunt verkrijgen.

Nadat u de hulpprogramma's voor foutopsporing hebt geïnstalleerd, zoekt u de installatiemappen voor de 64-bits (x64) en 64-bits ARM-versies van de hulpprogramma's. Bijvoorbeeld:

  • C:\Program Files (x86)\Windows Kits\10\Debuggers\x64
  • C:\Program Files (x86)\Windows Kits\10\Debuggers\arm64

Kladblok openen en WinDbg koppelen

  1. Ga naar de installatiemap en open WinDbg.exe.

  2. Selecteer in het menu Bestand de optie Start uitvoerbare. Ga in het dialoogvenster Start uitvoerbaar bestand naar de map die notepad.exebevat. (Het bestand notepad.exe bevindt zich meestal in C:\Windows\System32.) Voer voor bestandsnaamnotepad.exein. Selecteer openen.

    Schermopname van WinDbg met Kladblok geopend.

  3. Voer in de opdrachtregel onder aan het WinDbg-venster deze opdracht in:

    .sympath srv*

    De uitvoer is vergelijkbaar met dit voorbeeld:

    Symbol search path is: srv*
    Expanded Symbol search path is: cache*;SRV
    

    Het zoekpad voor symbolen vertelt WinDbg waar moet worden gezocht naar symboolbestanden (PDB). Het foutopsporingsprogramma heeft symboolbestanden nodig om informatie over codemodules op te halen, zoals functienamen en variabelenamen.

    Voer vervolgens deze opdracht in:

    .reload

    De opdracht .reload vertelt WinDbg om de eerste zoekopdracht uit te voeren om symboolbestanden te zoeken en te laden.

  4. Als u de symbolen voor de module notepad.exe wilt zien, voert u deze opdracht in:

    x kladblok!*

    Notitie

    Als er geen uitvoer wordt weergegeven, voert u .reload /f in om de symboolbelasting te forceren. Gebruik !sym luidruchtig om aanvullende informatie over het laden van symbolen weer te geven.

    Als u symbolen in de notepad.exe module wilt zien die mainbevatten, gebruikt u de symbolen opdracht om modules weer te geven die overeenkomen met het masker:

    x notepad!wWin*

    De uitvoer is vergelijkbaar met dit voorbeeld:

    00007ff6`6e76b0a0 notepad!wWinMain (wWinMain)
    00007ff6`6e783db0 notepad!wWinMainCRTStartup (wWinMainCRTStartup)
    
  5. Als u een onderbrekingspunt op notepad!wWinMainwilt plaatsen, voert u deze opdracht in:

    bu kladblok!wWinMain

    Voer deze opdracht in om te controleren of het onderbrekingspunt is ingesteld:

    bl

    De uitvoer is vergelijkbaar met dit voorbeeld:

    0 e Disable Clear  00007ff6`6e76b0a0     0001 (0001)  0:**** notepad!wWinMain
    
  6. Voer dit commando in om het Kladblok-proces te starten:

    g

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

    Als u een lijst met codemodules wilt zien die momenteel zijn geladen in het Kladblok-proces, voert u deze opdracht in:

    lm

    De uitvoer is vergelijkbaar met dit 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:

    k

    De uitvoer is vergelijkbaar met dit 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+0x21
    
  7. Als u Kladblok opnieuw wilt starten, voert u deze opdracht in:

    g

  8. Om in Kladblok een scheidingspunt toe te voegen, gaat u naar het menu Bestand en selecteert u Scheiding.

  9. Voer de volgende opdrachten in om een onderbrekingspunt in ZwWriteFilein te stellen en te controleren:

    ntdll!ZwWriteFile

    bl

  10. Als u Kladblok opnieuw wilt starten, voert u gin. 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.

    Schermopname van een stacktracering in WinDbg.

    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.

  11. 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 dit 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 Unfrozen
    

    In dit voorbeeld bevatten 14 threads indexen 0 tot en met 13.

  12. Als u de stacktracering voor thread 0 wilt bekijken, voert u de volgende opdrachten in:

    ~0s

    k

    De uitvoer is vergelijkbaar met dit 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+0xda
    
  13. Om debugging af te sluiten en los te koppelen van het Kladblok-proces, voert u deze opdracht in:

    qd

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.

  1. Open WinDbg.

  2. Selecteer in het menu BestandUitvoerbarestarten. Ga in het dialoogvenster Uitvoerbare bestand uitvoeren naar C:\MyApp\x64\Debug. Voer voor bestandsnaamMyApp.exein. Selecteer openen.

  3. Voer deze opdrachten in:

    .symfix

    .sympath+ C:\MyApp\x64\Debug

    De opdrachten vertellen WinDbg waar symbolen en broncode voor uw toepassing moeten worden gevonden. In dit geval hoeft de locatie van de broncode niet te worden ingesteld met behulp van .srcpath omdat de symbolen volledig gekwalificeerde paden naar de bronbestanden hebben.

  4. Voer deze opdrachten in:

    .reload

    bu MyApp!main

    g

    Uw toepassing breekt in het foutopsporingsprogramma in als het gaat om de main functie.

    WinDbg geeft uw broncode en het opdrachtvenster weer.

    schermopname van de broncode die wordt weergegeven in WinDbg.

  5. In het menu "Debug" selecteer Stap in (of selecteer F11). Ga door met stappen totdat u in MyFunctionstapt. Wanneer u in de regel y = x / p2stapt, loopt uw toepassing vast en breekt deze in het foutopsporingsprogramma in.

    De uitvoer is vergelijkbaar met dit 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=00000000
    
  6. Voer deze opdracht in:

    !analyze -v

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

Samenvatting van opdrachten

Zie ook

Aan de slag met WinDbg (kernelmodus)

bewerking voor foutopsporingsprogramma's

foutopsporingstechnieken

Het WinDbg Windows-foutopsporingsprogramma downloaden en installeren

WinDbg-functies