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 !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:

Koneksi 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.

Diagram yang mengilustrasikan dua komputer yang tersambung melalui hub jaringan atau router.

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:

  1. Pada sistem host, buka jendela Prompt Perintah dan masukkan ipconfig untuk menentukan alamat IP-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 . . . . . . . . . :
    
  2. Rekam alamat IP sistem host: ______________________________________

  3. 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.

  1. Pada komputer target, buka jendela Prompt Perintah sebagai Administrator. Masukkan perintah ini untuk mengaktifkan penelusuran kesalahan:

    bcdedit /set {default} DEBUG YES
    
  2. Masukkan perintah ini untuk mengaktifkan penandatanganan pengujian:

    bcdedit /set TESTSIGNING ON 
    
  3. 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.

  4. 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.

    Cuplikan layar kotak dialog Pemberitahuan Keamanan Windows yang menunjukkan Windows Firewall memblokir beberapa fitur aplikasi.

  5. 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.

  6. 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
    
  7. Mulai ulang sistem target.

  8. 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.

  1. 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.

    Layar utama di debugger memperlihatkan output Jendela Perintah dari koneksi kernel langsung.

  2. Masukkan perintah berikut untuk mengaktifkan DML di jendela Perintah Debugger:

    0: kd> .prefer_dml 1
    DML versions of commands on by default
    
  3. 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 .

    Cuplikan layar aplikasi bantuan debugger menampilkan bantuan untuk perintah .prefer-dml.

  4. 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
    
  5. 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.

  6. 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:

  1. Unduh dan ekstrak sampel KMDF Echo dari GitHub.

    Sampel KMDF Echo terletak di folder umum .

    Cuplikan layar halaman GitHub windows-driver-samples menyoroti folder umum dan tombol unduh zip.

    1. Unduh sampel driver dalam satu file zip: Sampel driver

    2. Unduh file zip ke hard drive lokal Anda.

    3. 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.

    4. Setelah file diekstrak, buka subfolder berikut: C:\DriverSamples\general\echo\kmdf

  2. 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.

    Cuplikan layar Visual Studio yang menampilkan file device.c yang dimuat dari proyek kmdfecho.

  3. 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.

  4. 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.

  5. 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).

    Cuplikan layar halaman properti echo di Visual Studio menyoroti pengaturan pustaka runtime.

  6. Di properti driver, pastikan Mode Tanda Tangan Penandatanganan>Driver diatur ke Tanda Uji.

    Cuplikan layar halaman properti echo di Visual Studio yang menyoroti pengaturan mode tanda tangan.

  7. 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.

  1. 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.
  2. 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:

  1. Buka windows Pengaturan.

  2. Di Pembaruan dan Keamanan, pilih Pemulihan.

  3. Di bawah Startup tingkat lanjut, pilih Mulai Ulang Sekarang.

  4. Saat komputer dimulai ulang, pilih Opsi startup. Di Windows 10, pilih Pemecahan Masalah>Opsi>tingkat lanjut Startup Pengaturan , lalu pilih Mulai ulang.

  5. Pilih Nonaktifkan penegakan tanda tangan driver dengan menekan tombol F7.

  6. 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.

Cuplikan layar peringatan Keamanan Windows yang menyatakan Windows tidak dapat memverifikasi penerbit piranti lunak pengandar.

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.

Cuplikan layar pohon Device Manager menyoroti contoh driver echo WDF.

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:

  1. 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
    
  2. Gunakan Ctrl+Break (Scroll Lock) untuk memecah kode yang berjalan pada sistem target.

  3. Untuk mengatur jalur simbol ke server simbol Microsoft di lingkungan WinDbg, gunakan .symfix perintah .

    0: kd> .symfix
    
  4. 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
  1. 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.

  2. 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*
    
  3. 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).

  4. !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
    … 
    
  5. 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
    ...
    
  6. 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.

  1. 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…
    …
    
  2. Gunakan Ctrl+F untuk mencari dalam output yang dihasilkan untuk mencari nama driver perangkat, echo.

    Cuplikan layar kotak dialog Temukan di WinDbg mencari istilah 'echo'.

  3. 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)
    …
    
  4. 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.
    
  5. 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.

