Kom igång med WinDbg (användarläge)

Den här guiden visar hur du använder WinDbg för att felsöka användarlägesprogram. Du övar på grundläggande felsökningsfärdigheter genom att ansluta till en process som körs, ange brytpunkter och diagnostisera programkrascher.

I den här artikeln:

  • Koppla WinDbg till Anteckningar och utforska grundläggande felsökning
  • Felsöka ditt eget program och analysera en krasch
  • Grundläggande felsökningskommandon

Det här lär du dig

  • Koppla WinDbg till en process som körs
  • Konfigurera symbolfiler för läsbara felsökningsutdata
  • Ange brytpunkter och kontrollera programkörning
  • Analysera programkrascher
  • Navigera i trådar och anropsstackar

Förutsättningar

Beräknad tid att slutföra: 30 minuter

Öppna Anteckningsblock och bifoga WinDbg

  1. Gå till installationskatalogen och öppna WinDbg.exe.

  2. På menyn Arkiv väljer du Starta körbar fil. I dialogrutan Starta körbar går du till mappen som innehåller notepad.exe. (Filen notepad.exe finns vanligtvis i C:\Windows\System32.) Som Filnamn anger dunotepad.exe. Välj Öppna.

    Skärmbild av WinDbg med Notepad öppet.

  3. Konfigurera symbolfiler så att WinDbg kan visa läsbara funktions- och variabelnamn.

    På kommandoraden längst ned i WinDbg-fönstret anger du följande kommando:

    .sympath srv*

    Utdata ser ut ungefär så här:

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

    Vad är symboler? Symbolfiler (PDB) innehåller information om kodmoduler, till exempel funktionsnamn och variabelnamn. Utan symboler ser du bara minnesadresser.

    Ange sedan följande kommando:

    .Reload

    Kommandot .reload instruerar WinDbg att göra sin första sökning för att hitta och läsa in symbolfiler.

  4. Om du vill se symbolerna för modulennotepad.exe anger du följande kommando:

    x Anteckningar!*

    Nota

    Om inga utdata visas anger du .reload /f för att försöka framtvinga symbolbelastningen. Använd kommandot !sym noisy för att visa mer information om inläsning av symboler.

    Om du vill se symboler i modulennotepad.exe som innehåller mainanvänder du kommandot granska symboler för att lista moduler som matchar masken:

    x notepad!wWin*

    Utdata ser ut ungefär så här:

    00007ff6`6e76b0a0 notepad!wWinMain (wWinMain)
    00007ff6`6e783db0 notepad!wWinMainCRTStartup (wWinMainCRTStartup)
    
  5. Om du vill placera en brytpunkt på notepad!wWinMainanger du följande kommando:

    bu Notepad!wWinMain

    Kontrollera att du har angett brytpunkten genom att ange följande kommando:

    bl

    Utdata ser ut ungefär så här:

    0 e Disable Clear  00007ff6`6e76b0a0     0001 (0001)  0:**** notepad!wWinMain
    
  6. Om du vill starta Anteckningar-processen anger du följande kommando:

    g

    Anteckningsblock körs tills det kommer till funktionen WinMain och sedan stoppas det i debuggern.

    Breakpoint 0 hit
    notepad!wWinMain:
    00007ff6`6e76b0a0 488bc4          mov     rax,rsp
    

    Om du vill se en lista över kodmoduler som för närvarande läses in i Anteckningar-processen anger du följande kommando:

    Lm

    Utdata ser ut ungefär så här:

    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)    
    

    Om du vill se en stackspårning anger du följande kommando:

    k

    Utdata ser ut ungefär så här:

    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. Om du vill starta Anteckningar igen anger du följande kommando:

    g

    Nästa: Du stoppar exekveringen och utforskar de inlästa modulerna.

  8. Om du vill öppna Anteckningar går du till menyn Arkiv och väljer Avbryt.

  9. Ange följande kommandon för att ange och verifiera en brytpunkt vid ZwWriteFile:

    bu ntdll! ZwWriteFile

    bl

  10. Om du vill starta Anteckningar igen anger du g. I fönstret Anteckningar anger du text. På menyn Arkiv väljer du Spara. Koden som körs stöter på problem när den handlar om ZwCreateFile. Ange kommandot k för att se stackspårningen.

    Skärmbild av en stackspårning i WinDbg.

    I WinDbg-fönstret, till vänster om kommandoraden, visas processor- och trådnumren. I det här exemplet är det aktuella processornumret 0 och det aktuella trådnumret är 11 (0:011>). Fönstret visar stackspårningen för tråd 11 som körs på processor 0.

  11. Om du vill se en lista över alla trådar i Anteckningar-processen anger du det här kommandot (tilde):

    ~

    Utdata ser ut ungefär så här:

    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
    

    I det här exemplet har 14 trådar index 0 till och med 13.

  12. Om du vill titta på stackspårningen för tråd 0 anger du följande kommandon:

    ~0s

    k

    Utdata ser ut ungefär så här:

    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 du vill avsluta felsökningen och koppla från Notepad-processen anger du följande kommando:

    Qd

Öppna ditt eget program och bifoga WinDbg

Anta till exempel att du skrev och skapade det här lilla konsolprogrammet:

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

I den här övningen antar du att det byggda programmet (MyApp.exe) och symbolfilen (MyApp.pdb) finns i C:\MyApp\x64\Debug. Anta också att programmets källkod finns i C:\MyApp\MyApp and that the target machine compiled MyApp.exe.

  1. Öppna WinDbg.

  2. På menyn Arkiv väljer du Starta körbar fil. I dialogrutan Starta körbar går du till C:\MyApp\x64\Debug. För Filnamnanger du MyApp.exe. Välj Öppna.

  3. Ange följande kommandon:

    .symfix

    .sympath+ C:\MyApp\x64\Debug

    Dessa kommandon talar om för WinDbg var du hittar symboler och källkod för ditt program. I det här fallet behöver du inte ange källkodsplatsen med hjälp av .srcpath eftersom symbolerna har fullständigt kvalificerade sökvägar till källfilerna.

  4. Ange följande kommandon:

    .Reload

    bu MyApp!main

    g

    Programmet bryter sig in i felsökningsprogrammet när det når sin main funktion.

    WinDbg visar källkoden och kommandofönstret.

    Skärmbild av källkod som visas i WinDbg.

  5. På menyn Felsöka väljer du Stega in i (eller väljer F11). Fortsätt att stega tills du kliver in i MyFunction. När du går in på raden y = x / p2kraschar programmet och bryter sig in i felsökningsprogrammet.

    Utdata ser ut ungefär så här:

    (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. Ange följande kommando:

    !analyze -v

    WinDbg visar en analys av problemet (i det här fallet division med 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;
    ...
    

Nästa steg

När du har felsökt både ett systemprogram och din egen kod är du redo att utforska mer avancerade felsökningsscenarier:

Sammanfattning av kommandon

Här är de viktigaste kommandona som du använder i den här självstudien:

Installation och symboler:

Kontrollera körning:

  • g (Go) – Fortsätt programkörningen
  • bu (Ange brytpunkt) – Pausa körningen vid en specifik funktion
  • Step Into (F11) – Kör en instruktion och gå in i funktioner

Inspektera ditt program:

Referens:

Se även

Kom igång med WinDbg (kernelläge)

felsökningsåtgärd

felsökningstekniker

Ladda ned och installera WinDbg Windows-felsökningsprogrammet

WinDbg-funktioner