Mulai menggunakan WinDbg (mode pengguna)

WinDbg adalah debugger mode kernel dan mode pengguna yang disertakan dalam Alat Debugging untuk Windows. Latihan langsung berikut dapat membantu Anda mulai menggunakan WinDbg sebagai debugger mode pengguna.

Untuk informasi tentang cara mendapatkan Alat Penelusuran Kesalahan untuk Windows, lihat Mengunduh dan menginstal debugger Windows WinDbg.

Setelah Anda menginstal alat penelusuran kesalahan, temukan direktori penginstalan untuk versi alat 64-bit (x64) dan 32-bit (x86). Misalnya:

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

Buka Notepad dan lampirkan WinDbg

  1. Buka direktori penginstalan Anda, dan buka WinDbg.exe.

  2. Pada menu File , pilih Luncurkan Yang Dapat Dieksekusi. Dalam dialog Luncurkan yang Dapat Dieksekusi, buka folder yang berisi notepad.exe. (File notepad.exe biasanya ada di C:\Windows\System32.) Untuk Nama file, masukkan notepad.exe. Pilih Buka.

    Screenshot of WinDbg with Notepad open.

  3. Di baris perintah di dekat bagian bawah jendela WinDbg, masukkan perintah ini:

    .sympath srv*

    Outputnya mirip dengan contoh ini:

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

    Jalur pencarian simbol memberi tahu WinDbg tempat mencari file simbol (PDB). Debugger memerlukan file simbol untuk mendapatkan informasi tentang modul kode, seperti nama fungsi dan nama variabel.

    Kemudian, masukkan perintah ini:

    .Reload

    .reload Perintah memberi tahu WinDbg untuk melakukan pencarian awal untuk menemukan dan memuat file simbol.

  4. Untuk melihat simbol untuk modul notepad.exe, masukkan perintah ini:

    x notepad!*

    Catatan

    Jika tidak ada output yang muncul, masukkan .reload /f untuk mencoba memaksa beban simbol. Gunakan !sym noisy untuk menampilkan informasi beban simbol tambahan.

    Untuk melihat simbol dalam modul notepad.exe yang berisi main, gunakan perintah periksa simbol untuk mencantumkan modul yang cocok dengan masker:

    x notepad!wWin*

    Outputnya mirip dengan contoh ini:

    00007ff6`6e76b0a0 notepad!wWinMain (wWinMain)
    00007ff6`6e783db0 notepad!wWinMainCRTStartup (wWinMainCRTStartup)
    
  5. Untuk menempatkan titik henti di notepad!wWinMain, masukkan perintah ini:

    bu notepad!wWinMain

    Untuk memverifikasi bahwa titik henti Anda telah diatur, masukkan perintah ini:

    Bl

    Outputnya mirip dengan contoh ini:

    0 e Disable Clear  00007ff6`6e76b0a0     0001 (0001)  0:**** notepad!wWinMain
    
  6. Untuk memulai proses Notepad, masukkan perintah ini:

    g

    Notepad berjalan sampai datang ke WinMain fungsi, dan kemudian masuk ke debugger.

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

    Untuk melihat daftar modul kode yang saat ini dimuat dalam proses Notepad, masukkan perintah ini:

    Lm

    Outputnya mirip dengan contoh ini:

    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)    
    

    Untuk melihat jejak tumpukan, masukkan perintah ini:

    k

    Outputnya mirip dengan contoh ini:

    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. Untuk memulai Notepad yang berjalan lagi, masukkan perintah ini:

    g

  8. Untuk memecah ke Notepad, pada menu File , pilih Putuskan.

  9. Untuk mengatur dan memverifikasi titik henti di ZwWriteFile, masukkan perintah ini:

    bu ntdll! ZwWriteFile

    Bl

  10. Untuk memulai Notepad yang berjalan lagi, masukkan g. Di jendela Notepad, masukkan beberapa teks. Pada menu File, pilih Simpan. Kode yang sedang berjalan memecah ketika datang ke ZwCreateFile. Masukkan perintah k untuk melihat jejak tumpukan.

    Screenshot of a stack trace in WinDbg.

    Di jendela WinDbg, di sebelah kiri baris perintah, nomor prosesor dan utas ditampilkan. Dalam contoh ini, nomor prosesor saat ini adalah 0, dan nomor utas saat ini adalah 11 (0:011>). Jendela menampilkan jejak tumpukan untuk utas 11 yang berjalan pada prosesor 0.

  11. Untuk melihat daftar semua utas dalam proses Notepad, masukkan perintah ini (tilde):

    ~

    Outputnya mirip dengan contoh ini:

    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
    

    Dalam contoh ini, 14 utas memiliki indeks 0 hingga 13.

  12. Untuk melihat jejak tumpukan untuk utas 0, masukkan perintah berikut:

    ~0s

    k

    Outputnya mirip dengan contoh ini:

    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. Untuk keluar dari penelusuran kesalahan dan melepaskan dari proses Notepad, masukkan perintah ini:

    Qd

Buka aplikasi Anda sendiri dan lampirkan WinDbg

Misalnya, asumsikan bahwa Anda telah menulis dan membangun aplikasi konsol kecil ini:

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

Untuk latihan ini, asumsikan bahwa aplikasi bawaan (MyApp.exe) dan file simbol (MyApp.pdb) berada di C:\MyApp\x64\Debug. Asumsikan juga bahwa kode sumber aplikasi berada di C:\MyApp\MyApp dan komputer target yang dikompilasi MyApp.exe.

  1. Buka WinDbg.

  2. Pada menu File , pilih Luncurkan Yang Dapat Dieksekusi. Dalam dialog Luncurkan yang Dapat Dieksekusi, buka C:\MyApp\x64\Debug. Untuk Nama file, masukkan MyApp.exe. Pilih Buka.

  3. Masukkan perintah ini:

    .symfix

    .sympath+ C:\MyApp\x64\Debug

    Perintah memberi tahu WinDbg tempat menemukan simbol dan kode sumber untuk aplikasi Anda. Dalam hal ini, lokasi kode sumber tidak perlu diatur dengan menggunakan .srcpath karena simbol memiliki jalur yang sepenuhnya memenuhi syarat ke file sumber.

  4. Masukkan perintah ini:

    .Reload

    bu MyApp!main

    g

    Aplikasi Anda masuk ke debugger ketika datang ke fungsinya main .

    WinDbg menampilkan kode sumber Anda dan jendela Perintah.

    Screenshot of source code displayed in WinDbg.

  5. Pada menu Debug , pilih Masuk ke ( atau pilih F11). Lanjutkan langkah hingga Anda masuk ke MyFunction. Saat Anda masuk ke baris y = x / p2, aplikasi Anda mengalami crash dan masuk ke debugger.

    Outputnya mirip dengan contoh ini:

    (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. Masukkan perintah ini:

    !analyze -v

    WinDbg menampilkan analisis masalah (dalam hal ini, pembagian dengan 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;
    ...
    

Ringkasan perintah

Baca juga

Mulai menggunakan WinDbg (mode kernel)

Operasi debugger

Teknik penelusuran kesalahan

Unduh dan instal debugger Windows WinDbg

Fitur WinDbg