Diagram yang mengilustrasikan pohon simpul perangkat yang terdiri dari sekitar 20 simpul.

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.

  1. Pada sistem host, gunakan UI WinDbg untuk mengonfirmasi bahwa Mode Sumber Debug>diaktifkan dalam sesi WinDbg saat ini.

  2. Masukkan perintah berikut untuk menambahkan lokasi kode lokal Anda ke jalur sumber:

    .srcpath+ C:\DriverSamples\KMDF_Echo_Sample\driver\AutoSync
    
  3. Masukkan perintah berikut untuk menambahkan lokasi simbol lokal Anda ke jalur simbol:

    .sympath+ C:\DriverSamples\KMDF_Echo_Sample\driver\AutoSync
    
  4. 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 menemukan DeviceAdd 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 adalah ECHO!EchoEvtDeviceAdd.

    Atau, tinjau kode sumber untuk menemukan nama fungsi untuk titik henti Anda.

  5. 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 menggunakan AddDevice 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.

  6. 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.

  7. Mulai ulang eksekusi kode pada sistem target dengan memasukkan g perintah (go).

  8. Pada sistem target, di Windows, buka Manajer Perangkat dengan menggunakan ikon atau masukkan mmc devmgmt.msc. Di Manajer Perangkat, perluas node Sampel .

  9. Pilih dan tahan atau klik kanan entri driver echo KMDF dan pilih Nonaktifkan dari menu.

  10. Pilih dan tahan atau klik kanan entri driver echo KMDF lagi dan pilih Aktifkan dari menu.

  11. 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.

    Cuplikan layar WinDbg yang menampilkan kode sampel lokal dan jendela perintah.

  12. 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.

    Cuplikan layar jendela kode dengan karakter kurung kurawal disorot pada awal rutinitas AddDevice.

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.

Cuplikan layar WinDbg yang menampilkan jendela 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.

Cuplikan layar WinDbg yang menampilkan jendela 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.
  1. 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.

    Cuplikan layar WinDbg yang menampilkan jendela tumpukan panggilan.

  2. 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.

  1. Pada sistem host, masukkan dv perintah untuk memeriksa variabel lokal yang terkait dengan EchoEvtIo rutinitas:

    0: kd> dv ECHO!EchoEvtIo*
    ECHO!EchoEvtIoQueueContextDestroy
    ECHO!EchoEvtIoWrite
    ECHO!EchoEvtIoRead         
    
  2. Hapus titik henti sebelumnya dengan menggunakan bc *:

    0: kd> bc *  
    
  3. 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”
    
  4. 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
    ...
    
  5. Masukkan g untuk memulai ulang eksekusi kode:

    0: kd> g
    
  6. Pada sistem target, jalankan EchoApp.exe program uji driver pada sistem target.

  7. 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
    
  8. !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.

  9. !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 adalah ffffe0007e6a7780.

    ...
    
    PROCESS ffffe0007e6a7780
        SessionId: 1  Cid: 0f68    Peb: 7ff7cfe7a000  ParentCid: 0f34
        DirBase: 1f7fb9000  ObjectTable: ffffc001cec82780  HandleCount:  34.
        Image: echoapp.exe
    
    ...
    
  10. 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)

  11. 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).

  12. !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.

  13. !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.

  1. Pada sistem host, masukkan g debugger untuk memulai ulang eksekusi kode pada sistem target.

  2. Pada sistem target, jalankan program uji driver EchoApp.exe.

  3. Pada sistem host, titik henti dipukul dan eksekusi kode berhenti.

    Breakpoint 4 hit
    ECHO!EchoEvtIoRead:
    aade54c0 55              push    ebp
    
  4. 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.

  5. !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
    
  6. !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.

  7. 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
    ...
    
  8. Rekam alamat utas pertama yang terkait dengan dua proses di sini.

    Cmd.exe: ____________________________________________________

    EchoApp.exe: _________________________________________________

  9. !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.

  10. !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.

  11. Berikan alamat utas utas CMD.exe menunggu untuk mengubah konteks ke utas tunggu tersebut.

    0: kd> .Thread ffffe0007cf34880
    Implicit thread is now ffffe000`7cf34880
    
  12. 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.

Lihat juga