Men-debug lab langkah demi langkah driver Windows (mode kernel echo)
Lab ini memperkenalkan debugger kernel WinDbg. Anda menggunakan WinDbg untuk men-debug kode driver sampel mode kernel echo.
Tujuan lab
Lab ini mencakup latihan yang memperkenalkan alat penelusuran kesalahan, mengajarkan perintah penelusuran kesalahan umum, mengilustrasikan penggunaan titik henti, dan menunjukkan cara menggunakan ekstensi penelusuran kesalahan.
Di lab ini, Anda menggunakan koneksi debug kernel langsung untuk menjelajahi tindakan berikut:
- Menggunakan perintah debugger Windows
- Gunakan perintah standar (tumpukan panggilan, variabel, utas, IRQL)
- Gunakan perintah penelusuran kesalahan driver tingkat lanjut (!commands)
- Menggunakan simbol
- Mengatur titik henti dalam penelusuran kesalahan langsung
- Menampilkan tumpukan panggilan
- Menampilkan pohon perangkat Plug and Play
- Bekerja dengan utas dan konteks proses
Penelusuran kesalahan mode pengguna dan kernel
Saat bekerja dengan debugger Windows, Anda dapat melakukan dua jenis penelusuran kesalahan:
Mode pengguna - Aplikasi dan subsistem berjalan di komputer dalam mode pengguna. Proses yang berjalan dalam mode pengguna melakukannya dalam ruang alamat virtual mereka sendiri. Mereka dibatasi untuk mendapatkan akses langsung ke banyak bagian sistem, termasuk perangkat keras sistem, memori yang tidak dialokasikan untuk penggunaannya, dan bagian lain dari sistem yang mungkin membahayakan integritas sistem. Karena proses yang berjalan dalam mode pengguna secara efektif diisolasi dari sistem dan proses mode pengguna lainnya, proses tersebut tidak dapat mengganggu sumber daya ini.
Mode kernel - Sistem operasi dan program istimewa berjalan dalam mode kernel. Kode mode kernel memiliki izin untuk mengakses bagian mana pun dari sistem. Ini tidak dibatasi seperti kode mode pengguna. Ini dapat memperoleh akses ke bagian mana pun dari proses lain yang berjalan dalam mode pengguna atau mode kernel. Sebagian besar fungsionalitas OS inti dan banyak driver perangkat keras berjalan dalam mode kernel.
Latihan ini mencakup perintah debug yang sering digunakan selama debugging mode pengguna dan mode kernel. Latihan ini juga mencakup ekstensi debug, kadang-kadang disebut "bang" !commands, yang digunakan untuk debugging mode kernel.
Penyiapan lab
Anda memerlukan perangkat keras berikut untuk menyelesaikan lab:
- Laptop atau komputer desktop (host) yang menjalankan Windows 10
- Laptop kedua atau komputer desktop (target) yang menjalankan Windows 10
- Hub jaringan atau router dan kabel jaringan untuk menyambungkan dua komputer
- Akses ke internet untuk mengunduh file simbol
Anda memerlukan perangkat lunak berikut untuk menyelesaikan lab:
- Visual Studio
- Windows Software Development Kit (SDK) untuk Windows 10
- Windows Driver Kit (WDK) untuk Windows 10
- Contoh driver echo untuk Windows 10
Lab memiliki bagian berikut:
- Menyambungkan ke sesi WinDbg mode kernel
- Perintah dan teknik debugging mode kernel
- Mengunduh dan membangun driver echo KMDF
- Menginstal sampel driver echo pada sistem target
- Gunakan WinDbg untuk menampilkan informasi tentang driver
- Tampilkan informasi pohon perangkat Plug and Play
- Bekerja dengan titik henti dan kode sumber
- Menampilkan variabel dan tumpukan panggilan
- Menampilkan proses dan utas
- IRQL, mendaftar, dan mengakhiri sesi WinDbg
- Sumber daya penelusuran kesalahan Windows
Menyambungkan ke sesi WinDbg mode kernel
Di bagian ini, konfigurasikan penelusuran kesalahan jaringan pada host dan sistem target.
Komputer di lab ini perlu dikonfigurasi untuk menggunakan koneksi jaringan Ethernet untuk penelusuran kesalahan kernel.
Lab ini menggunakan dua komputer. Debugger Windows berjalan pada sistem host dan driver echo Kernel Mode Driver Framework (KMDF) berjalan pada sistem target .
Gunakan hub jaringan atau router dan kabel jaringan untuk menyambungkan dua komputer.
Untuk bekerja dengan aplikasi mode kernel dan menggunakan WinDbg, kami sarankan Anda menggunakan KDNET melalui transportasi Ethernet. Untuk informasi tentang cara menggunakan protokol transportasi Ethernet, lihat Mulai menggunakan WinDbg (mode kernel). Untuk informasi selengkapnya tentang menyiapkan komputer target, lihat Menyiapkan komputer untuk penyebaran driver manual dan Menyiapkan penelusuran kesalahan kernel jaringan KDNET secara otomatis.
Mengonfigurasi penelusuran kesalahan kernel-mode dengan menggunakan Ethernet
Untuk mengaktifkan penelusuran kesalahan mode kernel pada sistem target:
Pada sistem host, buka jendela Prompt Perintah dan masukkan ipconfig untuk menentukan alamat IPv4-nya.
Windows IP Configuration Ethernet adapter Ethernet: Connection-specific DNS Suffix . : Link-local IPv6 Address . . . . . : fe80::c8b6:db13:d1e8:b13b%3 Autoconfiguration IPv4 Address. . : 169.182.1.1 Subnet Mask . . . . . . . . . . . : 255.255.0.0 Default Gateway . . . . . . . . . :
Rekam alamat IP sistem host: ______________________________________
Pada sistem target, buka jendela Prompt Perintah dan gunakan
ping
perintah untuk mengonfirmasi konektivitas jaringan antara kedua sistem.ping 169.182.1.1
Gunakan alamat IP aktual sistem host yang Anda rekam alih-alih 169.182.1.1 yang ditunjukkan dalam output sampel.
Pinging 169.182.1.1 with 32 bytes of data: Reply from 169.182.1.1: bytes=32 time=1ms TTL=255 Reply from 169.182.1.1: bytes=32 time<1ms TTL=255 Reply from 169.182.1.1: bytes=32 time<1ms TTL=255 Reply from 169.182.1.1: bytes=32 time<1ms TTL=255 Ping statistics for 169.182.1.1: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 0ms, Maximum = 1ms, Average = 0ms
Aktifkan penelusuran kesalahan mode kernel pada sistem target dengan menyelesaikan langkah-langkah berikut.
Penting
Sebelum Anda menggunakan BCDEdit untuk mengubah informasi boot, Anda mungkin perlu menangguhkan sementara fitur keamanan Windows seperti BitLocker dan Boot Aman di komputer pengujian. Aktifkan kembali fitur keamanan ini saat pengujian selesai. Kelola komputer pengujian dengan tepat ketika fitur keamanan dinonaktifkan. Boot aman biasanya dinonaktifkan di UEFI. Untuk mengakses pengaturan UEFI, Gunakan Sistem, Pemulihan, Start-up Tingkat Lanjut. Saat menghidupkan ulang, pilih Pemecahan Masalah, Opsi tingkat lanjut, pengaturan Firmware UEFI. Berhati-hatilah, karena salah mengatur opsi UEFI atau menonaktifkan BitLocker, dapat membuat sistem tidak dapat dioperasikan.
Pada komputer target, buka jendela Prompt Perintah sebagai Administrator. Masukkan perintah ini untuk mengaktifkan penelusuran kesalahan:
bcdedit /set {default} DEBUG YES
Masukkan perintah ini untuk mengaktifkan penandatanganan pengujian:
bcdedit /set TESTSIGNING ON
Masukkan perintah ini untuk mengatur alamat IP sistem host. Gunakan alamat IP sistem host yang Anda rekam sebelumnya, bukan alamat YANG ditampilkan.
bcdedit /dbgsettings net hostip:192.168.1.1 port:50000 key:2steg4fzbj2sz.23418vzkd4ko3.1g34ou07z4pev.1sp3yo9yz874p
Peringatan
Untuk meningkatkan keamanan koneksi dan mengurangi risiko permintaan koneksi debugger klien acak, gunakan kunci acak yang dibuat secara otomatis. Untuk informasi selengkapnya, lihat Menyiapkan penelusuran kesalahan kernel jaringan KDNET secara otomatis.
Masukkan perintah ini untuk mengonfirmasi bahwa nilai untuk
dbgsettings
diatur dengan benar:bcdedit /dbgsettings
key 2steg4fzbj2sz.23418vzkd4ko3.1g34ou07z4pev.1sp3yo9yz874p debugtype NET hostip 169.168.1.1 port 50000 dhcp Yes The operation completed successfully.
Catatan
Jika Anda menerima pesan dari firewall, dan Anda ingin menggunakan debugger, pilih ketiga kotak tersebut.
Di komputer host, buka jendela Prompt Perintah sebagai Administrator. Lab ini menggunakan versi x64 WinDbg.exe dari Windows Driver Kit (WDK) yang diinstal sebagai bagian dari penginstalan kit Windows. Ubah ke direktori WinDbg default, lokasi default ditunjukkan di bawah ini.
cd C:\Program Files(x86)\Windows Kits\10\Debuggers\x64
Lab ini mengasumsikan bahwa kedua komputer menjalankan Windows versi 64-bit pada target dan host. Jika itu tidak terjadi, pendekatan terbaik adalah menjalankan bitness alat yang sama pada host yang dijalankan target. Misalnya, jika target menjalankan Windows 32-bit, jalankan versi 32-bit debugger pada host. Untuk informasi selengkapnya, lihat Memilih alat debugging 32-Bit atau 64-Bit.
Buka WinDbg dengan debug pengguna jarak jauh dengan menggunakan perintah berikut. Nilai untuk kunci dan port cocok dengan nilai yang Anda tetapkan sebelumnya menggunakan BCDEdit pada komputer target.
WinDbg –k net:port=50000,key=2steg4fzbj2sz.23418vzkd4ko3.1g34ou07z4pev.1sp3yo9yz874p
Mulai ulang sistem target.
Dalam satu atau dua menit, output debug harus ditampilkan pada sistem host.
Microsoft (R) Windows Debugger Version 10.0.17074.1002 AMD64 Copyright (c) Microsoft Corporation. All rights reserved. Using NET for debugging Opened WinSock 2.0 Waiting to reconnect... Connected to target 169.182.1.1 on port 50005 on local IP 169.182.1.2 You can get the target MAC address by running .kdtargetmac command. Connected to Windows 10 16299 x64 target at (Wed Feb 28 17:16:23.051 2018 (UTC - 8:00)), ptr64 TRUE Kernel Debugger connection established. (Initial Breakpoint requested) Symbol search path is: srv* Executable search path is: Windows 10 Kernel Version 16299 MP (4 procs) Free x64 Product: WinNt, suite: TerminalServer SingleUserTS Built by: 16299.15.amd64fre.rs3_release.170928-1534 Machine Name: Kernel base = 0xfffff800`9540d000 PsLoadedModuleList = 0xfffff800`95774110 Debug session time: Wed Feb 28 17:16:23.816 2018 (UTC - 8:00) System Uptime: 0 days 0:00:20.534
Jendela Perintah Debugger adalah jendela informasi penelusuran kesalahan utama di WinDbg. Anda dapat memasukkan perintah debugger dan melihat output perintah di jendela ini.
Jendela Perintah Debugger dibagi menjadi dua panel. Masukkan perintah di panel yang lebih kecil, yang merupakan panel entri perintah di bagian bawah jendela, dan lihat output perintah di panel yang lebih besar di bagian atas jendela.
Di panel entri perintah, gunakan tombol Panah atas dan Panah bawah untuk menggulir riwayat perintah. Saat perintah muncul, Anda dapat mengeditnya atau menekan Enter untuk menjalankan perintah.
Perintah dan teknik debugging mode kernel
Di bagian ini, gunakan perintah debug untuk menampilkan informasi tentang sistem target.
Beberapa perintah debug menampilkan teks menggunakan Debugger Markup Language (DML) yang dapat Anda pilih untuk mengumpulkan informasi lebih lanjut dengan cepat.
Pada sistem host, gunakan Ctrl+Scroll Lock di WinDBg untuk memecah kode yang berjalan pada sistem target. Mungkin perlu waktu bagi sistem target untuk merespons.
Masukkan perintah berikut untuk mengaktifkan DML di jendela Perintah Debugger:
0: kd> .prefer_dml 1 DML versions of commands on by default
Anda dapat mengakses perintah referensi menggunakan
.hh
perintah . Masukkan perintah berikut untuk melihat bantuan referensi perintah untuk.prefer_dml
:0: kd> .hh .prefer_dml
File bantuan Debugger menampilkan bantuan untuk
.prefer_dml
perintah .Untuk menampilkan informasi versi terperinci pada sistem target, masukkan perintah vertarget (Tampilkan Versi Komputer Target) di jendela WinDbg:
0: kd> vertarget Windows 10 Kernel Version 9926 MP (4 procs) Free x64 Product: WinNt, suite: TerminalServer SingleUserTS Built by: 9926.0.amd64fre.fbl_awesome1501.150119-1648 Machine Name: "" Kernel base = 0xfffff801`8d283000 PsLoadedModuleList = 0xfffff801`8d58aef0 Debug session time: Fri Feb 20 10:15:17.807 2015 (UTC - 8:00) System Uptime: 0 days 01:31:58.931
Untuk memverifikasi bahwa Anda bekerja dengan proses mode kernel yang benar, masukkan perintah lm (Modul Yang Dimuat Daftar) di jendela WinDbg untuk menampilkan modul yang dimuat:
0: Kd> lm start end module name fffff801`09200000 fffff801`0925f000 volmgrx (no symbols) fffff801`09261000 fffff801`092de000 mcupdate_GenuineIntel (no symbols) fffff801`092de000 fffff801`092ec000 werkernel (export symbols) werkernel.sys fffff801`092ec000 fffff801`0934d000 CLFS (export symbols) CLFS.SYS fffff801`0934d000 fffff801`0936f000 tm (export symbols) tm.sys fffff801`0936f000 fffff801`09384000 PSHED (export symbols) PSHED.dll fffff801`09384000 fffff801`0938e000 BOOTVID (export symbols) BOOTVID.dll fffff801`0938e000 fffff801`093f7000 spaceport (no symbols) fffff801`09400000 fffff801`094cf000 Wdf01000 (no symbols) fffff801`094d9000 fffff801`09561000 CI (export symbols) CI.dll ...
Output yang telah dihilangkan ditunjukkan dengan "..." di lab ini.
Untuk meminta informasi terperinci tentang modul tertentu, gunakan
v
opsi (verbose):0: Kd> lm v m tcpip Browse full module list start end module name fffff801`09eeb000 fffff801`0a157000 tcpip (no symbols) Loaded symbol image file: tcpip.sys Image path: \SystemRoot\System32\drivers\tcpip.sys Image name: tcpip.sys Browse all global symbols functions data Timestamp: Sun Nov 09 18:59:03 2014 (546029F7) CheckSum: 00263DB1 ImageSize: 0026C000 Translations: 0000.04b0 0000.04e4 0409.04b0 0409.04e4 Unable to enumerate user-mode unloaded modules, Win32 error 0n30
Tidak ada jalur simbol yang diatur dan simbol yang dimuat, sehingga informasi terbatas tersedia di debugger.
Mengunduh dan membangun driver echo KMDF
Di bagian ini, unduh dan bangun driver echo KMDF.
Biasanya, Anda akan bekerja dengan kode driver Anda sendiri ketika Anda menggunakan WinDbg. Untuk terbiasa dengan operasi WinDbg, lab ini menggunakan driver sampel TEMPLAT KMDF "Echo". Kode sumber tersedia untuk membantu memahami informasi yang ditampilkan di WinDbg. Sampel ini juga digunakan untuk menggambarkan bagaimana Anda dapat melakukan satu langkah melalui kode mode kernel asli. Teknik ini bisa berharga untuk men-debug masalah kode mode kernel yang kompleks.
Untuk mengunduh dan membangun driver audio sampel Echo:
Unduh dan ekstrak sampel KMDF Echo dari GitHub.
Baca tentang sampel.
Telusuri semua sampel driver Windows.
Sampel KMDF Echo terletak di folder umum .
Unduh sampel driver dalam satu file zip: Sampel driver
Unduh file zip ke hard drive lokal Anda.
Pilih dan tahan atau klik kanan file zip dan pilih Ekstrak Semua. Tentukan folder baru, atau telusuri ke folder yang sudah ada untuk menyimpan file yang diekstrak. Misalnya, Anda dapat menentukan C:\DriverSamples\ sebagai folder baru untuk mengekstrak file.
Setelah file diekstrak, buka subfolder berikut: C:\DriverSamples\general\echo\kmdf
Di Microsoft Visual Studio, pilih File>Open>Project/Solution... dan buka folder yang berisi file yang diekstrak, misalnya, C:\DriverSamples\general\echo\kmdf. Klik dua kali file solusi kmdfecho untuk membukanya.
Di Visual Studio, temukan Penjelajah Solusi. Jika jendela ini belum terbuka, pilih Penjelajah Solusi dari menu Tampilan. Dalam Penjelajah Solusi, Anda dapat melihat satu solusi yang memiliki tiga proyek.
Atur konfigurasi dan platform sampel. Di Penjelajah Solusi, pilih dan tahan atau klik kanan Solusi 'kmdfecho' (3 proyek), dan pilih Configuration Manager. Pastikan bahwa pengaturan konfigurasi dan platform sama untuk tiga proyek tersebut. Secara default, konfigurasi diatur ke Win10 Debug, dan platform diatur ke Win64 untuk semua proyek. Jika Anda membuat perubahan konfigurasi atau platform untuk satu proyek, buat perubahan yang sama untuk tiga proyek yang tersisa.
Sampel driver perlu dimodifikasi untuk menggunakan nilai yang tidak tumpang tindih dengan driver yang ada. Lihat Dari Kode Sampel ke Driver Produksi - Apa yang Harus Diubah dalam Sampel tentang cara membuat sampel driver unik yang akan hidup berdampingan dengan driver nyata yang ada yang diinstal di Windows.
Atur pustaka runtime. Buka halaman properti driver echo dan temukan C/C++>Code Generation. Ubah Pustaka Runtime menjadi Debug Multi-utas (/MTd). Untuk informasi selengkapnya tentang opsi build, lihat /MD, /MT, /LD (Gunakan Run-Time Library).
Di properti driver, pastikan Mode Tanda Tangan Penandatanganan>Driver diatur ke Tanda Uji.
Di Visual Studio, pilih Bangun>Solusi Build.
Jendela build harus menampilkan pesan yang menunjukkan bahwa build untuk ketiga proyek berhasil.
Tip
Jika Anda menemukan pesan kesalahan build, gunakan nomor kesalahan build untuk menentukan perbaikan. Misalnya, kesalahan MSBuild MSB8040 menjelaskan cara bekerja dengan pustaka yang dimitigasi spekter.
Di File Explorer, buka folder yang berisi file yang diekstrak untuk sampel. Misalnya, buka C:\DriverSamples\general\echo\kmdf, jika itu folder yang Anda tentukan sebelumnya. Dalam folder tersebut, lokasi file driver yang dikompilasi bervariasi tergantung pada konfigurasi dan pengaturan platform yang Anda pilih di Configuration Manager. Jika Anda membiarkan pengaturan default tidak berubah, maka file driver yang dikompilasi disimpan ke folder bernama \x64\Debug untuk build debug 64 bit.
Buka folder yang berisi file bawaan untuk driver Autosync: C:\DriverSamples\general\echo\kmdf\driver\AutoSync\x64\Debug.
Folder harus berisi file-file ini:
File Deskripsi Echo.sys File driver. Echo.inf File informasi (INF) yang berisi informasi yang diperlukan untuk menginstal driver. Selain itu, file echoapp.exe dibangun dan harus terletak di sini: C:\DriverSamples\general\echo\kmdf\exe\x64\Debug.
File Deskripsi EchoApp.exe File pengujian yang dapat dieksekusi Prompt Perintah yang berkomunikasi dengan driver echo.sys. Temukan drive jempol USB atau siapkan berbagi jaringan untuk menyalin file driver bawaan dan uji EchoApp dari host ke sistem target.
Di bagian berikutnya, salin kode ke sistem target, dan instal dan uji driver.
Menginstal sampel driver echo KMDF pada sistem target
Di bagian ini, gunakan alat DevCon untuk menginstal driver sampel echo.
Komputer tempat Anda menginstal pengandar disebut komputer target atau komputer pengujian. Biasanya, komputer ini terpisah dari komputer tempat Anda mengembangkan dan membangun paket driver. Komputer tempat Anda mengembangkan dan membangun driver disebut komputer host.
Proses memindahkan paket driver ke komputer target dan menginstal driver disebut menyebarkan driver.
Sebelum Anda menyebarkan driver yang ditandatangani pengujian, siapkan komputer target dengan mengaktifkan penandatanganan pengujian. Anda juga perlu menemukan alat DevCon di penginstalan WDK Anda dan menyalinnya ke sistem target.
Untuk menginstal driver pada sistem target, lakukan langkah-langkah berikut.
Pada sistem target, aktifkan driver yang ditandatangani pengujian:
Buka Pengaturan Windows.
Di Pembaruan dan Keamanan, pilih Pemulihan.
Di bawah Startup tingkat lanjut, pilih Mulai Ulang Sekarang.
Saat komputer dimulai ulang, pilih Opsi startup. Di Windows 10, pilih Pemecahan Masalah>Pengaturan Startup opsi>tingkat lanjut, lalu pilih Mulai Ulang.
Pilih Nonaktifkan penegakan tanda tangan driver dengan menekan tombol F7.
Mulai ulang komputer target.
Pada sistem host, buka folder Alat di penginstalan WDK Anda dan temukan alat DevCon. Misalnya, lihat di folder berikut: C:\Program Files (x86)\Windows Kits\10\Tools\x64\devcon.exe.
Buat folder pada target untuk paket driver bawaan, misalnya, C:\EchoDriver. Salin devcon.exe ke sistem target. Temukan sertifikat .cer pada sistem host. Ini berada di folder yang sama pada komputer host di folder yang berisi file driver bawaan. Salin semua file dari pengandar bawaan yang dijelaskan sebelumnya di komputer host dan simpan ke folder yang sama dengan yang Anda buat pada komputer target.
Pada komputer target, pilih dan tahan atau klik kanan file sertifikat, dan pilih Instal, lalu ikuti perintah untuk menginstal sertifikat pengujian.
Jika Anda memerlukan instruksi lebih rinci untuk menyiapkan komputer target, lihat Menyiapkan komputer untuk penyebaran driver manual.
Instruksi berikut menunjukkan kepada Anda cara menginstal dan menguji driver sampel. Berikut adalah sintaks umum untuk alat devcon yang Anda gunakan untuk menginstal driver:
devcon install <INF file> <hardware ID>
File INF yang diperlukan untuk menginstal driver ini adalah echo.inf. File inf berisi ID perangkat keras untuk menginstal echo.sys. Untuk sampel echo, ID perangkat keras adalah root\ECHO.
Pada komputer target, buka jendela Prompt Perintah sebagai Administrator. Buka folder paket driver Anda, dan masukkan perintah berikut:
devcon install echo.inf root\ECHO
Jika Anda mendapatkan pesan kesalahan tentang devcon yang tidak dikenali, coba tambahkan jalur ke alat devcon . Misalnya, jika Anda menyalinnya ke folder bernama C:\Tools, maka coba gunakan perintah berikut:
c:\tools\devcon install echo.inf root\ECHO
Kotak dialog muncul yang menunjukkan bahwa driver pengujian adalah driver yang tidak ditandatangani. Pilih Tetap instal driver ini untuk melanjutkan.
Tip
Jika Anda memiliki masalah dengan penginstalan, periksa file berikut untuk informasi selengkapnya. %windir%\inf\setupapi.dev.log
Setelah berhasil menginstal driver sampel, Anda siap untuk mengujinya.
Pada komputer target, di jendela Prompt Perintah, masukkan devmgmt untuk membuka Manajer Perangkat. Di Manajer Perangkat, pada menu Tampilan , pilih Perangkat menurut jenis. Di pohon perangkat, temukan Sampel WDF Echo Driver di node Perangkat Sampel.
Masukkan echoapp untuk memulai aplikasi echo pengujian untuk mengonfirmasi bahwa driver berfungsi.
C:\Samples\KMDF_Echo_Sample> echoapp
DevicePath: \\?\root#sample#0005#{cdc35b6e-0be4-4936-bf5f-5537380a7c1a}
Opened device successfully
512 Pattern Bytes Written successfully
512 Pattern Bytes Read successfully
Pattern Verified successfully
30720 Pattern Bytes Written successfully
30720 Pattern Bytes Read successfully
Pattern Verified successfully
Gunakan WinDbg untuk menampilkan informasi tentang driver
Di bagian ini, atur jalur simbol dan gunakan perintah debugger kernel untuk menampilkan informasi tentang driver sampel gema KMDF.
Untuk melihat informasi tentang driver:
Pada sistem host, jika Anda menutup debugger, buka lagi dengan menggunakan perintah berikut di jendela Prompt Perintah administrator.
WinDbg -k net:port=50000,key=2steg4fzbj2sz.23418vzkd4ko3.1g34ou07z4pev.1sp3yo9yz874p
Gunakan Ctrl+Break (Scroll Lock) untuk memecah kode yang berjalan pada sistem target.
Untuk mengatur jalur simbol ke server simbol Microsoft di lingkungan WinDbg, gunakan
.symfix
perintah .0: kd> .symfix
Untuk menambahkan lokasi simbol lokal Anda untuk menggunakan simbol lokal Anda, tambahkan jalur menggunakan
.sympath+
lalu.reload /f
.0: kd> .sympath+ C:\DriverSamples\general\echo\kmdf 0: kd> .reload /f
.reload
Perintah dengan/f
opsi paksa menghapus semua informasi simbol untuk modul yang ditentukan dan memuat ulang simbol. Dalam beberapa kasus, perintah ini juga memuat ulang atau membongkar modul itu sendiri.
Anda harus memuat simbol yang tepat untuk menggunakan fungsionalitas tingkat lanjut yang disediakan WinDbg. Jika Anda tidak memiliki simbol yang dikonfigurasi dengan benar, saat Anda mencoba menggunakan fungsionalitas yang bergantung pada simbol, Anda menerima pesan yang menunjukkan bahwa simbol tidak tersedia.
0:000> dv
Unable to enumerate locals, HRESULT 0x80004005
Private symbols (symbols.pri) are required for locals.
Type “.hh dbgerr005” for details.
Ada banyak pendekatan yang dapat digunakan untuk bekerja dengan simbol. Dalam banyak situasi, Anda dapat mengonfigurasi komputer untuk mengakses simbol dari server simbol yang disediakan Microsoft saat diperlukan. Lab ini menggunakan pendekatan tersebut. Jika simbol di lingkungan Anda berada di lokasi yang berbeda, ubah langkah-langkah untuk menggunakan lokasi tersebut. Untuk informasi selengkapnya, lihat Jalur simbol untuk debugger Windows.
Untuk melakukan penelusuran kesalahan sumber, Anda harus membuat versi biner yang dicentang (debug). Pengkompilasi membuat file simbol (file.pdb ). File simbol ini menunjukkan debugger bagaimana instruksi biner sesuai dengan baris sumber. File sumber aktual itu sendiri juga harus dapat diakses oleh debugger.
File simbol tidak berisi teks kode sumber. Untuk penelusuran kesalahan, sebaiknya linker tidak mengoptimalkan kode Anda. Penelusuran kesalahan sumber dan akses ke variabel lokal lebih sulit, dan terkadang hampir tidak mungkin, jika kode telah dioptimalkan. Jika Anda mengalami masalah saat melihat variabel lokal atau baris sumber, atur opsi build berikut:
set COMPILE_DEBUG=1
set ENABLE_OPTIMIZER=0
Masukkan perintah berikut di area perintah debugger untuk menampilkan informasi tentang driver echo:
0: kd> lm m echo* v Browse full module list start end module name fffff801`4ae80000 fffff801`4ae89000 ECHO (private pdb symbols) C:\Samples\KMDF_ECHO_SAMPLE\echo.pdb Loaded symbol image file: ECHO.sys Image path: \SystemRoot\system32\DRIVERS\ECHO.sys Image name: ECHO.sys ...
Untuk informasi selengkapnya, lihat lm.
Karena kumpulan
prefer_dml
lab ini sebelumnya, beberapa elemen output adalah tautan panas yang dapat Anda pilih. Pilih tautan Telusuri semua simbol global di output debug untuk menampilkan informasi tentang simbol item yang dimulai dengan huruf "a".0: kd> x /D Echo!a*
Sampel echo tidak berisi simbol apa pun yang dimulai dengan huruf "a", jadi ketik
x ECHO!Echo*
untuk menampilkan informasi tentang semua simbol yang terkait dengan driver echo yang dimulai dengan "Echo".0: kd> x ECHO!Echo* fffff801`0bf95690 ECHO!EchoEvtIoQueueContextDestroy (void *) fffff801`0bf95000 ECHO!EchoEvtDeviceSelfManagedIoStart (struct WDFDEVICE__ *) fffff801`0bf95ac0 ECHO!EchoEvtTimerFunc (struct WDFTIMER__ *) fffff801`0bf9b120 ECHO!EchoEvtDeviceSelfManagedIoSuspend (struct WDFDEVICE__ *) ...
Untuk informasi selengkapnya, lihat x (Periksa Simbol).
!lmi
Ekstensi menampilkan informasi terperinci tentang modul. Memasuki!lmi echo
. Output Anda harus mirip dengan teks yang ditampilkan dalam contoh ini:0: kd> !lmi echo Loaded Module Info: [echo] Module: ECHO Base Address: fffff8010bf94000 Image Name: ECHO.sys …
Gunakan ekstensi untuk menampilkan informasi header seperti yang
!dh
ditunjukkan dalam contoh ini:0: kd> !dh echo File Type: EXECUTABLE IMAGE FILE HEADER VALUES 14C machine (i386) 6 number of sections 54AD8A42 time date stamp Wed Jan 07 11:34:26 2015 ...
Masukkan yang berikut ini untuk mengubah masker bit debug default sehingga semua pesan debug dari sistem target ditampilkan di debugger:
0: kd> ed nt!Kd_DEFAULT_MASK 0xFFFFFFFF
Beberapa driver menampilkan informasi tambahan ketika masker 0xFFFFFFFF digunakan. Atur masker ke 0x00000000 jika Anda ingin mengurangi jumlah informasi yang ditampilkan.
0: kd> ed nt!Kd_DEFAULT_MASK 0x00000000
dd
Gunakan perintah untuk mengonfirmasi masker diatur untuk menampilkan semua pesan debugger.0: kd> dd nt!kd_DEFAULT_MASK fffff802`bb4057c0 ffffffff 00000000 00000000 00000000 fffff802`bb4057d0 00000000 00000000 00000000 00000000 fffff802`bb4057e0 00000001 00000000 00000000 00000000 fffff802`bb4057f0 00000000 00000000 00000000 00000000 fffff802`bb405800 00000000 00000000 00000000 00000000 fffff802`bb405810 00000000 00000000 00000000 00000000 fffff802`bb405820 00000000 00000000 00000000 00000000 fffff802`bb405830 00000000 00000000 00000000 00000000
Tampilkan informasi pohon perangkat Plug and Play
Di bagian ini, tampilkan informasi tentang driver perangkat sampel echo dan tempatnya berada di pohon perangkat Plug and Play.
Informasi tentang driver perangkat di pohon perangkat Plug and Play dapat berguna untuk pemecahan masalah. Misalnya, jika driver perangkat tidak berada di pohon perangkat, mungkin ada masalah dengan penginstalan driver perangkat.
Untuk informasi selengkapnya tentang ekstensi debug simpul perangkat, lihat !devnode.
Pada sistem host, untuk melihat semua simpul perangkat di pohon perangkat Plug and Play, masukkan
!devnode 0 1
perintah .0: kd> !devnode 0 1 Dumping IopRootDeviceNode (= 0xffffe0005a3a8d30) DevNode 0xffffe0005a3a8d30 for PDO 0xffffe0005a3a9e50 InstancePath is "HTREE\ROOT\0" State = DeviceNodeStarted (0x308) Previous State = DeviceNodeEnumerateCompletion (0x30d) DevNode 0xffffe0005a3a3d30 for PDO 0xffffe0005a3a4e50 InstancePath is "ROOT\volmgr\0000" ServiceName is "volmgr" State = DeviceNodeStarted (0x308) Previous State = DeviceNodeEnumerateCompletion (0x30d) DevNode 0xffffe0005a324560 for PDO 0xffffe0005bd95ca0… …
Gunakan Ctrl+F untuk mencari dalam output yang dihasilkan untuk mencari nama driver perangkat, echo.
Driver perangkat echo harus dimuat. Gunakan perintah untuk menampilkan informasi Plug and Play yang terkait dengan driver perangkat echo Anda seperti yang
!devnode 0 1 echo
ditunjukkan dalam contoh ini:0: Kd> !devnode 0 1 echo Dumping IopRootDeviceNode (= 0xffffe0007b725d30) DevNode 0xffffe0007b71a630 for PDO 0xffffe0007b71a960 InstancePath is "ROOT\SAMPLE\0000" ServiceName is "ECHO" State = DeviceNodeStarted (0x308) Previous State = DeviceNodeEnumerateCompletion (0x30d) …
Output yang ditampilkan dalam perintah sebelumnya mencakup PDO yang terkait dengan instans driver Anda yang sedang berjalan, dalam contoh ini, 0xffffe0007b71a960. Masukkan
!devobj <PDO address>
perintah untuk menampilkan informasi Plug and Play yang terkait dengan driver perangkat echo. Gunakan alamat PDO yang!devnode
ditampilkan di komputer Anda, bukan alamat yang ditampilkan di sini.0: kd> !devobj 0xffffe0007b71a960 Device object (ffffe0007b71a960) is for: 0000000e \Driver\PnpManager DriverObject ffffe0007b727e60 Current Irp 00000000 RefCount 0 Type 00000004 Flags 00001040 Dacl ffffc102c9b36031 DevExt 00000000 DevObjExt ffffe0007b71aab0 DevNode ffffe0007b71a630 ExtensionFlags (0x00000800) DOE_DEFAULT_SD_PRESENT Characteristics (0x00000180) FILE_AUTOGENERATED_DEVICE_NAME, FILE_DEVICE_SECURE_OPEN AttachedDevice (Upper) ffffe000801fee20 \Driver\ECHO Device queue is not busy.
Output yang
!devnode 0 1
ditampilkan dalam perintah mencakup alamat PDO yang terkait dengan instans driver Anda yang sedang berjalan, dalam contoh ini 0xffffe0007b71a960. Masukkan!devstack <PDO address>
perintah untuk menampilkan informasi Plug and Play yang terkait dengan pengandar perangkat. Gunakan alamat PDO yang!devnode
ditampilkan di komputer Anda, bukan alamat yang diperlihatkan dalam contoh ini.0: kd> !devstack 0xffffe0007b71a960 !DevObj !DrvObj !DevExt ObjectName ffffe000801fee20 \Driver\ECHO ffffe0007f72eff0 > ffffe0007b71a960 \Driver\PnpManager 00000000 0000000e !DevNode ffffe0007b71a630 : DeviceInst is "ROOT\SAMPLE\0000" ServiceName is "ECHO"
Output menunjukkan bahwa Anda memiliki tumpukan driver perangkat yang cukup sederhana. Driver echo adalah anak dari simpul PnPManager . PnPManager adalah simpul akar.
\Driver\ECHO
\Driver\PnpManager
Diagram ini menunjukkan pohon simpul perangkat yang lebih kompleks.
Untuk informasi selengkapnya tentang tumpukan driver yang lebih kompleks, lihat Tumpukan driver dan Simpul perangkat dan tumpukan perangkat.
Bekerja dengan titik henti dan kode sumber
Di bagian ini, atur titik henti dan satu langkah melalui kode sumber mode kernel.
Untuk dapat menelusuri kode dan memeriksa nilai variabel secara real time, aktifkan titik henti dan atur jalur ke kode sumber.
Titik henti menghentikan eksekusi kode pada baris kode tertentu. Maju dalam kode dari titik tersebut ke debug bagian kode tertentu tersebut.
Untuk mengatur titik henti menggunakan perintah debug, gunakan salah satu perintah berikut b
.
Perintah | Deskripsi |
---|---|
bp |
Mengatur titik henti yang aktif hingga modul tempatnya dibongkar. |
bu |
Mengatur titik henti yang tidak terselesaikan saat modul dibongkar dan diaktifkan kembali saat modul dimuat ulang. |
bm |
Mengatur titik henti untuk simbol. Perintah ini menggunakan bu atau bp dengan tepat dan memungkinkan wildcard (* ) digunakan untuk mengatur titik henti pada setiap simbol yang cocok, seperti semua metode dalam kelas. |
Untuk informasi selengkapnya, lihat Penelusuran kesalahan Kode sumber di WinDbg.
Pada sistem host, gunakan UI WinDbg untuk mengonfirmasi bahwa Mode Sumber Debug>diaktifkan dalam sesi WinDbg saat ini.
Masukkan perintah berikut untuk menambahkan lokasi kode lokal Anda ke jalur sumber:
.srcpath+ C:\DriverSamples\KMDF_Echo_Sample\driver\AutoSync
Masukkan perintah berikut untuk menambahkan lokasi simbol lokal Anda ke jalur simbol:
.sympath+ C:\DriverSamples\KMDF_Echo_Sample\driver\AutoSync
x
Gunakan perintah untuk memeriksa simbol yang terkait dengan driver echo untuk menentukan nama fungsi yang akan digunakan untuk titik henti. Anda dapat menggunakan kartubebas atau Ctrl+F untuk menemukanDeviceAdd
nama fungsi.0: kd> x ECHO!EchoEvt* 8b4c7490 ECHO!EchoEvtIoQueueContextDestroy (void *) 8b4c7000 ECHO!EchoEvtDeviceSelfManagedIoStart (struct WDFDEVICE__ *) 8b4c7820 ECHO!EchoEvtTimerFunc (struct WDFTIMER__ *) 8b4cb0e0 ECHO!EchoEvtDeviceSelfManagedIoSuspend (struct WDFDEVICE__ *) 8b4c75d0 ECHO!EchoEvtIoWrite (struct WDFQUEUE__ *, struct WDFREQUEST__ *, unsigned int) 8b4cb170 ECHO!EchoEvtDeviceAdd (struct WDFDRIVER__ *, struct …
Output menunjukkan bahwa
DeviceAdd
metode untuk driver echo Anda adalahECHO!EchoEvtDeviceAdd
.Atau, tinjau kode sumber untuk menemukan nama fungsi untuk titik henti Anda.
Atur titik henti dengan
bm
perintah menggunakan nama driver, diikuti dengan nama fungsi, misalnya,AddDevice
, di mana Anda ingin mengatur titik henti, dipisahkan oleh tanda seru. Lab ini menggunakanAddDevice
untuk melihat driver yang dimuat.0: kd> bm ECHO!EchoEvtDeviceAdd 1: fffff801`0bf9b1c0 @!"ECHO!EchoEvtDeviceAdd"
Anda dapat menggunakan sintaks yang berbeda bersama dengan mengatur variabel seperti
<module>!<symbol>
,<class>::<method>
,'<file.cpp>:<line number>'
, atau melewati beberapa kali<condition> <#>
. Untuk informasi selengkapnya, lihat Titik henti kondisional di WinDbg dan debugger Windows lainnya.Cantumkan titik henti saat ini untuk mengonfirmasi bahwa titik henti telah diatur dengan memasukkan
bl
perintah:0: kd> bl 1 e fffff801`0bf9b1c0 0001 (0001) ECHO!EchoEvtDeviceAdd
"e" dalam output yang ditunjukkan di sini menunjukkan bahwa titik henti nomor 1 diaktifkan untuk diaktifkan.
Mulai ulang eksekusi kode pada sistem target dengan memasukkan
g
perintah (go).Pada sistem target, di Windows, buka Manajer Perangkat dengan menggunakan ikon atau masukkan mmc devmgmt.msc. Di Manajer Perangkat, perluas node Sampel .
Pilih dan tahan atau klik kanan entri driver echo KMDF dan pilih Nonaktifkan dari menu.
Pilih dan tahan atau klik kanan entri driver echo KMDF lagi dan pilih Aktifkan dari menu.
Pada sistem host, ketika driver diaktifkan, breakpoint debug AddDevice harus diaktifkan. Eksekusi kode driver pada sistem target harus dihentikan. Ketika titik henti terpukul, eksekusi harus dihentikan pada awal rutinitas AddDevice . Output perintah debug menampilkan
Breakpoint 1 hit
.Menelusuri baris demi baris kode dengan memasukkan
p
perintah atau menekan F10 hingga Anda mencapai akhir rutinitas AddDevice berikut. Karakter Kurung kurawal (}
) disorot seperti yang ditunjukkan.
Di bagian berikutnya, periksa status variabel setelah kode DeviceAdd dijalankan.
Anda dapat mengubah titik henti yang ada dengan menggunakan perintah berikut:
Perintah | Deskripsi |
---|---|
bl |
Mencantumkan titik henti. |
bc |
Menghapus titik henti dari daftar. Gunakan bc * untuk menghapus semua titik henti. |
bd |
Menonaktifkan titik henti. Gunakan bd * untuk menonaktifkan semua titik henti. |
be |
Mengaktifkan titik henti. Gunakan be * untuk mengaktifkan semua titik henti. |
Atau, Anda juga dapat memodifikasi titik henti di UI WinDbg.
Anda juga dapat mengatur titik henti yang diaktifkan saat lokasi memori diakses. ba
Gunakan perintah (putuskan akses), dengan sintaks berikut:
ba <access> <size> <address> {options}
Opsi | Deskripsi |
---|---|
e |
execute: ketika CPU mengambil instruksi dari alamat |
r |
baca/tulis: ketika CPU membaca atau menulis ke alamat |
w |
tulis: ketika CPU menulis ke alamat |
Anda hanya dapat mengatur empat titik henti data pada waktu tertentu. Terserah Anda untuk memastikan bahwa Anda menyelaraskan data dengan benar untuk memicu titik henti. Kata-kata harus berakhir dalam alamat yang dapat dibagi dengan 2, kata kata harus dapat dibagi 4, dan kata quad dengan 0 atau 8.
Misalnya, untuk mengatur titik henti baca/tulis pada alamat memori tertentu, Anda dapat menggunakan perintah seperti contoh ini.
ba r 4 0x0003f7bf0
Anda dapat menggunakan perintah berikut untuk menelusuri kode Anda dengan pemotongan pendek keyboard terkait yang ditampilkan dalam tanda kurung.
- Break in (Ctrl+Break). Perintah ini mengganggu sistem selama sistem berjalan dan sedang berkomunikasi dengan WinDbg. Urutan dalam Debugger Kernel adalah Ctrl+C.
- Jalankan ke kursor (F7 atau Ctrl+F10). Letakkan kursor di jendela sumber atau pembongkaran tempat Anda ingin eksekusi diputus, lalu tekan F7. Eksekusi kode berjalan ke titik tersebut. Jika alur eksekusi kode tidak mencapai titik yang ditunjukkan oleh kursor, WinDbg tidak akan rusak. Situasi ini dapat terjadi jika pernyataan IF tidak dijalankan.
- Jalankan (F5). Jalankan hingga titik henti ditemui atau peristiwa seperti pemeriksaan bug terjadi.
- Langkah di atas (F10). Perintah ini menyebabkan eksekusi kode melanjutkan satu pernyataan atau satu instruksi pada satu waktu. Jika panggilan ditemui, eksekusi kode melewati panggilan tanpa memasukkan rutinitas yang disebut. Jika bahasa pemrograman adalah C atau C++ dan WinDbg dalam mode sumber, mode sumber dapat diaktifkan atau dinonaktifkan menggunakan Mode Sumber Debug>.
- Langkah masuk (F11). Perintah ini seperti langkah atas, kecuali bahwa eksekusi panggilan masuk ke rutinitas yang disebut.
- Keluar (Shift+F11). Perintah ini menyebabkan eksekusi berjalan ke dan keluar dari rutinitas saat ini atau tempat saat ini di tumpukan panggilan. Perintah ini berguna jika Anda telah melihat cukup rutinitas.
Untuk informasi selengkapnya, lihat Penelusuran kesalahan Kode sumber di WinDbg.
Menampilkan variabel dan tumpukan panggilan
Di bagian ini, tampilkan informasi tentang variabel dan tumpukan panggilan.
Lab ini mengasumsikan bahwa Anda dihentikan di rutinitas AddDevice menggunakan proses yang dijelaskan sebelumnya. Untuk melihat output yang ditampilkan di sini, ulangi langkah-langkah yang dijelaskan sebelumnya, jika perlu.
Pada sistem host, untuk menampilkan variabel, gunakan item menu lokal tampilan>untuk menampilkan variabel lokal.
Untuk menemukan lokasi alamat variabel global, masukkan ? <variable name>
.
- Keluar (Shift+F11) - Perintah ini menyebabkan eksekusi berjalan ke dan keluar dari rutinitas saat ini (tempat saat ini di tumpukan panggilan). Ini berguna jika Anda telah melihat cukup rutinitas.
Untuk informasi selengkapnya, lihat Debugging Kode Sumber di WinDbg (Klasik) dalam dokumentasi referensi penelusuran kesalahan.
Bagian 8: Menampilkan variabel dan tumpukan panggilan
Di Bagian 8, Anda akan menampilkan informasi tentang variabel dan tumpukan panggilan.
Lab ini mengasumsikan bahwa Anda dihentikan pada rutinitas AddDevice menggunakan proses yang dijelaskan sebelumnya. Untuk melihat tampilan output di sini, ulangi langkah-langkah yang dijelaskan sebelumnya, jika perlu.
<- Pada sistem host
Tampilkan variabel
Gunakan item menu lokal tampilan>untuk menampilkan variabel lokal.
Variabel global
Anda dapat menemukan lokasi alamat variabel global dengan mengetik ? <nama> variabel.
Variabel lokal
Anda dapat menampilkan nama dan nilai semua variabel lokal untuk bingkai tertentu dengan mengetik perintah dv .
Untuk menampilkan nama dan nilai semua variabel lokal untuk bingkai tertentu, masukkan dv
perintah :
0: kd> dv
Driver = 0x00001fff`7ff9c838
DeviceInit = 0xffffd001`51978190
status = 0n0
Tumpukan panggilan adalah rantai panggilan fungsi yang telah mengarah ke lokasi penghitung program saat ini. Fungsi teratas pada tumpukan panggilan adalah fungsi saat ini, dan fungsi berikutnya adalah fungsi yang disebut fungsi saat ini, dan sebagainya.
Untuk menampilkan tumpukan panggilan, gunakan k*
perintah .
Perintah | Deskripsi |
---|---|
kb |
Menampilkan tumpukan dan tiga parameter pertama. |
kp |
Menampilkan tumpukan dan daftar lengkap parameter. |
kn |
Memungkinkan Anda melihat tumpukan dengan informasi bingkai di sampingnya. |
Pada sistem host, jika Anda ingin menjaga tumpukan panggilan tetap tersedia, pilih tampilkan>tumpukan panggilan untuk melihatnya. Pilih kolom di bagian atas jendela untuk mengalihkan tampilan informasi tambahan.
kn
Gunakan perintah untuk menampilkan tumpukan panggilan saat menelusuri kesalahan kode adaptor sampel dalam status jeda.3: kd> kn # Child-SP RetAddr Call Site 00 ffffd001`51978110 fffff801`0942f55b ECHO!EchoEvtDeviceAdd+0x66 [c:\Samples\kmdf echo sample\c++\driver\autosync\driver.c @ 138] 01 (Inline Function) --------`-------- Wdf01000!FxDriverDeviceAdd::Invoke+0x30 [d:\wbrtm\minkernel\wdf\framework\shared\inc\private\common\fxdrivercallbacks.hpp @ 61] 02 ffffd001`51978150 fffff801`eed8097d Wdf01000!FxDriver::AddDevice+0xab [d:\wbrtm\minkernel\wdf\framework\shared\core\km\fxdriverkm.cpp @ 72] 03 ffffd001`51978570 fffff801`ef129423 nt!PpvUtilCallAddDevice+0x35 [d:\9142\minkernel\ntos\io\pnpmgr\verifier.c @ 104] 04 ffffd001`519785b0 fffff801`ef0c4112 nt!PnpCallAddDevice+0x63 [d:\9142\minkernel\ntos\io\pnpmgr\enum.c @ 7397] 05 ffffd001`51978630 fffff801`ef0c344f nt!PipCallDriverAddDevice+0x6e2 [d:\9142\minkernel\ntos\io\pnpmgr\enum.c @ 3390] ...
Tumpukan panggilan menunjukkan bahwa kernel (nt) dipanggil ke dalam kode Plug and Play (PnP) yang disebut kode kerangka kerja driver (WDF) yang kemudian disebut fungsi driver DeviceAdd
echo.
Menampilkan proses dan utas
Di bagian ini, tampilkan informasi tentang proses dan utas yang berjalan dalam mode kernel.
Proses
Anda dapat menampilkan atau mengatur informasi proses dengan menggunakan ekstensi debugger !process . Atur titik henti untuk memeriksa proses yang digunakan saat suara diputar.
Pada sistem host, masukkan
dv
perintah untuk memeriksa variabel lokal yang terkait denganEchoEvtIo
rutinitas:0: kd> dv ECHO!EchoEvtIo* ECHO!EchoEvtIoQueueContextDestroy ECHO!EchoEvtIoWrite ECHO!EchoEvtIoRead
Hapus titik henti sebelumnya dengan menggunakan
bc *
:0: kd> bc *
Atur titik henti simbol pada
EchoEvtIo
rutinitas dengan menggunakan perintah berikut:0: kd> bm ECHO!EchoEvtIo* 2: aade5490 @!”ECHO!EchoEvtIoQueueContextDestroy” 3: aade55d0 @!”ECHO!EchoEvtIoWrite” 4: aade54c0 @!”ECHO!EchoEvtIoRead”
Cantumkan titik henti untuk mengonfirmasi bahwa titik henti diatur dengan benar:
0: kd> bl 1 e aabf0490 [c:\Samples\kmdf echo sample\c++\driver\autosync\queue.c @ 197] 0001 (0001) ECHO!EchoEvtIoQueueContextDestroy ...
Masukkan
g
untuk memulai ulang eksekusi kode:0: kd> g
Pada sistem target, jalankan
EchoApp.exe
program uji driver pada sistem target.Pada sistem host, ketika aplikasi pengujian berjalan, rutinitas I/O di driver dipanggil. Panggilan ini menyebabkan titik henti diaktifkan, dan eksekusi kode driver pada sistem target berhenti.
Breakpoint 2 hit ECHO!EchoEvtIoWrite: fffff801`0bf95810 4c89442418 mov qword ptr [rsp+18h],r8
!process
Gunakan perintah untuk menampilkan proses saat ini yang terlibat dalam menjalankan echoapp.exe:0: kd> !process PROCESS ffffe0007e6a7780 SessionId: 1 Cid: 03c4 Peb: 7ff7cfec4000 ParentCid: 0f34 DirBase: 1efd1b000 ObjectTable: ffffc001d77978c0 HandleCount: 34. Image: echoapp.exe VadRoot ffffe000802c79f0 Vads 30 Clone 0 Private 135. Modified 5. Locked 0. DeviceMap ffffc001d83c6e80 Token ffffc001cf270050 ElapsedTime 00:00:00.052 UserTime 00:00:00.000 KernelTime 00:00:00.000 QuotaPoolUsage[PagedPool] 33824 QuotaPoolUsage[NonPagedPool] 4464 Working Set Sizes (now,min,max) (682, 50, 345) (2728KB, 200KB, 1380KB) PeakWorkingSetSize 652 VirtualSize 16 Mb PeakVirtualSize 16 Mb PageFaultCount 688 MemoryPriority BACKGROUND BasePriority 8 CommitCharge 138 THREAD ffffe00080e32080 Cid 03c4.0ec0 Teb: 00007ff7cfece000 Win32Thread: 0000000000000000 RUNNING on processor 1
Output menunjukkan bahwa proses dikaitkan dengan utas echoapp.exe , yang berjalan ketika titik henti Anda pada peristiwa penulisan driver terpukul. Untuk informasi selengkapnya, lihat !process.
!process 0 0
Gunakan untuk menampilkan informasi ringkasan untuk semua proses. Dalam output, gunakan Ctrl+F untuk menemukan alamat proses yang sama untuk proses yang terkait dengan gambar echoapp.exe . Dalam contoh, alamat prosesnya adalahffffe0007e6a7780
.... PROCESS ffffe0007e6a7780 SessionId: 1 Cid: 0f68 Peb: 7ff7cfe7a000 ParentCid: 0f34 DirBase: 1f7fb9000 ObjectTable: ffffc001cec82780 HandleCount: 34. Image: echoapp.exe ...
Rekam ID proses yang terkait dengan echoapp.exe untuk digunakan nanti di lab ini. Anda juga dapat menggunakan Ctrl+C untuk menyalin alamat ke penyangga salinan untuk digunakan nanti.
_____________________________________________________(alamat proses echoapp.exe)
Masukkan
g
sebagaimana diperlukan ke dalam debugger untuk menjalankan kode ke depan hingga echoapp.exe selesai berjalan. Ini mencapai titik henti dalam peristiwa baca dan tulis berkali-kali. Saat echoapp.exe selesai, pecahkan ke debugger, dengan menekan Ctrl+ScrLk (Ctrl+Break).!process
Gunakan perintah untuk mengonfirmasi bahwa Anda menjalankan proses yang berbeda. Dalam output yang ditunjukkan di sini, proses dengan nilai Gambar Sistem berbeda dari nilai Gambar Echo .1: kd> !process PROCESS ffffe0007b65d900 SessionId: none Cid: 0004 Peb: 00000000 ParentCid: 0000 DirBase: 001ab000 ObjectTable: ffffc001c9a03000 HandleCount: 786. Image: System VadRoot ffffe0007ce45930 Vads 14 Clone 0 Private 22. Modified 131605. Locked 64. DeviceMap ffffc001c9a0c220 Token ffffc001c9a05530 ElapsedTime 21:31:02.516 ...
Output menunjukkan bahwa proses sistem ffffe0007b65d900 berjalan ketika Anda menghentikan OS.
!process
Gunakan perintah untuk mencoba melihat ID proses yang telah dikaitkan dengan echoapp.exe yang Anda rekam sebelumnya. Berikan alamat proses echoapp.exe yang Anda rekam sebelumnya, alih-alih contoh alamat proses yang ditunjukkan dalam contoh ini.0: kd> !process ffffe0007e6a7780 TYPE mismatch for process object at 82a9acc0
Objek proses tidak lagi tersedia, karena proses echoapp.exe tidak lagi berjalan.
Utas
Perintah untuk melihat dan mengatur utas mirip dengan perintah untuk proses. Gunakan perintah !thread untuk melihat utas. Gunakan .thread untuk mengatur utas saat ini.
Pada sistem host, masukkan
g
debugger untuk memulai ulang eksekusi kode pada sistem target.Pada sistem target, jalankan program uji driver EchoApp.exe.
Pada sistem host, titik henti dipukul dan eksekusi kode berhenti.
Breakpoint 4 hit ECHO!EchoEvtIoRead: aade54c0 55 push ebp
Untuk melihat utas yang sedang berjalan, masukkan !thread. Informasi yang mirip dengan contoh berikut harus ditampilkan:
0: kd> !thread THREAD ffffe000809a0880 Cid 0b28.1158 Teb: 00007ff7d00dd000 Win32Thread: 0000000000000000 RUNNING on processor 0 IRP List: ffffe0007bc5be10: (0006,01f0) Flags: 00060a30 Mdl: 00000000 Not impersonating DeviceMap ffffc001d83c6e80 Owning Process ffffe0008096c900 Image: echoapp.exe ...
Perhatikan nama gambar echoapp.exe. Itu menunjukkan bahwa Anda melihat utas yang terkait dengan aplikasi pengujian.
!process
Gunakan perintah untuk menentukan apakah utas ini adalah satu-satunya utas yang berjalan dalam proses yang terkait dengan echoapp.exe. Nomor utas utas yang berjalan dalam proses adalah utas yang sama yang!thread
menjalankan perintah yang ditampilkan.0: kd> !process PROCESS ffffe0008096c900 SessionId: 1 Cid: 0b28 Peb: 7ff7d00df000 ParentCid: 0f34 DirBase: 1fb746000 ObjectTable: ffffc001db6b52c0 HandleCount: 34. Image: echoapp.exe VadRoot ffffe000800cf920 Vads 30 Clone 0 Private 135. Modified 8. Locked 0. DeviceMap ffffc001d83c6e80 Token ffffc001cf5dc050 ElapsedTime 00:00:00.048 UserTime 00:00:00.000 KernelTime 00:00:00.000 QuotaPoolUsage[PagedPool] 33824 QuotaPoolUsage[NonPagedPool] 4464 Working Set Sizes (now,min,max) (681, 50, 345) (2724KB, 200KB, 1380KB) PeakWorkingSetSize 651 VirtualSize 16 Mb PeakVirtualSize 16 Mb PageFaultCount 686 MemoryPriority BACKGROUND BasePriority 8 CommitCharge 138 THREAD ffffe000809a0880 Cid 0b28.1158 Teb: 00007ff7d00dd000 Win32Thread: 0000000000000000 RUNNING on processor 0
!process 0 0
Gunakan perintah untuk menemukan alamat proses dua proses terkait dan rekam alamat proses tersebut di sini.Cmd.exe: ____________________________________________________________
EchoApp.exe: _______________________________________________________
0: kd> !process 0 0 … PROCESS ffffe0007bbde900 SessionId: 1 Cid: 0f34 Peb: 7ff72dfa7000 ParentCid: 0c64 DirBase: 19c5fa000 ObjectTable: ffffc001d8c2f300 HandleCount: 31. Image: cmd.exe … PROCESS ffffe0008096c900 SessionId: 1 Cid: 0b28 Peb: 7ff7d00df000 ParentCid: 0f34 DirBase: 1fb746000 ObjectTable: ffffc001db6b52c0 HandleCount: 34. Image: echoapp.exe …
Anda dapat menggunakan
!process 0 17
secara alternatif untuk menampilkan informasi terperinci tentang setiap proses. Output dari perintah ini bisa panjang. Output dapat dicari menggunakan Ctrl+F.Gunakan perintah untuk mencantumkan
!process
informasi proses untuk kedua proses yang menjalankan komputer Anda. Berikan alamat proses dari output Anda!process 0 0
, bukan alamat yang ditampilkan dalam contoh ini.Contoh output ini adalah untuk ID proses cmd.exe yang direkam sebelumnya. Nama gambar untuk ID proses ini cmd.exe.
0: kd> !process ffffe0007bbde900 PROCESS ffffe0007bbde900 SessionId: 1 Cid: 0f34 Peb: 7ff72dfa7000 ParentCid: 0c64 DirBase: 19c5fa000 ObjectTable: ffffc001d8c2f300 HandleCount: 31. Image: cmd.exe VadRoot ffffe0007bb8e7b0 Vads 25 Clone 0 Private 117. Modified 20. Locked 0. DeviceMap ffffc001d83c6e80 Token ffffc001d8c48050 ElapsedTime 21:33:05.840 UserTime 00:00:00.000 KernelTime 00:00:00.000 QuotaPoolUsage[PagedPool] 24656 QuotaPoolUsage[NonPagedPool] 3184 Working Set Sizes (now,min,max) (261, 50, 345) (1044KB, 200KB, 1380KB) PeakWorkingSetSize 616 VirtualSize 2097164 Mb PeakVirtualSize 2097165 Mb PageFaultCount 823 MemoryPriority FOREGROUND BasePriority 8 CommitCharge 381 THREAD ffffe0007cf34880 Cid 0f34.0f1c Teb: 00007ff72dfae000 Win32Thread: 0000000000000000 WAIT: (UserRequest) UserMode Non-Alertable ffffe0008096c900 ProcessObject Not impersonating ...
Contoh output ini adalah untuk ID proses echoapp.exe yang direkam sebelumnya.
0: kd> !process ffffe0008096c900 PROCESS ffffe0008096c900 SessionId: 1 Cid: 0b28 Peb: 7ff7d00df000 ParentCid: 0f34 DirBase: 1fb746000 ObjectTable: ffffc001db6b52c0 HandleCount: 34. Image: echoapp.exe VadRoot ffffe000800cf920 Vads 30 Clone 0 Private 135. Modified 8. Locked 0. DeviceMap ffffc001d83c6e80 Token ffffc001cf5dc050 ElapsedTime 00:00:00.048 UserTime 00:00:00.000 KernelTime 00:00:00.000 QuotaPoolUsage[PagedPool] 33824 QuotaPoolUsage[NonPagedPool] 4464 Working Set Sizes (now,min,max) (681, 50, 345) (2724KB, 200KB, 1380KB) PeakWorkingSetSize 651 VirtualSize 16 Mb PeakVirtualSize 16 Mb PageFaultCount 686 MemoryPriority BACKGROUND BasePriority 8 CommitCharge 138 THREAD ffffe000809a0880 Cid 0b28.1158 Teb: 00007ff7d00dd000 Win32Thread: 0000000000000000 RUNNING on processor 0 IRP List: ffffe0007bc5be10: (0006,01f0) Flags: 00060a30 Mdl: 00000000 Not impersonating ...
Rekam alamat utas pertama yang terkait dengan dua proses di sini.
Cmd.exe: ____________________________________________________
EchoApp.exe: _________________________________________________
!Thread
Gunakan perintah untuk menampilkan informasi tentang utas saat ini.0: kd> !Thread THREAD ffffe000809a0880 Cid 0b28.1158 Teb: 00007ff7d00dd000 Win32Thread: 0000000000000000 RUNNING on processor 0 IRP List: ffffe0007bc5be10: (0006,01f0) Flags: 00060a30 Mdl: 00000000 Not impersonating DeviceMap ffffc001d83c6e80 Owning Process ffffe0008096c900 Image: echoapp.exe Attached Process N/A Image: N/A ...
Seperti yang diharapkan, utas saat ini adalah utas yang terkait dengan echoapp.exe dan dalam keadaan berjalan.
!Thread
Gunakan perintah untuk menampilkan informasi tentang utas yang terkait dengan proses cmd.exe. Berikan alamat utas yang Anda rekam sebelumnya.0: kd> !Thread ffffe0007cf34880 THREAD ffffe0007cf34880 Cid 0f34.0f1c Teb: 00007ff72dfae000 Win32Thread: 0000000000000000 WAIT: (UserRequest) UserMode Non-Alertable ffffe0008096c900 ProcessObject Not impersonating DeviceMap ffffc001d83c6e80 Owning Process ffffe0007bbde900 Image: cmd.exe Attached Process N/A Image: N/A Wait Start TickCount 4134621 Ticks: 0 Context Switch Count 4056 IdealProcessor: 0 UserTime 00:00:00.000 KernelTime 00:00:01.421 Win32 Start Address 0x00007ff72e9d6e20 Stack Init ffffd0015551dc90 Current ffffd0015551d760 Base ffffd0015551e000 Limit ffffd00155518000 Call 0 Priority 14 BasePriority 8 UnusualBoost 3 ForegroundBoost 2 IoPriority 2 PagePriority 5 Child-SP RetAddr : Args to Child : Call Site ffffd001`5551d7a0 fffff801`eed184fe : fffff801`eef81180 ffffe000`7cf34880 00000000`fffffffe 00000000`fffffffe : nt!KiSwapContext+0x76 [d:\9142\minkernel\ntos\ke\amd64\ctxswap.asm @ 109] ffffd001`5551d8e0 fffff801`eed17f79 : ffff03a5`ca56a3c8 000000de`b6a6e990 000000de`b6a6e990 00007ff7`d00df000 : nt!KiSwapThread+0x14e [d:\9142\minkernel\ntos\ke\thredsup.c @ 6347] ffffd001`5551d980 fffff801`eecea340 : ffffd001`5551da18 00000000`00000000 00000000`00000000 00000000`00000388 : nt!KiCommitThreadWait+0x129 [d:\9142\minkernel\ntos\ke\waitsup.c @ 619] ...
Utas ini dikaitkan dengan cmd.exe dan dalam keadaan tunggu.
Berikan alamat utas utas CMD.exe menunggu untuk mengubah konteks ke utas tunggu tersebut.
0: kd> .Thread ffffe0007cf34880 Implicit thread is now ffffe000`7cf34880
k
Gunakan perintah untuk melihat tumpukan panggilan yang terkait dengan utas tunggu.0: kd> k *** Stack trace for last set context - .thread/.cxr resets it # Child-SP RetAddr Call Site 00 ffffd001`5551d7a0 fffff801`eed184fe nt!KiSwapContext+0x76 [d:\9142\minkernel\ntos\ke\amd64\ctxswap.asm @ 109] 01 ffffd001`5551d8e0 fffff801`eed17f79 nt!KiSwapThread+0x14e [d:\9142\minkernel\ntos\ke\thredsup.c @ 6347] 02 ffffd001`5551d980 fffff801`eecea340 nt!KiCommitThreadWait+0x129 [d:\9142\minkernel\ntos\ke\waitsup.c @ 619] 03 ffffd001`5551da00 fffff801`ef02e642 nt!KeWaitForSingleObject+0x2c0 [d:\9142\minkernel\ntos\ke\wait.c @ 683] ...
Elemen tumpukan panggilan seperti
KiCommitThreadWait
menunjukkan bahwa utas ini tidak berjalan seperti yang diharapkan.
Untuk informasi selengkapnya tentang utas dan proses, lihat referensi berikut ini:
IRQL, mendaftar, dan mengakhiri sesi WinDbg
Di bagian ini, tampilkan tingkat permintaan interupsi (IRQL) dan konten register.
Menampilkan IRQL yang disimpan
IRQL digunakan untuk mengelola prioritas layanan interupsi. Setiap prosesor memiliki pengaturan IRQL yang dapat dinaikkan atau diturunkan utasnya. Gangguan yang terjadi pada atau di bawah pengaturan IRQL prosesor ditutupi dan tidak mengganggu operasi saat ini. Interupsi yang terjadi di atas pengaturan IRQL prosesor lebih diutamakan daripada operasi saat ini.
Pada sistem host, ekstensi !irql menampilkan IRQL pada prosesor komputer target saat ini sebelum pemutusan debugger terjadi. Ketika komputer target masuk ke debugger, IRQL berubah, tetapi IRQL yang efektif tepat sebelum pemutusan debugger disimpan dan ditampilkan oleh !irql
.
0: kd> !irql
Debugger saved IRQL for processor 0x0 -- 2 (DISPATCH_LEVEL)
Lihat register
Pada sistem host, tampilkan konten register untuk utas saat ini pada prosesor saat ini dengan menggunakan perintah r (Registers).
0: kd> r
rax=000000000000c301 rbx=ffffe00173eed880 rcx=0000000000000001
rdx=000000d800000000 rsi=ffffe00173eed8e0 rdi=ffffe00173eed8f0
rip=fffff803bb757020 rsp=ffffd001f01f8988 rbp=ffffe00173f0b620
r8=000000000000003e r9=ffffe00167a4a000 r10=000000000000001e
r11=ffffd001f01f88f8 r12=0000000000000000 r13=ffffd001f01efdc0
r14=0000000000000001 r15=0000000000000000
iopl=0 nv up ei pl nz na pe nc
cs=0010 ss=0018 ds=002b es=002b fs=0053 gs=002b efl=00000202
nt!DbgBreakPointWithStatus:
fffff803`bb757020 cc int 3
Atau, Anda dapat menampilkan konten register dengan memilih Lihat>Daftar. Untuk informasi selengkapnya, lihat r (Registers).
Melihat konten register dapat membantu saat melangkah melalui eksekusi kode bahasa assembly dan dalam skenario lain. Untuk informasi selengkapnya tentang pembongkaran bahasa rakitan, lihat Pembongkaran anotasi x86 dan Pembongkaran x64 yang diannotasi.
Untuk informasi tentang konten register, lihat arsitektur x86 dan arsitektur x64.
Mengakhiri sesi WinDbg
Jika Anda ingin membiarkan debugger terlampir, tetapi ingin mengerjakan target, hapus titik henti apa pun menggunakan bc *
, sehingga komputer target tidak akan mencoba menyambungkan ke debugger komputer host. Kemudian gunakan g
perintah untuk membiarkan komputer target berjalan lagi.
Untuk mengakhiri sesi debugging, pada sistem host, masuk ke debugger dan masukkan qd
perintah (Keluar dan Lepaskan) atau pilih Hentikan Debugging dari menu.
0: kd> qd
Untuk informasi selengkapnya, lihat Mengakhiri sesi penelusuran kesalahan di WinDbg.
Sumber daya penelusuran kesalahan Windows
Informasi lebih lanjut tersedia pada penelusuran kesalahan Windows. Beberapa buku ini menggunakan versi Windows sebelumnya seperti Windows Vista dalam contohnya, tetapi konsep yang dibahas berlaku untuk sebagian besar versi Windows.
Buku
- Debugging Windows Tingkat Lanjut oleh Mario Hewardt dan Daniel Pravat
- Di dalam Windows Debugging: Panduan Praktis untuk Men-debug dan Melacak Strategi di Windows® oleh Tarik Soulami
- Windows Internals oleh Pavel Yosifovich, Alex Ionescu, Mark Russinovich dan David Solomon
Video
Vendor pelatihan