Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Panduan ini menunjukkan kepada Anda cara menggunakan WinDbg untuk men-debug aplikasi mode pengguna. Anda mempraktikkan keterampilan debugging penting dengan menghubungkan ke proses yang sedang berjalan, menetapkan titik henti, dan mendiagnosis kerusakan aplikasi.
Dalam artikel ini:
- Pasang WinDbg ke Notepad dan jelajahi debugging dasar
- Melakukan debug pada aplikasi Anda sendiri dan menganalisis kerusakan
- Kuasai perintah debugging penting
Yang Anda pelajari
- Lampirkan WinDbg ke proses yang sedang berjalan
- Mengonfigurasi file simbol untuk hasil debug yang dapat dibaca
- Mengatur titik henti dan mengontrol eksekusi program
- Menganalisis kerusakan aplikasi
- Menavigasi utas dan tumpukan panggilan
Prasyarat
- WinDbg terinstal pada komputer Anda. Untuk petunjuk penginstalan, lihat Mengunduh dan menginstal debugger Windows WinDbg.
- Pemahaman dasar tentang antarmuka baris perintah
- (Opsional) Aplikasi yang dikompilasi dengan simbol debug untuk latihan kedua
Estimasi waktu selesai: 30 menit
Buka Notepad dan lampirkan WinDbg
Buka direktori penginstalan Anda, dan buka WinDbg.exe.
Pada menu File, pilih Luncurkan Eksekutabel. 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.
Konfigurasikan file simbol sehingga WinDbg dapat menampilkan fungsi dan nama variabel yang dapat dibaca.
Di baris perintah di dekat bagian bawah jendela WinDbg, masukkan perintah ini:
Outputnya mirip dengan contoh berikut:
Symbol search path is: srv* Expanded Symbol search path is: cache*;SRVApa itu simbol? File Simbol (PDB) berisi informasi tentang modul kode, seperti nama fungsi dan nama variabel. Tanpa simbol, Anda hanya melihat alamat memori.
Kemudian, masukkan perintah ini:
Perintah
.reloadmemberi tahu WinDbg untuk melakukan pencarian awal untuk menemukan dan memuat file simbol.Untuk melihat simbol untuk modul notepad.exe , masukkan perintah ini:
Nota
Jika tidak ada output yang muncul, masukkan
.reload /funtuk 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 berikut:
00007ff6`6e76b0a0 notepad!wWinMain (wWinMain) 00007ff6`6e783db0 notepad!wWinMainCRTStartup (wWinMainCRTStartup)Untuk meletakkan titik henti di
notepad!wWinMain, masukkan perintah ini:Untuk memverifikasi bahwa Anda mengatur titik henti, masukkan perintah ini:
Outputnya mirip dengan contoh berikut:
0 e Disable Clear 00007ff6`6e76b0a0 0001 (0001) 0:**** notepad!wWinMainUntuk memulai proses Notepad, masukkan perintah ini:
Notepad berjalan hingga mencapai fungsi
WinMain, dan kemudian berpindah ke debugger.Breakpoint 0 hit notepad!wWinMain: 00007ff6`6e76b0a0 488bc4 mov rax,rspUntuk melihat daftar modul kode yang saat ini dimuat dalam proses Notepad, masukkan perintah ini:
Outputnya mirip dengan contoh berikut:
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:
Outputnya mirip dengan contoh berikut:
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+0x21Untuk memulai Notepad lagi, masukkan perintah ini:
Depan: Anda akan memutuskan eksekusi dan menjelajahi modul yang dimuat.
Untuk membuka Notepad, pada menu File, pilih Break.
Untuk mengatur dan memverifikasi titik henti di
ZwWriteFile, masukkan perintah ini:Untuk memulai Notepad lagi, masukkan g. Di jendela Notepad, masukkan beberapa teks. Pada menu File
, pilih kSimpan . Kode yang berjalan mengalami masalah ketika mencapaiZwCreateFile. Masukkan perintahuntuk melihat jejak tumpukan.
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.Untuk melihat daftar semua thread dalam proses Notepad, masukkan perintah ini: (gunakan simbol tilde).
Outputnya mirip dengan contoh berikut:
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 UnfrozenDalam contoh ini, 14 utas memiliki indeks 0 hingga 13.
Untuk melihat jejak tumpukan untuk utas 0, masukkan perintah berikut:
Outputnya mirip dengan contoh berikut:
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+0xdaUntuk keluar dari penelusuran kesalahan dan keluar dari proses Notepad, masukkan perintah ini:
Buka aplikasi Anda sendiri dan lampirkan WinDbg
Misalnya, asumsikan bahwa Anda 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 dalam C:\MyApp\MyApp and that the target machine compiled MyApp.exe.
Buka WinDbg.
Pada menu File, pilih Luncurkan Eksekutabel. Dalam dialog Luncurkan yang Dapat Dieksekusi , buka C:\MyApp\x64\Debug. Untuk Nama file , masukkan MyApp.exe. Pilih Buka.
Masukkan perintah ini:
.sympath+ C:\MyApp\x64\Debug
Perintah ini memberi tahu WinDbg tempat menemukan simbol dan kode sumber untuk aplikasi Anda. Dalam hal ini, Anda tidak perlu mengatur lokasi kode sumber dengan menggunakan .srcpath karena simbol memiliki jalur yang sepenuhnya memenuhi syarat ke file sumber.
Masukkan perintah ini:
bu MyApp! utama
Aplikasi Anda masuk ke dalam debugger ketika mencapai fungsi
main.WinDbg menampilkan kode sumber Anda dan jendela Perintah.
Pada menu Debug
, pilih Masuk ke (atau pilih F11). Lanjutkan langkah hingga Anda masuk keMyFunction. Saat Anda masuk ke barisy = x / p2, aplikasi Anda mengalami crash dan masuk ke debugger.Outputnya mirip dengan contoh berikut:
(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=00000000Masukkan perintah ini:
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; ...
Langkah selanjutnya
Setelah men-debug aplikasi sistem dan kode Anda sendiri, Anda siap untuk menjelajahi skenario penelusuran kesalahan yang lebih canggih:
- Mulai menggunakan WinDbg (mode kernel) - Men-debug kernel dan driver Windows
- Operasi debugger - Pelajari tentang konsep operasi debugger
- Teknik penelusuran kesalahan - Menjelajahi metode penelusuran kesalahan tingkat lanjut
Ringkasan perintah
Berikut adalah perintah penting yang Anda gunakan dalam tutorial ini:
Penyiapan dan simbol:
- .sympath (Atur Jalur Simbol) - Mengonfigurasi di mana WinDbg menemukan file simbol
- .reload (Reload Module) - Muat file simbol
Mengontrol eksekusi:
- g (Go) - Lanjutkan eksekusi program
- bu (Atur Titik Henti) - Jeda eksekusi pada fungsi tertentu
-
Step Into(F11) - Jalankan satu instruksi dan masuk ke fungsi
Memeriksa program Anda:
- x (Periksa Simbol) - Mencantumkan fungsi dan variabel
- lm (Daftar Modul yang Dimuat) - Tampilkan semua DLL dan executable yang dimuat
- k (Tampilkan Stack Backtrace) - Lihat tumpukan panggilan
- ~ (Status Utas) - Daftar semua utas
- !analyze -v - Menganalisis crash secara otomatis
Referensi:
- bl (Daftar Titik Henti)
- ~s (Atur Alur Saat Ini)
- .sympath+
- .srcpath (Atur Jalur Sumber)
- qd (Keluar dan Lepaskan)
Lihat juga
Mulai menggunakan WinDbg (mode kernel)