Bagikan melalui


Lab meng-debug driver Windows langkah demi langkah (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 debugging driver tingkat lanjut (!commands)
  • Menggunakan simbol
  • Mengatur titik henti dalam debugging langsung
  • Menampilkan tumpukan panggilan
  • Menampilkan pohon perangkat Plug and Play
  • Bekerja dengan utas dan konteks proses

Penelusuran kesalahan pada mode pengguna dan kernel

Saat bekerja dengan debugger Windows, Anda dapat melakukan dua jenis debugging:

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 modus 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 pemecahan masalah, kadang-kadang disebut "bang" !commands, yang digunakan untuk pemecahan masalah mode kernel.

Penyiapan laboratorium

Anda memerlukan perangkat keras berikut untuk menyelesaikan lab:

  • Laptop atau komputer desktop (host) yang menjalankan Windows 11
  • Laptop kedua atau komputer desktop (target) yang menjalankan Windows 11
  • 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 11
  • Windows Driver Kit (WDK) untuk Windows 11
  • Contoh driver echo untuk Windows 11

Lab memiliki bagian berikut:

Menyambungkan ke sesi WinDbg mode kernel

Di bagian ini, konfigurasikan debug 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 terhubung 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.

Konfigurasi debugging kernel-mode menggunakan Ethernet

Merekam alamat IP host

Untuk mengaktifkan debugging mode kernel pada sistem target:

  1. 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 . . . . . . . . . :
    
  2. Rekam alamat IP sistem host: ______________________________________

Ubah pengaturan boot untuk mengaktifkan debugging

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.

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.

Untuk menggunakan utilitas KDNET untuk mengaktifkan penelusuran kesalahan mode kernel pada sistem target, lakukan langkah-langkah berikut.

  1. Pada sistem host, temukan direktori WDK KDNET. Secara default terletak di sini.

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

Lab ini mengasumsikan bahwa kedua PC menjalankan Windows versi 64 bit baik target maupun host. Jika itu bukan masalahnya, pendekatan terbaik adalah menjalankan alat dengan "bitness" yang sama pada host seperti yang dijalankan oleh target. Misalnya jika target menjalankan Windows 32 bit, jalankan versi 32 debugger pada host. Untuk informasi selengkapnya, lihat Memilih Alat Debugging 32-Bit atau 64-Bit.

  1. Temukan kedua file ini dan salin ke berbagi jaringan atau flash drive, sehingga file tersebut akan tersedia pada komputer tujuan.

    kdnet.exe

    VerifiedNICList.xml

  2. Pada komputer target, buka jendela Prompt Perintah sebagai Administrator. Masukkan perintah ini untuk memvalidasi bahwa NIC pada PC target didukung.

C:\KDNET>kdnet

Network debugging is supported on the following NICs:
busparams=0.25.0, Intel(R) 82579LM Gigabit Network Connection, KDNET is running on this NIC.kdnet.exe
  1. Ketik perintah ini untuk mengatur alamat IP sistem host. Gunakan alamat IP aktual sistem host yang Anda rekam alih-alih 169.182.1.1 yang ditunjukkan dalam output sampel. Pilih alamat port unik untuk setiap pasangan target/host yang bekerja sama dengan Anda, seperti 50010.
C:\>kdnet 169.182.1.1 50010

Enabling network debugging on Intel(R) 82577LM Gigabit Network Connection.
Key=2steg4fzbj2sz.23418vzkd4ko3.1g34ou07z4pev.1sp3yo9yz874p
  1. 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.
    

    Nota

    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.

  2. 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 alat dengan bitness yang sama pada host yang dijalankan oleh 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.

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

  5. 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 bantuan perintah referensi menggunakan perintah .hh. Masukkan perintah berikut untuk melihat bantuan referensi perintah untuk .prefer_dml:

    0: kd> .hh .prefer_dml
    

    File bantuan Debugger menampilkan bantuan untuk perintah .prefer_dml.

    Cuplikan layar aplikasi bantuan debugger yang 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 (List Loaded Modules) 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 opsi v (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 mempelajari cara kerja WinDbg, lab ini menggunakan pengandar sampel template 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 sampel Echo:

  1. Pertama, unduh dan ekstrak KMDF Echo Sample 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 pada file zip, lalu 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 >Buka>Proyek/Solusi... 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. Di 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 harus dimodifikasi untuk menggunakan nilai yang tidak tumpang tindih dengan driver yang sudah 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 perpustakaan waktu proses. Buka halaman properti driver echo dan temukan C/C++>Code Generation. Ubah Pustaka Runtime menjadi Multi-utas Debug (/MTd). Untuk informasi selengkapnya tentang opsi build, lihat /MD, /MT, /LD (Gunakan Pustaka Run-Time).

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

  6. Di properti driver, pastikan Driver Signing>Sign Mode diatur ke Test Sign.

    Tangkapan layar halaman properti echo di Visual Studio yang menyoroti pengaturan mode sinyal.

  7. Di Visual Studio, pilih Build>Build Solution.

    Jendela build harus menampilkan pesan yang menunjukkan bahwa build untuk ketiga proyek berhasil.

Saran

Jika Anda menemukan pesan kesalahan build, gunakan nomor kesalahan build untuk menentukan perbaikan. Misalnya, kesalahan MSBuild MSB8040 menjelaskan cara bekerja dengan bibliotek yang termitigasi Spectre.

  1. Di File Explorer, buka folder yang berisi file yang diekstrak untuk sampel. Misalnya, buka C:\DriverSamples\general\echo\kmdf, jika itu adalah 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:

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

    Arsip Deskripsi
    EchoApp.exe File uji yang dapat dieksekusi Command Prompt yang berkomunikasi dengan driver echo.sys.
  2. Temukan flash drive USB atau siapkan share jaringan untuk menyalin file driver yang telah dibuat dan pengujian 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 driver 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 untuk pengujian, siapkan komputer target dengan mengaktifkan penandatanganan untuk 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 uji coba.

  1. Buka Pengaturan Windows.

  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 11, pilih Pemecahan Masalah>Pengaturan Startup opsi >Tingkat Lanjut, lalu pilih Mulai Ulang.

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

  6. Mulai ulang komputer target.

Pada sistem host, buka folder Tools 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 echo.inf. File inf berisi ID perangkat keras untuk menginstal echo.sys. Untuk sampel echo, ID perangkat keras 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.

Saran

 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 berdasarkan jenis. Di pohon perangkat, temukan Contoh Driver WDF Echo di simpul Perangkat Sampel.

Cuplikan layar pohon Manajer Perangkat yang menyoroti contoh driver echo WDF.

Masukkan echoapp untuk memulai aplikasi pengujian echo guna 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 perintah .symfix.

    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
    

    Perintah .reload dengan opsi paksa /f 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 debugging sumber, Anda harus membuat versi debug dari biner Anda. 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 debugging, lebih baik jika 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 set lab ini diatur ke prefer_dml sebelumnya, beberapa elemen output adalah link aktif yang dapat dipilih. Pilih tautan Telusuri semua simbol global dalam 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. Ekstensi !lmi menampilkan informasi terperinci tentang modul. Masukkan !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 !dh untuk menampilkan informasi header seperti yang 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
    

    Gunakan perintah dd 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, menampilkan informasi mengenai driver sampel perangkat echo dan posisinya dalam 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 node perangkat, lihat !devnode.

  1. Pada sistem host, untuk melihat semua simpul perangkat di pohon perangkat Plug and Play, masukkan perintah !devnode 0 1.

    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' dari WinDbg mencari kata 'gema'.

  3. Driver perangkat echo harus dimuat. Gunakan perintah !devnode 0 1 echo untuk menampilkan informasi Plug and Play yang terkait dengan driver perangkat echo Anda seperti yang 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. Keluaran yang ditampilkan dalam perintah sebelumnya mencakup PDO yang terkait dengan instans driver Anda yang aktif, dalam contoh ini, 0xffffe0007b71a960. Masukkan perintah !devobj <PDO address> untuk menampilkan informasi Plug and Play yang terkait dengan driver perangkat echo. Gunakan alamat PDO yang !devnode tampilkan 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 ditampilkan dalam perintah !devnode 0 1 mencakup alamat PDO yang terkait dengan instans driver Anda yang sedang berjalan, dalam contoh ini 0xffffe0007b71a960. Masukkan perintah !devstack <PDO address> untuk menampilkan informasi Plug and Play yang terkait dengan driver perangkat. Gunakan alamat PDO yang !devnode tampilkan 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 serta tumpukan perangkat.

Bekerja dengan titik henti dan kode sumber

Di bagian ini, atur titik henti dan lakukan langkah demi 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. Melangkah maju dalam kode dari titik tersebut untuk mendebug bagian kode tertentu.

Untuk mengatur titik henti menggunakan perintah debug, gunakan salah satu perintah b berikut.

Perintah Deskripsi
bp Menetapkan breakpoint yang aktif sampai modul dilepas muatannya.
bu Mengatur titik henti yang belum terpecahkan ketika modul dibongkar dan diaktifkan kembali ketika modul dimuat ulang.
bm Mengatur titik henti untuk simbol. Perintah ini menggunakan bu atau bp dengan tepat dan memungkinkan karakter pengganti (*) digunakan untuk mengatur titik henti pada setiap simbol yang cocok, seperti semua metode di sebuah kelas.

Untuk informasi selengkapnya, lihat penelusuran kesalahan kode sumber di WinDbg.

  1. Pada sistem host, gunakan UI WinDbg untuk mengonfirmasi bahwa Debug>Mode Sumber 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. Gunakan perintah x 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 nama fungsi DeviceAdd.

    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 metode DeviceAdd untuk driver echo Anda adalah ECHO!EchoEvtDeviceAdd.

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

  5. Atur titik henti dengan perintah bm menggunakan nama driver, diikuti dengan nama fungsi, misalnya, AddDevice, tempat Anda ingin mengatur titik henti, dipisahkan oleh tanda seru. Lab ini menggunakan AddDevice untuk memantau proses pemuatan driver.

    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 bersyarat di WinDbg dan debugger Windows lainnya.

  6. Cantumkan titik henti saat ini untuk mengonfirmasi bahwa titik henti telah diatur dengan memasukkan perintah bl:

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

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

  8. Pada sistem target, di Windows, buka Device Manager dengan menggunakan ikon atau memasukkan mmc devmgmt.msc. Di Pengelola Perangkat, perluas simpul 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 seharusnya dijalankan. Eksekusi kode driver pada sistem target harus dihentikan. Ketika breakpoint terpenuhi, eksekusi akan 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 perintah p atau menekan F10 hingga Anda mencapai akhir rutinitas AddDevice berikut. Karakter Brace (}) disorot seperti yang terlihat.

    Cuplikan layar dari jendela kode dengan karakter kurung kurawal yang 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. Gunakan perintah ba (putuskan akses), dengan sintaks berikut:

ba <access> <size> <address> {options}
Pilihan Deskripsi
e eksekusi: saat CPU mengambil instruksi dari sebuah alamat
r baca/tulis: ketika CPU membaca atau menulis ke alamat
w Proses penulisan: 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. Word harus berakhir pada alamat yang dapat dibagi dengan 2, dword harus dapat dibagi dengan 4, dan quad word 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.

  • Hentikan sementara (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 berlangsung hingga 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 kesalahan 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 Debug>Mode Sumber.
  • Masuk (F11) Perintah ini seperti langkah atas, kecuali bahwa eksekusi panggilan masuk ke rutinitas yang disebut.
  • Melangkah ke luar (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 sudah bosan atau merasa cukup dengan rutinitas ini.

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 berhenti pada 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 tampilan >item menu lokal 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 sudah bosan dengan rutinitas.

Untuk informasi selengkapnya, lihat Debugging Kode Sumber di WinDbg (Klasik) dalam dokumentasi referensi debugging.

Bagian 8: Menampilkan variabel dan tumpukan panggilan

Di Bagian 8, Anda akan menampilkan informasi tentang variabel dan tumpukan panggilan.

Lab ini mengasumsikan bahwa Anda berhenti di rutinitas AddDevice menggunakan proses yang telah dijelaskan sebelumnya. Untuk melihat tampilan output di sini, ulangi langkah-langkah yang dijelaskan sebelumnya, jika perlu.

<- Pada sistem host

Menampilkan variabel

Gunakan tampilan >item menu lokal 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 perintah dv:

0: kd> dv
         Driver = 0x00001fff`7ff9c838
     DeviceInit = 0xffffd001`51978190
         status = 0n0

Call stack adalah rangkaian panggilan fungsi yang telah menuju posisi penghitung program saat ini. Fungsi paling atas pada tumpukan panggilan adalah fungsi saat ini, dan fungsi berikutnya adalah fungsi yang memanggil fungsi saat ini, dan seterusnya.

Untuk menampilkan tumpukan panggilan, gunakan perintah k*.

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 agar tumpukan panggilan tetap tersedia, pilih tampilan >untuk melihat tumpukan panggilan. Pilih kolom di bagian atas jendela untuk mengalihkan tampilan informasi tambahan.

    Cuplikan layar WinDbg yang menampilkan jendela tumpukan panggilan.

  2. Gunakan perintah kn untuk menampilkan tumpukan panggilan saat melakukan debugging kode adaptor sampel dalam keadaan penghentian sementara.

    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) memanggil ke dalam kode Plug and Play (PnP) yang memanggil kode kerangka kerja driver (WDF) yang kemudian memanggil fungsi driver echo DeviceAdd.

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 !process debugger. Atur titik henti untuk memeriksa proses yang digunakan saat suara diputar.

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

    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 rutinitas EchoEvtIo 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 program pengujian driver EchoApp.exe pada sistem target.

  7. Pada sistem host, ketika aplikasi pengujian berjalan, rutinitas I/O di driver dipanggil. Panggilan ini menyebabkan breakpoint (titik henti) diaktifkan, sehingga eksekusi kode driver pada sistem target pun terhenti.

    Breakpoint 2 hit
    ECHO!EchoEvtIoWrite:
    fffff801`0bf95810 4c89442418      mov     qword ptr [rsp+18h],r8
    
  8. Gunakan perintah !process 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
    

    Hasil keluaran menunjukkan bahwa proses dikaitkan dengan utas echoapp.exe, yang sedang berjalan ketika titik henti pada peristiwa penulisan pada driver terpicu. Untuk informasi selengkapnya, lihat !process.

  9. Gunakan !process 0 0 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 itu, alamat proses 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 debugger untuk menjalankan penerusan kode hingga echoapp.exe selesai berjalan. Ini sering mencapai titik henti dalam peristiwa pembacaan dan penulisan. Saat echoapp.exe selesai, masuk ke debugger dengan menekan Ctrl+ScrLk (Ctrl+Break).

  12. Gunakan perintah !process 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. Gunakan perintah !process 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.

Benang

Perintah yang digunakan untuk melihat dan mengatur thread mirip dengan perintah untuk proses. Gunakan perintah !thread untuk melihat utas. Gunakan .thread untuk mengatur utas saat ini.

  1. Pada sistem host, masukkan g ke 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 diaktifkan 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 thread yang terkait dengan aplikasi uji.

  5. Gunakan perintah !process untuk menentukan apakah utas ini adalah satu-satunya utas yang berjalan dalam proses yang terkait dengan echoapp.exe. Nomor utas dari utas yang berjalan dalam proses adalah utas yang sama yang ditampilkan oleh perintah !thread.

    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. Gunakan perintah !process 0 0 untuk menemukan alamat proses dari dua proses terkait dan merekam 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 untuk menampilkan informasi terperinci tentang setiap proses. Hasil dari perintah ini bisa sangat panjang. Output dapat dicari menggunakan Ctrl+F.

  7. Gunakan perintah !process untuk mencantumkan informasi proses untuk kedua proses yang menjalankan komputer Anda. Berikan alamat proses dari output !process 0 0 Anda, 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. Catat alamat utas pertama yang terkait dengan dua proses di sini.

    Cmd.exe: ____________________________________________________

    EchoApp.exe: _________________________________________________

  9. Gunakan perintah !Thread 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. Gunakan perintah !Thread untuk menampilkan informasi tentang utas yang terkait dengan proses cmd.exe. Berikan alamat utas yang Anda catat 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 CMD.exe yang menunggu untuk mengubah konteks ke utas yang menunggu tersebut.

    0: kd> .Thread ffffe0007cf34880
    Implicit thread is now ffffe000`7cf34880
    
  12. Gunakan perintah k untuk melihat tumpukan panggilan yang terkait dengan thread yang menunggu.

    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 berfungsi sebagaimana mestinya.

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 oleh utas. Gangguan yang terjadi pada atau di bawah pengaturan IRQL prosesor ditutupi dan tidak mengganggu operasi saat ini. Interupsi yang terjadi melebihi pengaturan IRQL prosesor memiliki prioritas lebih atas 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 daftar register

Pada sistem host, tampilkan isi dari registers 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

Sebagai alternatif, Anda dapat menampilkan isi register dengan memilih Lihat>Register. Untuk informasi selengkapnya, lihat r (Daftar).

Melihat isi register dapat membantu saat menelusuri eksekusi kode bahasa assembly dan dalam skenario lain. Untuk informasi selengkapnya tentang pembongkaran bahasa rakitan, lihat Pembongkaran x86 yang Dianotasi dan Pembongkaran x64 yang Dianotasi.

Untuk informasi tentang konten register, lihat arsitektur x86 dan arsitektur x64 .

Mengakhiri sesi WinDbg

Jika Anda ingin membiarkan debugger tetap tersambung, tetapi ingin mengerjakan target, hapus titik henti apa pun menggunakan bc *, agar komputer target tidak berusaha menyambungkan ke debugger di komputer host. Kemudian gunakan perintah g untuk membiarkan komputer target berjalan lagi.

Untuk mengakhiri sesi debugging, pada sistem host, masuk ke debugger dan masukkan perintah qd (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 pemecahan masalah 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