Mulai menggunakan WinDbg (mode kernel)
WinDbg adalah debugger mode kernel dan mode pengguna yang disertakan dalam Alat Debugging untuk Windows. Artikel ini menyediakan latihan untuk membantu Anda mulai menggunakan WinDbg sebagai debugger mode kernel.
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). Contohnya:
- C:\Program Files (x86)\Windows Kits\10\Debuggers\x64
- C:\Program Files (x86)\Windows Kits\10\Debuggers\x86
Menyiapkan penelusuran kesalahan mode kernel
Lingkungan penelusuran kesalahan mode kernel biasanya memiliki dua komputer, komputer host, dan komputer target. Debugger berjalan pada komputer host, dan kode yang di-debug berjalan pada komputer target. Host dan target dihubungkan oleh kabel debug.
Debugger Windows mendukung jenis kabel berikut:
- Ethernet
- USB 3.0
- Serial (juga disebut modem null)
Untuk kecepatan dan keandalan, Anda harus menggunakan kabel Ethernet dengan hub jaringan lokal. Diagram berikut mengilustrasikan host dan komputer target yang tersambung untuk penelusuran kesalahan dengan kabel Ethernet.
Opsi untuk versi Windows yang lebih lama adalah menggunakan kabel langsung, seperti kabel serial.
Untuk detail tentang cara menyiapkan host dan komputer target, lihat Menyiapkan debugging mode kernel secara manual.
Komputer virtual - VM
Untuk informasi tentang menyambungkan debugger ke komputer virtual Hyper-V, lihat Menyiapkan penelusuran kesalahan jaringan komputer virtual - KDNET.
Membuat sesi debugging mode kernel
Setelah menyiapkan host dan komputer target dan menyambungkannya dengan kabel debug, Anda dapat membuat sesi debugging mode kernel. Ikuti instruksi dalam topik yang sama dengan yang Anda gunakan untuk menyiapkan. Misalnya, jika Anda memutuskan untuk menyiapkan host dan komputer target Anda untuk penelusuran kesalahan melalui Ethernet, Anda dapat menemukan instruksi untuk membuat sesi debugging mode kernel di artikel berikut:
Mulai menggunakan WinDbg
Pada komputer host, buka WinDbg dan buat sesi debugging mode kernel dengan komputer target.
Untuk membuka file CHM dokumentasi debugger, buka menu Bantuan dan pilih Konten. Dokumentasi debugger juga tersedia secara online di Alat Debugging untuk Windows.
Saat Anda membuat sesi debugging mode kernel, WinDbg mungkin masuk ke komputer target secara otomatis. Jika WinDbg tidak masuk, buka menu Debug dan pilih Putuskan.
Di baris perintah di bagian bawah jendela WinDbg, masukkan perintah berikut:
Outputnya mirip dengan contoh berikut:
Symbol search path is: srv* Expanded Symbol search path is: cache*;SRV*https://msdl.microsoft.com/download/symbols
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.
Masukkan perintah berikut, yang memberi tahu WinDbg untuk melakukan temuan awal dan pemuatan file simbol:
Untuk melihat daftar modul yang dimuat, masukkan perintah berikut:
Outputnya mirip dengan contoh berikut:
0:000>3: kd> lm start end module name fffff800`00000000 fffff800`00088000 CI (deferred) ... fffff800`01143000 fffff800`01151000 BasicRender (deferred) fffff800`01151000 fffff800`01163000 BasicDisplay (deferred) ... fffff800`02a0e000 fffff800`03191000 nt (pdb symbols) C:\...\ntkrnlmp.pdb fffff800`03191000 fffff800`03200000 hal (deferred) ...
Untuk memulai komputer target yang berjalan, masukkan perintah berikut:
Untuk masuk lagi, buka menu Debug dan pilih Putuskan.
Masukkan perintah berikut untuk memeriksa
_FILE_OBJECT
jenis data dalamnt
modul:Outputnya mirip dengan contoh berikut:
0:000>0: kd> dt nt!_FILE_OBJECT +0x000 Type : Int2B +0x002 Size : Int2B +0x008 DeviceObject : Ptr64 _DEVICE_OBJECT +0x010 Vpb : Ptr64 _VPB ... +0x0c0 IrpList : _LIST_ENTRY +0x0d0 FileObjectExtension : Ptr64 Void
Masukkan perintah berikut untuk memeriksa beberapa simbol dalam
nt
modul:Outputnya mirip dengan contoh berikut:
0:000>0: kd> x nt!*CreateProcess* fffff800`030821cc nt!ViCreateProcessCallbackInternal (<no parameter info>) ... fffff800`02e03904 nt!MmCreateProcessAddressSpace (<no parameter info>) fffff800`02cece00 nt!PspCreateProcessNotifyRoutine = <no type information> ...
Masukkan perintah berikut untuk meletakkan titik henti di MmCreateProcessAddressSpace:
bu nt! MmCreateProcessAddressSpace
Untuk memverifikasi bahwa titik henti diatur, masukkan perintah berikut:
Outputnya mirip dengan contoh berikut:
0:000>0: kd> bu nt!MmCreateProcessAddressSpace 0: kd> bl 0 e fffff800`02e03904 0001 (0001) nt!MmCreateProcessAddressSpace
Masukkan g untuk membiarkan komputer target berjalan.
Jika komputer target tidak segera masuk ke debugger, lakukan beberapa tindakan pada komputer target (misalnya, buka Notepad). Komputer target akan masuk ke debugger ketika MmCreateProcessAddressSpace dipanggil. Untuk melihat jejak tumpukan, masukkan perintah berikut:
Outputnya mirip dengan contoh berikut:
0:000>2: kd> k Child-SP RetAddr Call Site ffffd000`224b4c88 fffff800`02d96834 nt!MmCreateProcessAddressSpace ffffd000`224b4c90 fffff800`02dfef17 nt!PspAllocateProcess+0x5d4 ffffd000`224b5060 fffff800`02b698b3 nt!NtCreateUserProcess+0x55b ... 000000d7`4167fbb0 00007ffd`14b064ad KERNEL32!BaseThreadInitThunk+0xd 000000d7`4167fbe0 00000000`00000000 ntdll!RtlUserThreadStart+0x1d
Pada menu Tampilan , pilih Pembongkaran.
Pada menu Debug , pilih Langkah Di Atas (atau tekan F10). Masukkan perintah langkah beberapa kali lagi saat Anda menonton jendela Pembongkaran.
Hapus titik henti Anda dengan memasukkan perintah berikut:
Masukkan g untuk membiarkan komputer target berjalan. Untuk memecah lagi, buka menu Debug dan pilih Hentian, atau tekan CTRL-Break.
Untuk melihat daftar semua proses, masukkan perintah berikut:
Outputnya mirip dengan contoh berikut:
0:000>0: kd> !process 0 0 **** NT ACTIVE PROCESS DUMP **** PROCESS ffffe000002287c0 SessionId: none Cid: 0004 Peb: 00000000 ParentCid: 0000 DirBase: 001aa000 ObjectTable: ffffc00000003000 HandleCount: <Data Not Accessible> Image: System PROCESS ffffe00001e5a900 SessionId: none Cid: 0124 Peb: 7ff7809df000 ParentCid: 0004 DirBase: 100595000 ObjectTable: ffffc000002c5680 HandleCount: <Data Not Accessible> Image: smss.exe ... PROCESS ffffe00000d52900 SessionId: 1 Cid: 0910 Peb: 7ff669b8e000 ParentCid: 0a98 DirBase: 3fdba000 ObjectTable: ffffc00007bfd540 HandleCount: <Data Not Accessible> Image: explorer.exe
Salin alamat satu proses, dan masukkan perintah berikut:
Misalnya:
!process ffffe00000d5290 2
Output menunjukkan utas dalam proses.
0:000>0:000>0: kd> !process ffffe00000d52900 2 PROCESS ffffe00000d52900 SessionId: 1 Cid: 0910 Peb: 7ff669b8e000 ParentCid: 0a98 DirBase: 3fdba000 ObjectTable: ffffc00007bfd540 HandleCount: Image: explorer.exe THREAD ffffe00000a0d880 Cid 0910.090c Teb: 00007ff669b8c000 ffffe00000d57700 SynchronizationEvent THREAD ffffe00000e48880 Cid 0910.0ad8 Teb: 00007ff669b8a000 ffffe00000d8e230 NotificationEvent ffffe00000cf6870 Semaphore Limit 0xffff ffffe000039c48c0 SynchronizationEvent ... THREAD ffffe00000e6d080 Cid 0910.0cc0 Teb: 00007ff669a10000 ffffe0000089a300 QueueObject
Salin alamat satu utas, dan masukkan perintah berikut:
Misalnya:
!thread ffffe00000e6d080
Output menunjukkan informasi tentang utas individual.
0: kd> !thread ffffe00000e6d080 THREAD ffffe00000e6d080 Cid 0910.0cc0 Teb: 00007ff669a10000 Win32Thread: 0000000000000000 WAIT: ... ffffe0000089a300 QueueObject Not impersonating DeviceMap ffffc000034e7840 Owning Process ffffe00000d52900 Image: explorer.exe Attached Process N/A Image: N/A Wait Start TickCount 13777 Ticks: 2 (0:00:00:00.031) Context Switch Count 2 IdealProcessor: 1 UserTime 00:00:00.000 KernelTime 00:00:00.000 Win32 Start Address ntdll!TppWorkerThread (0x00007ffd14ab2850) Stack Init ffffd00021bf1dd0 Current ffffd00021bf1580 Base ffffd00021bf2000 Limit ffffd00021bec000 Call 0 Priority 13 BasePriority 13 UnusualBoost 0 ForegroundBoost 0 IoPriority 2 PagePriority 5 ...
Untuk melihat semua simpul perangkat di pohon perangkat Plug and Play, masukkan perintah berikut:
0:000>0: kd> !devnode 0 1 Dumping IopRootDeviceNode (= 0xffffe000002dbd30) DevNode 0xffffe000002dbd30 for PDO 0xffffe000002dc9e0 InstancePath is "HTREE\ROOT\0" State = DeviceNodeStarted (0x308) Previous State = DeviceNodeEnumerateCompletion (0x30d) DevNode 0xffffe000002d9d30 for PDO 0xffffe000002daa40 InstancePath is "ROOT\volmgr\0000" ServiceName is "volmgr" State = DeviceNodeStarted (0x308) Previous State = DeviceNodeEnumerateCompletion (0x30d) DevNode 0xffffe00001d49290 for PDO 0xffffe000002a9a90 InstancePath is "STORAGE\Volume\{3007dfd3-df8d-11e3-824c-806e6f6e6963}#0000000000100000" ServiceName is "volsnap" TargetDeviceNotify List - f 0xffffc0000031b520 b 0xffffc0000008d0f0 State = DeviceNodeStarted (0x308) Previous State = DeviceNodeStartPostWork (0x307) ...
Untuk melihat simpul perangkat dan sumber daya perangkat kerasnya, masukkan perintah berikut:
0:000>... DevNode 0xffffe000010fa770 for PDO 0xffffe000010c2060 InstancePath is "PCI\VEN_8086&DEV_2937&SUBSYS_2819103C&REV_02\3&33fd14ca&0&D0" ServiceName is "usbuhci" State = DeviceNodeStarted (0x308) Previous State = DeviceNodeEnumerateCompletion (0x30d) TranslatedResourceList at 0xffffc00003c78b00 Version 1.1 Interface 0x5 Bus #0 Entry 0 - Port (0x1) Device Exclusive (0x1) Flags (0x131) - PORT_MEMORY PORT_IO 16_BIT_DECODE POSITIVE_DECODE Range starts at 0x3120 for 0x20 bytes Entry 1 - DevicePrivate (0x81) Device Exclusive (0x1) Flags (0000) - Data - {0x00000001, 0x00000004, 0000000000} Entry 2 - Interrupt (0x2) Shared (0x3) Flags (0000) - LEVEL_SENSITIVE Level 0x8, Vector 0x81, Group 0, Affinity 0xf ...
Untuk melihat simpul perangkat yang memiliki nama layanan disk, masukkan perintah berikut:
0: kd> !devnode 0 1 disk Dumping IopRootDeviceNode (= 0xffffe000002dbd30) DevNode 0xffffe0000114fd30 for PDO 0xffffe00001159610 InstancePath is "IDE\DiskST3250820AS_____________________________3.CHL___\5&14544e82&0&0.0.0" ServiceName is "disk" State = DeviceNodeStarted (0x308) Previous State = DeviceNodeEnumerateCompletion (0x30d) ...
Output dari !devnode 0 1 menunjukkan alamat objek perangkat fisik (PDO) untuk simpul. Salin alamat objek perangkat fisik (PDO), dan masukkan perintah berikut:
Misalnya:
<PdoAddress>!devstack 0xffffe00001159610
0:000>0: kd> !devstack 0xffffe00001159610 !DevObj !DrvObj !DevExt ObjectName ffffe00001d50040 \Driver\partmgr ffffe00001d50190 ffffe00001d51450 \Driver\disk ffffe00001d515a0 DR0 ffffe00001156e50 \Driver\ACPI ffffe000010d8bf0
Untuk mendapatkan informasi tentang disk.sys driver, masukkan perintah berikut:
0:000>0: kd> !drvobj disk 2 Driver object (ffffe00001d52680) is for: \Driver\disk DriverEntry: fffff800006b1270 disk!GsDriverEntry DriverStartIo: 00000000 DriverUnload: fffff800010b0b5c CLASSPNP!ClassUnload AddDevice: fffff800010aa110 CLASSPNP!ClassAddDevice Dispatch routines: [00] IRP_MJ_CREATE fffff8000106d160 CLASSPNP!ClassGlobalDispatch [01] IRP_MJ_CREATE_NAMED_PIPE fffff80002b0ab24 nt!IopInvalidDeviceRequest [02] IRP_MJ_CLOSE fffff8000106d160 CLASSPNP!ClassGlobalDispatch [03] IRP_MJ_READ fffff8000106d160 CLASSPNP!ClassGlobalDispatch ... [1b] IRP_MJ_PNP fffff8000106d160 CLASSPNP!ClassGlobalDispatch
Output menunjukkan
!drvobj
alamat rutinitas pengiriman. Contohnya,CLASSPNP!ClassGlobalDispatch
. Untuk mengatur dan memverifikasi titik henti diClassGlobalDispatch
, masukkan perintah berikut:bu CLASSPNP! ClassGlobalDispatch
Masukkan
g
untuk membiarkan komputer target berjalan.Jika komputer target tidak segera masuk ke debugger, lakukan beberapa tindakan pada komputer target (misalnya, buka Notepad dan simpan file). Komputer target akan masuk ke debugger ketika
ClassGlobalDispatch
dipanggil. Untuk melihat jejak tumpukan, masukkan perintah berikut:Outputnya mirip dengan contoh berikut:
2: kd> k Child-SP RetAddr Call Site ffffd000`21d06cf8 fffff800`0056c14e CLASSPNP!ClassGlobalDispatch ffffd000`21d06d00 fffff800`00f2c31d volmgr!VmReadWrite+0x13e ffffd000`21d06d40 fffff800`0064515d fvevol!FveFilterRundownReadWrite+0x28d ffffd000`21d06e20 fffff800`0064578b rdyboost!SmdProcessReadWrite+0x14d ffffd000`21d06ef0 fffff800`00fb06ad rdyboost!SmdDispatchReadWrite+0x8b ffffd000`21d06f20 fffff800`0085cef5 volsnap!VolSnapReadFilter+0x5d ffffd000`21d06f50 fffff800`02b619f7 Ntfs!NtfsStorageDriverCallout+0x16 ...
Untuk mengakhiri sesi penelusuran kesalahan Anda, masukkan perintah berikut:
Ringkasan perintah
- Perintah Konten pada menu Bantuan
- .sympath (Atur jalur simbol)
- .reload (Muat ulang modul)
- x (Periksa simbol)
- g (Go)
- dt (Jenis tampilan)
- Perintah hentian pada menu Debug
- lm (Daftar modul yang dimuat)
- k (Tampilkan backtrace tumpukan)
- bu (Atur titik henti)
- bl (daftar Breakpoint)
- bc (Breakpoint clear)
- Perintah Masuk pada menu Debug (F11)
- !proses
- !benang
- !devnode
- !devstack
- !drvobj
- qd (Keluar dan lepaskan)