Bagikan melalui


Driver Debug - Lab Langkah demi Langkah (Mode Kernel Sysvad)

Lab ini menyediakan latihan langsung yang menunjukkan cara men-debug driver perangkat mode kernel audio Sysvad.

Microsoft Windows Debugger (WinDbg) adalah alat debugging berbasis Windows yang kuat yang dapat Anda gunakan untuk melakukan debugging mode pengguna dan mode kernel. WinDbg menyediakan penelusuran kesalahan tingkat sumber untuk kernel Windows, driver mode kernel, dan layanan sistem, serta aplikasi dan driver mode pengguna.

WinDbg dapat melangkah melalui kode sumber, mengatur titik henti, melihat variabel (termasuk objek C++), jejak tumpukan, dan memori. Jendela Perintah Debugger-nya memungkinkan pengguna untuk mengeluarkan berbagai perintah.

Penyiapan lab

Anda akan memerlukan perangkat keras berikut untuk dapat menyelesaikan lab:

  • Laptop atau komputer desktop (host) yang menjalankan Windows 10
  • Laptop atau komputer desktop (target) yang menjalankan Windows 10
  • Hub/router jaringan dan kabel jaringan untuk menyambungkan dua PC
  • Akses ke internet untuk mengunduh file simbol

Anda akan memerlukan perangkat lunak berikut untuk dapat menyelesaikan lab.

  • Microsoft Visual Studio 2017
  • Windows Software Development Kit (SDK) untuk Windows 10
  • Windows Driver Kit (WDK) untuk Windows 10
  • Contoh driver audio Sysvad untuk Windows 10

Untuk informasi tentang mengunduh dan menginstal WDK, lihat Mengunduh Windows Driver Kit (WDK).

Panduan penelusuran kesalahan Sysvad

Lab ini memanmbing Anda melalui proses debugging driver mode kernel. Latihan menggunakan sampel driver audio virtual Syvad. Karena driver audio Syvad tidak berinteraksi dengan perangkat keras audio aktual, driver audio dapat digunakan di sebagian besar perangkat. Lab mencakup tugas-tugas berikut:

Lab driver Echo

Driver Echo adalah driver yang lebih sederhana daripada driver audio Sysvad. Jika Anda baru menggunakan WinDbg, Anda mungkin ingin mempertimbangkan untuk terlebih dahulu menyelesaikan Debug Universal Drivers - Step-by-Step Lab (mode kernel Echo). Lab ini menggunakan kembali petunjuk penyiapan dari lab tersebut, jadi jika Anda telah menyelesaikan lab tersebut, Anda dapat melewati bagian 1 dan 2 di sini.

Bagian 1: Koneksi ke sesi WinDbg mode kernel

Di Bagian 1, Anda akan mengonfigurasi penelusuran kesalahan jaringan pada host dan sistem target.

PC di lab ini perlu dikonfigurasi untuk menggunakan koneksi jaringan Ethernet untuk penelusuran kesalahan kernel.

Lab ini menggunakan dua komputer. WinDbg berjalan pada sistem host dan driver Sysvad berjalan pada sistem target .

Gunakan hub/router jaringan dan kabel jaringan untuk menyambungkan dua PC.

Diagram memperlihatkan dua PC tersambung melalui hub/router jaringan.

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 Memulai WinDbg (Kernel-Mode). Untuk informasi selengkapnya tentang menyiapkan komputer target, lihat Menyiapkan Komputer untuk Penyebaran Driver Manual dan Menyiapkan Debugging Kernel Jaringan KDNET Secara Otomatis.

Mengonfigurasi debugging kernel-mode menggunakan ethernet

Untuk mengaktifkan penelusuran kesalahan mode kernel pada sistem target, lakukan langkah-langkah berikut.

<- Pada sistem host

  1. Buka prompt perintah pada sistem host dan ketik ipconfig /all untuk menentukan alamat IP-nya.
C:\>ipconfig /all
Windows IP Configuration

 Host Name . . . . . . . . . . . . : TARGETPC
...

Ethernet adapter Ethernet:
   Connection-specific DNS Suffix  . :
   Link-local IPv6 Address . . . . . : fe80::c8b6:db13:d1e8:b13b3
   Autoconfiguration IPv4 Address. . : 169.182.1.1
   Subnet Mask . . . . . . . . . . . : 255.255.0.0
   Default Gateway . . . . . . . . . :
  1. Rekam alamat IP Sistem host: ______________________________________

  2. Catat Nama Host Sistem host: ______________________________________

-> Pada sistem target

  1. Buka prompt perintah pada sistem target dan gunakan perintah ping untuk mengonfirmasi konektivitas jaringan antara kedua sistem. Gunakan alamat IP aktual sistem host yang Anda rekam alih-alih 169.182.1.1 yang ditunjukkan dalam output sampel.
C:\> ping 169.182.1.1

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

Untuk menggunakan utilitas KDNET untuk mengaktifkan penelusuran kesalahan mode kernel pada sistem target, lakukan peforming 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 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 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 drive jempol, sehingga file tersebut akan tersedia di komputer target.

    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

Penting

Sebelum menggunakan BCDEdit untuk mengubah informasi boot, Anda mungkin perlu menangguhkan sementara fitur keamanan Windows seperti BitLocker dan Boot Aman pada PC pengujian. Aktifkan kembali fitur keamanan ini saat pengujian selesai dan kelola PC pengujian dengan tepat, saat 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. Ketik perintah ini untuk mengonfirmasi bahwa dbgsettings diatur dengan benar.
C:\> bcdedit /dbgsettings
busparams               0.25.0
key                     2steg4fzbj2sz.23418vzkd4ko3.1g34ou07z4pev.1sp3yo9yz874p
debugtype               NET
hostip                  169.182.1.1
port                    50010
dhcp                    Yes
The operation completed successfully.

Salin kunci unik yang dihasilkan secara otomatis ke dalam file teks, untuk menghindari harus mengetikkannya di PC host. Salin file teks dengan kunci ke sistem host.

CatatanFirewall dan debugger

Jika Anda menerima pesan pop-up dari firewall, dan Anda ingin menggunakan debugger, centang ketiga kotak tersebut.

Cuplikan layar pemberitahuan Keamanan Windows menunjukkan bahwa Windows Firewall telah memblokir beberapa fitur aplikasi.

<- Pada sistem host

  1. Di komputer host, buka jendela Prompt Perintah sebagai Administrator. Ubah ke direktori WinDbg.exe. Kami akan menggunakan x64version WinDbg.exe dari Windows Driver Kit (WDK) yang diinstal sebagai bagian dari penginstalan kit Windows.
C:\> Cd C:\Program Files (x86)\Windows Kits\10\Debuggers\x64 
  1. Luncurkan WinDbg dengan debug pengguna jarak jauh menggunakan perintah berikut. Nilai untuk kunci dan port cocok dengan apa yang Anda tetapkan sebelumnya menggunakan BCDEdit pada target.
C:\> WinDbg –k net:port=50010,key=2steg4fzbj2sz.23418vzkd4ko3.1g34ou07z4pev.1sp3yo9yz874p

->Pada sistem target

Reboot sistem target.

<-Pada sistem host

Dalam satu atau dua menit, output debug harus ditampilkan pada sistem host.

Cuplikan layar Windows Debugger menampilkan output jendela perintah dari koneksi kernel langsung.

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. Anda mengetik perintah di panel yang lebih kecil (panel entri perintah) di bagian bawah jendela dan menampilkan 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.

Bagian 2: perintah dan teknik debugging mode kernel

Di Bagian 2, Anda akan menggunakan perintah debug untuk menampilkan informasi tentang sistem target.

<- Pada sistem host

Aktifkan Debugger Markup Language (DML) dengan .prefer_dml

Beberapa perintah debug menampilkan teks menggunakan Bahasa Markup Debugger yang dapat Anda pilih untuk mengumpulkan informasi lebih lanjut dengan cepat.

  1. Gunakan Ctrl+Break (Scroll Lock) di WinDBg untuk memecah kode yang berjalan pada sistem target. Mungkin perlu sedikit waktu bagi sistem target untuk merespons.
  2. Ketik perintah berikut untuk mengaktifkan DML di jendela Perintah Debugger.
0: kd> .prefer_dml 1
DML versions of commands on by default

Gunakan .hh untuk mendapatkan bantuan

Anda dapat mengakses perintah referensi menggunakan perintah .hh .

  1. Ketik perintah berikut untuk melihat bantuan referensi perintah untuk .prefer_dml.
    0: kd> .hh .prefer_dml
    

File bantuan Debugger akan menampilkan bantuan untuk perintah .prefer_dml .

Cuplikan layar aplikasi Bantuan Debugger yang menampilkan bantuan untuk perintah .prefer-dml.

Menampilkan versi Windows pada sistem target

  1. Tampilkan informasi versi terperinci pada sistem target dengan mengetik 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

Mencantumkan modul yang dimuat

  1. Anda dapat memverifikasi bahwa Anda bekerja dengan proses mode kernel yang tepat dengan menampilkan modul yang dimuat dengan mengetik perintah lm (List Loaded Modules) di jendela WinDbg.
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
...

Catatan Output yang telah dihilangkan ditunjukkan dengan "... " di lab ini.

Karena kita belum mengatur jalur simbol dan simbol yang dimuat, informasi terbatas tersedia di debugger.

Bagian 3: Mengunduh dan membangun driver audio Sysvad

Di Bagian 3, Anda akan mengunduh dan membangun driver audio Sysvad.

Biasanya, Anda akan bekerja dengan kode driver Anda sendiri ketika Anda menggunakan WinDbg. Agar terbiasa dengan men-debug driver audio, driver sampel audio virtual Sysvad digunakan. Sampel ini digunakan untuk menggambarkan bagaimana Anda dapat melakukan satu langkah melalui kode mode kernel asli. Teknik ini bisa sangat berharga untuk men-debug masalah kode mode kernel yang kompleks.

Untuk mengunduh dan membangun driver audio sampel Sysvad, lakukan langkah-langkah berikut.

  1. Unduh dan ekstrak sampel audio Sysvad dari GitHub

    Anda dapat menggunakan browser untuk melihat sampel Sysvad dan file Readme.md di sini:

    https://github.com/Microsoft/Windows-driver-samples/tree/main/audio/sysvad

    Cuplikan layar repositori GitHub yang menampilkan folder umum dan tombol Unduh ZIP.

    Lab ini, menunjukkan cara mengunduh sampel driver universal dalam satu file zip.

    a. Unduh file master.zip ke hard drive lokal Anda.

    https://github.com/Microsoft/Windows-driver-samples/archive/master.zip

    b. Pilih dan tahan (atau klik kanan) Windows-driver-samples-master.zip, dan pilih Ekstrak Semua. Tentukan folder baru, atau telusuri ke folder yang sudah ada yang akan menyimpan file yang diekstrak. Misalnya, Anda dapat menentukan C:\WDK_Samples\ sebagai folder baru tempat file diekstrak.

    c. Setelah file diekstrak, navigasikan ke subfolder berikut.

    C:\WDK_Samples\Sysvad

  2. Buka solusi driver di Visual Studio

    Di Visual Studio, pilih File>Buka>Proyek/Solusi... dan navigasikan ke folder yang berisi file yang diekstrak (misalnya, C:\WDK_Samples\Sysvad). Klik dua kali file solusi Syvad .

    Di Visual Studio, temukan Penjelajah Solusi. (Jika ini belum terbuka, pilih Penjelajah Solusi dari menu Tampilan.) Dalam Penjelajah Solusi, Anda dapat melihat satu solusi yang memiliki sejumlah proyek.

    Cuplikan layar Visual Studio dengan file adapter.cpp yang dimuat dari proyek Sysvad.

  3. Mengatur konfigurasi dan platform sampel

    Di Penjelajah Solusi, pilih dan tahan (atau klik kanan) Solusi 'sysvad' (7 dari 7 proyek), dan pilih Configuration Manager. Pastikan bahwa pengaturan konfigurasi dan platform sama untuk empat proyek tersebut. Secara default, konfigurasi diatur ke "Win10 Debug", dan platform diatur ke "Win64" untuk semua proyek. Jika Anda membuat perubahan konfigurasi dan/atau platform untuk satu proyek, Anda harus membuat perubahan yang sama untuk tiga proyek yang tersisa.

    Catatan Lab ini mengasumsikan bahwa Windows 64 bit sedang digunakan. Jika Anda menggunakan Windows 32 bit, buat driver untuk 32 bit.

  4. Periksa penandatanganan driver

    Temukan TabletAudioSample. Buka halaman properti driver Sysvad dan pastikan Mode Tanda Tangan Driver>diatur ke Tanda Uji.

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

  6. Membuat sampel menggunakan Visual Studio

    Di Visual Studio, pilih Bangun>Solusi Build.

    Jendela build harus menampilkan pesan yang menunjukkan bahwa build untuk keenam 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. Temukan file driver bawaan

    Di File Explorer, navigasikan ke folder yang berisi file yang diekstrak untuk sampel. Misalnya, Anda akan menavigasi ke C:\WDK_Samples\Sysvad, 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. Misalnya, jika Anda membiarkan pengaturan default tidak berubah, maka file driver yang dikompilasi akan disimpan ke folder bernama \x64\Debug untuk build debug 64-bit.

    Navigasi ke folder yang berisi file bawaan untuk driver TabletAudioSample:

    C:\WDK_Samples\Sysvad\TabletAudioSample\x64\Debug. Folder akan berisi driver .SYS TabletAudioSample, file pdp simbol, dan file inf. Anda juga perlu menemukan dll DelayAPO, KWSApo, dan KeywordDetectorContosoAdapter dan file simbol.

    Untuk menginstal driver, Anda akan memerlukan file berikut.

    Nama file Deskripsi
    TabletAudioSample.sys File driver.
    TabletAudioSample.pdb File simbol driver.
    tabletaudiosample.inf File informasi (INF) yang berisi informasi yang diperlukan untuk menginstal driver.
    KeywordDetectorContosoAdapter.dll Contoh detektor kata kunci.
    Kata KunciDetectorContosoAdapter.pdb Contoh file simbol detektor kata kunci.
    DelayAPO.dll Sampel APO penundaan.
    DelayAPO.pdb File simbol APO penundaan.
    KWSApo.dll Contoh APO spotter kata kunci.
    KWSApo.pdb File simbol spotter kata kunci.
    TabletAudioSample.cer File sertifikat TabletAudioSample.
  2. Temukan drive jempol USB atau siapkan berbagi jaringan untuk menyalin file driver bawaan dari host ke sistem target.

Di bagian berikutnya, Anda akan menyalin kode ke sistem target, dan menginstal dan menguji driver.

Bagian 4: Instal sampel driver audio Sysvad pada sistem target

Di Bagian 4, Anda akan menggunakan devcon untuk menginstal driver audio Sysvad.

-> Pada sistem target

Komputer tempat Anda menginstal pengandar disebut komputer target atau komputer pengujian. Biasanya, ini adalah komputer 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 menyebarkan driver, Anda harus menyiapkan komputer target dengan mengaktifkan penandatanganan pengujian. Setelah itu Anda siap untuk menjalankan sampel driver bawaan pada sistem target.

Untuk menginstal driver pada sistem target, lakukan langkah-langkah berikut.

  1. Mengaktifkan driver yang ditandatangani pengujian

    Untuk mengaktifkan kemampuan untuk menjalankan 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 PC dimulai ulang, pilih Pecahkan Masalah.

    5. Lalu pilih Opsi tingkat lanjut, Mulai Pengaturan lalu pilih Mulai Ulang.

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

    7. PC akan dimulai dengan nilai baru di tempat.

  2. -> Pada sistem target

    Pasang driver

    Instruksi berikut menunjukkan kepada Anda cara menginstal dan menguji driver sampel.

    File INF yang diperlukan untuk menginstal driver ini adalah TabletAudioSample.inf. Pada komputer target, buka jendela Prompt Perintah sebagai Administrator. Navigasi ke folder paket driver Anda, klik kanan file TabletAudioSample.inf, lalu pilih Instal.

    Kotak dialog akan 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 bahwa Windows tidak dapat memverifikasi penerbit.

    Tip

     Jika Anda memiliki masalah dengan penginstalan, periksa file berikut untuk informasi selengkapnya. %windir%\inf\setupapi.dev.log

    Untuk instruksi selengkapnya, lihat Mengonfigurasi Komputer untuk Penyebaran, Pengujian, dan Penelusuran Kesalahan Driver.

    File INF berisi ID perangkat keras untuk menginstal tabletaudiosample.sys. Untuk sampel Syvad, ID perangkat kerasnya adalah: root\sysvad_TabletAudioSample

  3. Memeriksa driver di Manajer Perangkat

    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 Perangkat Audio Virtual (WDM) - Sampel Tablet di simpul Perangkat Audio. Ini biasanya berada di bawah node Suara, video, dan pengontrol game. Konfirmasikan bahwa itu diinstal dan aktif.

    Sorot driver untuk perangkat keras aktual pada PC di Manajer Perangkat. Kemudian pilih dan tahan (atau klik kanan) driver dan pilih nonaktifkan untuk menonaktifkan driver.

    Konfirmasikan di Manajer Perangkat bahwa driver perangkat keras audio, menampilkan panah bawah, yang menunjukkan bahwa pengandar tersebut dinonaktifkan.

    Cuplikan layar pohon Manajer Perangkat dengan Sampel Tablet Perangkat Audio Virtual disorot.

    Setelah berhasil menginstal driver sampel, Anda sekarang siap untuk mengujinya.

Menguji driver audio Sysvad

  1. 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 Perangkat Audio Virtual (WDM) - Sampel Tablet.

  2. Buka Panel Kontrol dan navigasikan ke Perangkat Keras dan Pengelolaan Suara>perangkat audio. Dalam kotak dialog Suara, pilih ikon speaker berlabel Perangkat Audio Virtual (WDM) - Sampel Tablet, lalu pilih Atur Default, tetapi jangan pilih OK. Ini akan membuat kotak dialog Suara tetap terbuka.

  3. Temukan MP3 atau file audio lainnya di komputer target dan klik dua kali untuk memutarnya. Kemudian dalam kotak dialog Suara, verifikasi bahwa ada aktivitas dalam indikator tingkat volume yang terkait dengan Driver Sampel Perangkat Audio Virtual (WDM) - Tablet.

Bagian 5: Gunakan WinDbg untuk menampilkan informasi tentang driver

Di Bagian 5, Anda akan mengatur jalur simbol dan menggunakan perintah debugger kernel untuk menampilkan informasi tentang driver sampel Sysvad.

Simbol memungkinkan WinDbg menampilkan informasi tambahan seperti nama variabel, yang bisa sangat berharga saat penelusuran kesalahan. WinDbg menggunakan format simbol debug Microsoft Visual Studio untuk penelusuran kesalahan tingkat sumber. Ini dapat mengakses simbol atau variabel apa pun dari modul yang memiliki file simbol PDB.

Untuk memuat debugger, lakukan langkah-langkah berikut.

<-Pada sistem host

  1. Jika Anda menutup debugger, buka lagi menggunakan perintah berikut di jendela prompt perintah administrator. Ganti kunci dan port dengan apa yang sebelumnya Anda konfigurasi.

    C:\> WinDbg –k net:port=50010,key=2steg4fzbj2sz.23418vzkd4ko3.1g34ou07z4pev.1sp3yo9yz874p
    
  2. Gunakan Ctrl+Break (Scroll Lock) untuk memecah kode yang berjalan pada sistem target.

Mengatur jalur simbol

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

    0: kd> .symfix
    
  2. Untuk menambahkan lokasi simbol lokal Anda untuk menggunakan simbol lokal Anda, tambahkan jalur menggunakan .sympath+ lalu .reload /f.

    0: kd> .sympath+ C:\WDK_Samples\Sysvad
    0: kd> .reload /f
    

    Perhatikan perintah .reload dengan opsi /f force 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.

Catatan Anda harus memuat simbol yang tepat untuk menggunakan fungsionalitas tingkat lanjut yang disediakan WinDbg. Jika Anda tidak memiliki simbol yang dikonfigurasi dengan benar, Anda akan menerima pesan yang menunjukkan bahwa simbol tidak tersedia ketika Anda mencoba menggunakan fungsionalitas yang bergantung pada simbol.

0:000> dv
Unable to enumerate locals, HRESULT 0x80004005
Private symbols (symbols.pri) are required for locals.
Type “.hh dbgerr005” for details.

Server Simbol Catatan

Ada sejumlah pendekatan yang dapat digunakan untuk bekerja dengan simbol. Dalam banyak situasi, Anda dapat mengonfigurasi PC untuk mengakses simbol dari server simbol yang disediakan Microsoft saat diperlukan. Panduan ini mengasumsikan bahwa pendekatan ini akan digunakan. Jika simbol di lingkungan Anda berada di lokasi yang berbeda, ubah langkah-langkah untuk menggunakan lokasi tersebut. Untuk informasi tambahan, lihat Jalur simbol untuk debugger Windows.

CatatanMemahami persyaratan simbol kode sumber

Untuk melakukan penelusuran kesalahan sumber, Anda harus membuat versi biner yang dicentang (debug). Pengkompilasi akan membuat file simbol (file.pdb). File simbol ini akan 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, yang terbaik adalah 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. Ketik berikut ini di area perintah debugger untuk menampilkan informasi tentang driver Sysvad.

    0: kd> lm m tabletaudiosample v
    Browse full module list
    start             end                 module name
    fffff801`14b40000 fffff801`14b86000   tabletaudiosample   (private pdb symbols)  C:\Debuggers\sym\TabletAudioSample.pdb\E992C4803EBE48C7B23DC1596495CE181\TabletAudioSample.pdb
        Loaded symbol image file: tabletaudiosample.sys
        Image path: \SystemRoot\system32\drivers\tabletaudiosample.sys
        Image name: tabletaudiosample.sys
        Browse all global symbols  functions  data
        Timestamp:        Thu Dec 10 12:20:26 2015 (5669DE8A)
        CheckSum:         0004891E
    ...  
    

    Untuk informasi selengkapnya, lihat lm.

  2. Pilih tautan Telusuri semua simbol global di output debug untuk menampilkan informasi tentang simbol item yang dimulai dengan huruf a.

  3. Karena DML diaktifkan, beberapa elemen output adalah tautan panas yang dapat Anda pilih. Pilih tautan data dalam output debug untuk menampilkan informasi tentang simbol item yang dimulai dengan huruf a.

    0: kd> x /D /f tabletaudiosample!a*
     A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
    
    fffff806`9adb1000 tabletaudiosample!AddDevice (struct _DRIVER_OBJECT *, struct _DEVICE_OBJECT *)
    

    Untuk informasi, lihat x (Periksa Simbol).

  4. Ekstensi !lmi menampilkan informasi terperinci tentang modul. Ketik !lmi tabletaudiosample. Output Anda harus mirip dengan teks yang ditunjukkan di bawah ini.

    0: kd> !lmi tabletaudiosample
    Loaded Module Info: [tabletaudiosample] 
             Module: tabletaudiosample
       Base Address: fffff8069ad90000
         Image Name: tabletaudiosample.sys
       Machine Type: 34404 (X64)
         Time Stamp: 58ebe848 Mon Apr 10 13:17:12 2017
               Size: 48000
           CheckSum: 42df7
    Characteristics: 22  
    Debug Data Dirs: Type  Size     VA  Pointer
                 CODEVIEW    a7,  e5f4,    d1f4 RSDS - GUID: {5395F0C5-AE50-4C56-AD31-DD5473BD318F}
                   Age: 1, Pdb: C:\Windows-driver-samples-master\audio\sysvad\TabletAudioSample\x64\Debug\TabletAudioSample.pdb
                       ??   250,  e69c,    d29c [Data not mapped]
         Image Type: MEMORY   - Image read successfully from loaded memory.
        Symbol Type: PDB      - Symbols loaded successfully from image header.
                     C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\sym\TabletAudioSample.pdb\5395F0C5AE504C56AD31DD5473BD318F1\TabletAudioSample.pdb
           Compiler: Resource - front end [0.0 bld 0] - back end [14.0 bld 24210]
        Load Report: private symbols & lines, not source indexed 
                     C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\sym\TabletAudioSample.pdb\5395F0C5AE504C56AD31DD5473BD318F1\TabletAudioSample.pdb
    
  5. Gunakan ekstensi !dh untuk menampilkan informasi header seperti yang ditunjukkan di bawah ini.

    0: kd> !dh tabletaudiosample 
    
    File Type: EXECUTABLE IMAGE
    FILE HEADER VALUES
        8664 machine (X64)
           9 number of sections
    5669DE8A time date stamp Thu Dec 10 12:20:26 2015
    
           0 file pointer to symbol table
           0 number of symbols
          F0 size of optional header
          22 characteristics
                Executable
                App can handle >2gb addresses
    ...
    

Bagian 6: Menampilkan informasi pohon perangkat Plug and Play

Di Bagian 6, Anda akan menampilkan informasi tentang driver perangkat sampel Sysvad dan tempatnya berada di pohon perangkat Plug and Play.

Informasi tentang driver perangkat di pohon perangkat Plug and Play dapat berguna untuk pemecahan masalah. Misalnya, jika driver perangkat tidak berada di pohon perangkat, mungkin ada masalah dengan penginstalan driver perangkat.

Untuk informasi selengkapnya tentang ekstensi debug simpul perangkat, lihat !devnode.

<-Pada sistem host

  1. Untuk melihat semua simpul perangkat di pohon perangkat Plug and Play, masukkan perintah !devnode 0 1 . Perintah ini dapat memakan waktu satu atau dua menit untuk dijalankan. Selama waktu itu, "*Sibuk" akan ditampilkan di area status WinDbg.

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

    Temukan kotak dialog dengan istilah 'sysvad' yang dimasukkan di bidang pencarian.

    Entri simpul perangkat dengan nama sysvad_TabletAudioSample akan ada dalam output !devnode untuk Syvad.

      DevNode 0xffffe00086e68190 for PDO 0xffffe00089c575a0
        InstancePath is "ROOT\sysvad_TabletAudioSample\0000"
        ServiceName is "sysvad_tabletaudiosample"
        State = DeviceNodeStarted (0x308)
    ...
    

    Perhatikan bahwa alamat PDO dan alamat DevNode ditampilkan.

  3. !devnode 0 1 sysvad_TabletAudioSample Gunakan perintah untuk menampilkan informasi Plug and Play yang terkait dengan driver perangkat Sysvad kami.

    0: kd> !devnode 0 1 sysvad_TabletAudioSample
    Dumping IopRootDeviceNode (= 0xffffe00082df8d30)
    DevNode 0xffffe00086e68190 for PDO 0xffffe00089c575a0
      InstancePath is "ROOT\sysvad_TabletAudioSample\0000"
      ServiceName is "sysvad_tabletaudiosample"
      State = DeviceNodeStarted (0x308)
      Previous State = DeviceNodeEnumerateCompletion (0x30d)
      DevNode 0xffffe000897fb650 for PDO 0xffffe00089927e30
        InstancePath is "SWD\MMDEVAPI\{0.0.0.00000000}.{64097438-cdc0-4007-a19e-62e789062e20}"
        State = DeviceNodeStarted (0x308)
        Previous State = DeviceNodeStartPostWork (0x307)
      DevNode 0xffffe00086d2f5f0 for PDO 0xffffe00089939ae0
        InstancePath is "SWD\MMDEVAPI\{0.0.0.00000000}.{78880f4e-9571-44a4-a9df-960bde446487}"
        State = DeviceNodeStarted (0x308)
        Previous State = DeviceNodeStartPostWork (0x307)
      DevNode 0xffffe00089759bb0 for PDO 0xffffe000875aa060
        InstancePath is "SWD\MMDEVAPI\{0.0.0.00000000}.{7cad07f2-d0a0-4b9b-8100-8dc735e9c447}"
        State = DeviceNodeStarted (0x308)
        Previous State = DeviceNodeStartPostWork (0x307)
      DevNode 0xffffe00087735010 for PDO 0xffffe000872068c0
        InstancePath is "SWD\MMDEVAPI\{0.0.0.00000000}.{fc38551b-e69f-4b86-9661-ae6da78bc3c6}"
        State = DeviceNodeStarted (0x308)
        Previous State = DeviceNodeStartPostWork (0x307)
      DevNode 0xffffe00088457670 for PDO 0xffffe0008562b830
        InstancePath is "SWD\MMDEVAPI\{0.0.1.00000000}.{0894b831-c9fe-4c56-86a6-092380fc5628}"
        State = DeviceNodeStarted (0x308)
        Previous State = DeviceNodeStartPostWork (0x307)
      DevNode 0xffffe000893dbb70 for PDO 0xffffe00089d68060
        InstancePath is "SWD\MMDEVAPI\{0.0.1.00000000}.{15eb6b5c-aa54-47b8-959a-0cff2c1500db}"
        State = DeviceNodeStarted (0x308)
        Previous State = DeviceNodeStartPostWork (0x307)
      DevNode 0xffffe00088e6f250 for PDO 0xffffe00089f6e990
        InstancePath is "SWD\MMDEVAPI\{0.0.1.00000000}.{778c07f0-af9f-43f2-8b8d-490024f87239}"
        State = DeviceNodeStarted (0x308)
        Previous State = DeviceNodeStartPostWork (0x307)
      DevNode 0xffffe000862eb4b0 for PDO 0xffffe000884443a0
        InstancePath is "SWD\MMDEVAPI\{0.0.1.00000000}.{e4b72c7c-be50-45df-94f5-0f2922b85983}"
        State = DeviceNodeStarted (0x308)
        Previous State = DeviceNodeStartPostWork (0x307)
    
  4. Output yang ditampilkan dalam perintah sebelumnya mencakup PDO yang terkait dengan instans driver kami yang sedang berjalan, dalam contoh ini 0xffffe00089c575a0. Masukkan perintah alamat> PDO !devobj<untuk menampilkan informasi Plug and Play yang terkait dengan driver perangkat Sysvad. Gunakan alamat PDO yang ditampilkan !devnode di PC Anda, bukan alamat yang ditampilkan di sini.

    0: kd> !devobj 0xffffe00089c575a0
    Device object (ffffe00089c575a0) is for:
    0000004e \Driver\PnpManager DriverObject ffffe00082d47e60
    Current Irp 00000000 RefCount 65 Type 0000001d Flags 00001040
    SecurityDescriptor ffffc102b0f6d171 DevExt 00000000 DevObjExt ffffe00089c576f0 DevNode ffffe00086e68190 
    ExtensionFlags (0000000000)  
    Characteristics (0x00000180)  FILE_AUTOGENERATED_DEVICE_NAME, FILE_DEVICE_SECURE_OPEN
    AttachedDevice (Upper) ffffe00088386a50 \Driver\sysvad_tabletaudiosample
    Device queue is not busy.
    
  5. Output yang ditampilkan dalam perintah !devobj menyertakan nama perangkat yang terpasang: \Driver\sysvad_tabletaudiosample. Gunakan perintah !drvobj dengan masker bit 2, untuk menampilkan informasi yang terkait dengan perangkat yang terpasang.

    0: kd> !drvobj \Driver\sysvad_tabletaudiosample 2
    Driver object (ffffe0008834f670) is for:
    \Driver\sysvad_tabletaudiosample
    DriverEntry:   fffff80114b45310  tabletaudiosample!FxDriverEntry
    DriverStartIo: 00000000 
    DriverUnload:  fffff80114b5fea0                tabletaudiosample!DriverUnload
    AddDevice:     fffff80114b5f000  tabletaudiosample!AddDevice
    
    Dispatch routines:
    [00] IRP_MJ_CREATE                      fffff80117b49a20             portcls!DispatchCreate
    [01] IRP_MJ_CREATE_NAMED_PIPE           fffff8015a949a00          nt!IopInvalidDeviceRequest
    [02] IRP_MJ_CLOSE                       fffff80115e26f90                ks!DispatchCleanup
    [03] IRP_MJ_READ                        fffff80115e32710                ks!DispatchRead
    [04] IRP_MJ_WRITE                       fffff80115e327e0              ks!DispatchWrite
    [05] IRP_MJ_QUERY_INFORMATION           fffff8015a949a00         nt!IopInvalidDeviceRequest
    [06] IRP_MJ_SET_INFORMATION             fffff8015a949a00              nt!IopInvalidDeviceRequest
    [07] IRP_MJ_QUERY_EA                    fffff8015a949a00         nt!IopInvalidDeviceRequest
    [08] IRP_MJ_SET_EA                      fffff8015a949a00              nt!IopInvalidDeviceRequest
    [09] IRP_MJ_FLUSH_BUFFERS               fffff80115e32640  ks!DispatchFlush
    [0a] IRP_MJ_QUERY_VOLUME_INFORMATION    fffff8015a949a00           nt!IopInvalidDeviceRequest
    [0b] IRP_MJ_SET_VOLUME_INFORMATION      fffff8015a949a00               nt!IopInvalidDeviceRequest
    [0c] IRP_MJ_DIRECTORY_CONTROL           fffff8015a949a00           nt!IopInvalidDeviceRequest
    [0d] IRP_MJ_FILE_SYSTEM_CONTROL         fffff8015a949a00         nt!IopInvalidDeviceRequest
    [0e] IRP_MJ_DEVICE_CONTROL              fffff80115e27480               ks!DispatchDeviceIoControl
    [0f] IRP_MJ_INTERNAL_DEVICE_CONTROL     fffff8015a949a00   nt!IopInvalidDeviceRequest
    [10] IRP_MJ_SHUTDOWN                    fffff8015a949a00      nt!IopInvalidDeviceRequest
    [11] IRP_MJ_LOCK_CONTROL                fffff8015a949a00  nt!IopInvalidDeviceRequest
    [12] IRP_MJ_CLEANUP                     fffff8015a949a00           nt!IopInvalidDeviceRequest
    [13] IRP_MJ_CREATE_MAILSLOT             fffff8015a949a00               nt!IopInvalidDeviceRequest
    [14] IRP_MJ_QUERY_SECURITY              fffff80115e326a0 ks!DispatchQuerySecurity
    [15] IRP_MJ_SET_SECURITY                fffff80115e32770      ks!DispatchSetSecurity
    [16] IRP_MJ_POWER                       fffff80117b3dce0            portcls!DispatchPower
    [17] IRP_MJ_SYSTEM_CONTROL              fffff80117b13d30              portcls!PcWmiSystemControl
    [18] IRP_MJ_DEVICE_CHANGE               fffff8015a949a00 nt!IopInvalidDeviceRequest
    [19] IRP_MJ_QUERY_QUOTA                 fffff8015a949a00  nt!IopInvalidDeviceRequest
    [1a] IRP_MJ_SET_QUOTA                   fffff8015a949a00       nt!IopInvalidDeviceRequest
    [1b] IRP_MJ_PNP                         fffff80114b5f7d0 tabletaudiosample!PnpHandler
    
  6. Masukkan perintah alamat> PDO !devstack<untuk menampilkan informasi Plug and Play yang terkait dengan driver perangkat. Output yang ditampilkan dalam perintah !devnode 0 1 mencakup alamat PDO yang terkait dengan instans driver kami yang sedang berjalan. Dalam contoh ini 0xffffe00089c575a0. Gunakan alamat PDO yang ditampilkan !devnode di PC Anda, bukan alamat yang ditunjukkan di bawah ini.

    0: kd> !devstack 0xffffe00089c575a0
      !DevObj           !DrvObj            !DevExt           ObjectName
      ffffe00088d212e0  \Driver\ksthunk    ffffe00088d21430  0000007b
      ffffe00088386a50  \Driver\sysvad_tabletaudiosampleffffe00088386ba0  0000007a
    > ffffe00089c575a0  \Driver\PnpManager 00000000  0000004e
    !DevNode ffffe00086e68190 :
      DeviceInst is "ROOT\sysvad_TabletAudioSample\0000"
      ServiceName is "sysvad_tabletaudiosample"
    

Output menunjukkan bahwa kita memiliki tumpukan driver perangkat yang sangat sederhana. Driver sysvad_TabletAudioSample adalah anak dari simpul PnPManager. PnPManager adalah simpul akar.

Diagram ini menunjukkan pohon simpul perangkat yang lebih kompleks.

Diagram pohon simpul perangkat yang terdiri dari sekitar 20 simpul.

Catatan Untuk informasi selengkapnya tentang tumpukan driver yang lebih kompleks, lihat Tumpukan driver dan Simpul perangkat dan tumpukan perangkat.

Bagian 7: Bekerja dengan titik henti

Di Bagian 7, Anda akan bekerja dengan titik henti untuk menghentikan eksekusi kode pada titik tertentu.

Mengatur titik henti menggunakan perintah

Titik henti digunakan untuk menghentikan eksekusi kode pada baris kode tertentu. Anda kemudian dapat melangkah maju dalam kode dari titik itu, untuk men-debug bagian kode tertentu tersebut.

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

Bp

Mengatur titik henti yang akan 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 akan menggunakan bu atau bp dengan tepat dan memungkinkan wildcard * digunakan untuk mengatur titik henti pada setiap simbol yang cocok (seperti semua metode di kelas).

  1. Gunakan UI WinDbg untuk mengonfirmasi bahwa Mode Sumber Debug>diaktifkan dalam sesi WinDbg saat ini.

  2. Tambahkan lokasi kode lokal Anda ke jalur sumber dengan mengetik perintah berikut.

    .sympath+ C:\WDK_Samples\Sysvad
    
  3. Tambahkan lokasi simbol lokal Anda ke jalur simbol dengan mengetik perintah berikut.

    .sympath+ C:\WDK_Samples\Sysvad
    
  4. Mengatur mask debug

    Saat Anda bekerja dengan driver, mungkin berguna untuk melihat semua pesan yang mungkin ditampilkan. Ketik berikut ini untuk mengubah masker bit debug default sehingga semua pesan debug dari sistem target akan ditampilkan di debugger.

    0: kd> ed nt!Kd_DEFAULT_MASK 0xFFFFFFFF
    
  5. Atur titik henti dengan perintah bm menggunakan nama driver, diikuti dengan nama fungsi (AddDevice) tempat Anda ingin mengatur titik henti, dipisahkan oleh tanda seru.

    0: kd> bm tabletaudiosample!AddDevice
    breakpoint 1 redefined
      1: fffff801`14b5f000 @!"tabletaudiosample!AddDevice"
    

    Anda dapat menggunakan sintaks yang berbeda bersama dengan mengatur variabel seperti <modul>!<simbol>, <kelas>::<method>,'<file.cpp>:<line number>', atau melewati beberapa kali <kondisi><#>. Untuk informasi selengkapnya, lihat Menggunakan Titik Henti.

  6. Cantumkan titik henti saat ini untuk mengonfirmasi bahwa titik henti diatur dengan mengetik perintah bl .

    0: kd> bl
    1 e fffff801`14b5f000     0001 (0001) tabletaudiosample!AddDevice
    
  7. Mulai ulang eksekusi kode pada sistem target dengan mengetik perintah go g.

  8. ->Pada sistem target

    Di Windows, buka Manajer Perangkat dengan menggunakan ikon atau dengan memasukkan mmc devmgmt.msc. Di Manajer Perangkat perluas node Suara, video, dan pengontrol game. Pilih dan tahan (atau klik kanan) entri driver audio virtual dan pilih Nonaktifkan dari menu.

  9. Pilih dan tahan (atau klik kanan) entri driver audio virtual lagi dan pilih Aktifkan dari menu.

  10. <- Pada sistem host

    Ini akan menyebabkan Windows memuat ulang driver, yang memanggil AddDevice. Ini akan menyebabkan titik henti debug AddDevice diaktifkan dan eksekusi kode driver pada sistem target harus dihentikan.

    Breakpoint 1 hit
    tabletaudiosample!AddDevice:
    fffff801`14baf000 4889542410      mov     qword ptr [rsp+10h],rdx
    

    Jika jalur sumber Anda diatur dengan benar, Anda harus berhenti di rutinitas AddDevice di adapter.cpp

    {
        PAGED_CODE();
    
        NTSTATUS        ntStatus;
        ULONG           maxObjects;
    
        DPF(D_TERSE, ("[AddDevice]"));
    
        maxObjects = g_MaxMiniports;
    
        #ifdef SYSVAD_BTH_BYPASS
        // 
        // Allow three (3) Bluetooth hands-free profile devices.
        //
        maxObjects += g_MaxBthHfpMiniports * 3; 
        #endif // SYSVAD_BTH_BYPASS
    
        // Tell the class driver to add the device.
        //
        ntStatus = 
            PcAddAdapterDevice
            ( 
                DriverObject,
                PhysicalDeviceObject,
                PCPFNSTARTDEVICE(StartDevice),
                maxObjects,
                0
            );
        return ntStatus;
    } // AddDevice
    
  11. Langkah baris demi baris melalui kode dengan mengetik perintah p atau menekan F10. Anda dapat melangkah maju dari kode AddDevice sysvad ke PpvUtilCall, PnpCallAddDevice lalu ke kode Windows PipCallDriverAddDevice. Anda dapat memberikan angka ke perintah p untuk melangkah maju beberapa baris, misalnya p 5.

  12. Ketika Anda selesai melangkah melalui kode, gunakan perintah go g untuk memulai ulang eksekusi pada sistem target.

Mengatur titik henti akses memori

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}
Opsi Deskripsi

e

jalankan (ketika CPU mengambil instruksi dari alamat)

r

baca/tulis (saat CPU membaca atau menulis ke alamat)

w

tulis (ketika CPU menulis ke alamat)

Perhatikan bahwa Anda hanya dapat mengatur empat titik henti data pada waktu tertentu dan terserah Anda untuk memastikan bahwa Anda menyelaraskan data dengan benar atau Anda tidak akan memicu titik henti (kata harus berakhir di alamat yang dapat dibagi 2, kata sandi harus dapat dibagi dengan 4, dan quadwords sebesar 0 atau 8)

Misalnya, untuk mengatur titik henti baca/tulis pada alamat memori tertentu, gunakan perintah seperti ini.

ba r 4 fffff800`7bc9eff0

Mengubah status titik henti

Anda dapat mengubah titik henti yang ada dengan menggunakan perintah berikut.

Bl

Mencantumkan titik henti.

Sm

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 * untuk mengaktifkan semua titik henti.

Atau, Anda juga dapat memodifikasi titik henti dengan memilih edit>titik henti. Perhatikan bahwa kotak dialog titik henti hanya berfungsi dengan titik henti yang ada. Titik henti baru harus diatur dari baris perintah.

Mengatur titik henti di MixerVolume

Bagian yang berbeda dari kode driver audio dipanggil untuk merespons berbagai peristiwa, setelah driver perangkat dimuat. Di bagian berikutnya, kami mengatur titik henti yang akan diaktifkan ketika pengguna menyesuaikan kontrol volume untuk driver audio virtual.

Untuk mengatur titik henti di MixerVolume, lakukan langkah-langkah berikut.

  1. <- Pada sistem host

    Untuk menemukan metode yang mengubah volume, gunakan perintah x untuk mencantumkan simbol di CAdapterCommon, yang berisi volume string.

    kd> x tabletaudiosample!CAdapterCommon::*
    ...
    fffff800`7bce26a0 tabletaudiosample!CAdapterCommon::MixerVolumeWrite (unsigned long, unsigned long, long)
    …
    

    Gunakan CTRL+F untuk mencari ke atas dalam output untuk volume dan menemukan metode MixerVolumeWrite.

  2. Hapus titik henti sebelumnya menggunakan bc *.

  3. Atur titik henti simbol pada rutinitas CAdapterCommon::MixerVolumeWrite menggunakan perintah berikut.

    kd> bm tabletaudiosample!CAdapterCommon::MixerVolumeWrite
      1: fffff801`177b26a0 @!"tabletaudiosample!CAdapterCommon::MixerVolumeWrite"
    
  4. Cantumkan titik henti untuk mengonfirmasi bahwa titik henti diatur dengan benar.

    kd> bl
    1 e fffff801`177b26a0 [c:\WDK_Samples\audio\sysvad\common.cpp @ 1668]    0001 (0001) tabletaudiosample!CAdapterCommon::MixerVolumeWrite
    
  5. Mulai ulang eksekusi kode pada sistem target dengan mengetik perintah go g.

  6. Di Panel Kontrol pilih Perangkat Keras dan Suara>. Pilih dan tahan (atau klik kanan) Sampel Deskripsi Sink dan pilih Properti. Pilih tab Tingkat . Sesuaikan volume penggunjuk.

  7. Ini harus menyebabkan titik henti debug SetMixerVolume diaktifkan dan eksekusi kode driver pada sistem target harus dihentikan.

    kd> g
    Breakpoint 1 hit
    tabletaudiosample!CAdapterCommon::MixerVolumeWrite:
    fffff801`177b26a0 44894c2420      mov     dword ptr [rsp+20h],r9d
    

    Anda harus berhenti pada baris ini di common.cpp

    {
        if (m_pHW)
        {
            m_pHW->SetMixerVolume(Index, Channel, Value);
        }
    } // MixerVolumeWrite
    
  8. Gunakan perintah dv untuk menampilkan variabel saat ini dan nilainya. Informasi selengkapnya tentang variabel disediakan di bagian berikutnya dari lab ini.

    2: kd> dv
               this = 0x00000000`00000010
             ulNode = 0x344
          ulChannel = 0x210a45f8
            lVolume = 0n24
    
  9. Tekan F10 untuk satu langkah melalui kode.

  10. Tekan F5 untuk menyelesaikan eksekusi kode MixerVolumeWrite.

Ringkasan - Menelusuri kode dari jendela Perintah Debugger

Berikut ini adalah perintah yang dapat Anda gunakan untuk menelusuri kode Anda (dengan pemotongan pendek keyboard terkait yang ditampilkan dalam tanda kurung).

  • Break in (Ctrl+Break) - Perintah ini akan mengganggu sistem selama sistem berjalan dan sedang berkomunikasi dengan WinDbg (urutan di Kernel Debugger adalah Ctrl+C).

  • 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 di (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 (tempat saat ini di tumpukan panggilan). Ini berguna jika Anda telah melihat cukup rutinitas.

  • Jalankan ke kursor (F7 atau Ctrl+F10) – Tempatkan kursor di jendela sumber atau pembongkaran tempat Anda ingin eksekusi diputus, lalu tekan F7; Eksekusi kode akan berjalan ke titik tersebut. Perhatikan bahwa jika alur eksekusi kode tidak mencapai titik yang ditunjukkan oleh kursor (misalnya, pernyataan IF tidak dijalankan), WinDbg tidak akan rusak, karena eksekusi kode tidak mencapai titik yang ditunjukkan.

  • Jalankan (F5) – Jalankan hingga titik henti ditemui atau peristiwa seperti pemeriksaan bug terjadi.

Opsi tingkat lanjut

  • Atur instruksi ke baris saat ini (Ctrl+Shift+I) – Di jendela sumber, Anda dapat menempatkan kursor Anda pada garis, memasukkan pintasan keyboard ini, dan eksekusi kode akan dimulai dari titik itu segera setelah Anda membiarkannya melanjutkan (misalnya menggunakan F5 atau F10). Ini berguna jika Anda ingin mencoba kembali urutannya, tetapi perlu perawatan. Misalnya, register dan variabel tidak diatur ke apa yang akan terjadi jika eksekusi kode telah mencapai baris tersebut secara alami.

  • Pengaturan langsung register eip -- Anda dapat memasukkan nilai ke dalam eip register, dan segera setelah Anda menekan F5 (atau F10, F11, dll.), eksekusi dimulai dari alamat tersebut. Ini mirip dengan mengatur instruksi ke baris saat ini yang ditunjuk kursor, kecuali bahwa Anda menentukan alamat instruksi perakitan.

Lebih mudah untuk melangkah melalui UI daripada dari baris perintah sehingga metode ini direkomendasikan. Jika perlu, perintah berikut dapat digunakan untuk menelusuri file sumber di baris perintah:

  • .lines - Aktifkan informasi baris sumber.

  • bp main - Atur titik henti awal di awal modul Anda.

  • l+t - Langkah akan dilakukan oleh baris sumber.

  • Pilih Mode Sumber Debug>untuk memasuki mode sumber; L+t perintah tidak cukup.

  • l+s - Baris sumber akan ditampilkan saat diminta.

  • g - Jalankan program hingga "main" dimasukkan.

  • p - Jalankan satu baris sumber.

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

Mengatur titik henti dalam kode

Anda dapat mengatur titik henti dalam kode dengan menambahkan DebugBreak() pernyataan dan membangun kembali proyek dan menginstal ulang driver. Titik henti ini akan diaktifkan setiap kali driver diaktifkan, sehingga akan menjadi teknik yang akan digunakan pada tahap pengembangan awal, bukan dalam kode produksi. Teknik ini tidak fleksibel seperti mengatur titik henti secara dinamis menggunakan perintah titik henti.

Tips: Anda mungkin ingin menyimpan salinan driver Sysvad dengan titik henti yang ditambahkan untuk pekerjaan lab lebih lanjut.

  1. Atur jeda untuk terjadi setiap kali metode AddDevice dijalankan dengan menambahkan DebugBreak() pernyataan ke kode sampel.

    ...
        // Insert the DebugBreak() statment before the  PcAddAdapterDevice is called.
        //
    
        DebugBreak()
    
        // Tell the class driver to add the device.
        //
        ntStatus = 
            PcAddAdapterDevice
            ( 
                DriverObject,
                PhysicalDeviceObject,
                PCPFNSTARTDEVICE(StartDevice),
                maxObjects,
                0
            );
    
        return ntStatus;
    } // AddDevice
    
  2. Ikuti semua langkah yang dijelaskan sebelumnya untuk membangun kembali driver di Microsoft Visual Studio dan menginstalnya kembali ke komputer target. Pastikan untuk menghapus instalan driver yang ada sebelum menginstal pengandar yang diperbarui.

  3. Hapus titik henti sebelumnya dan pastikan debugger dilampirkan ke PC target.

  4. Ketika kode berjalan dan mencapai DebugBreak pernyataan, eksekusi akan berhenti dan pesan akan ditampilkan.

    KERNELBASE!DebugBreak:
    77b3b770 defe     __debugbreak
    

Bagian 8: Menampilkan variabel

Di Bagian 8, Anda akan menggunakan perintah debugger untuk menampilkan variabel.

Ini dapat berguna untuk memeriksa variabel saat kode dijalankan untuk mengonfirmasi bahwa kode berfungsi seperti yang diharapkan. Lab ini memeriksa variabel saat driver audio menghasilkan suara.

  1. Gunakan perintah dv untuk memeriksa variabel lokal yang terkait dengan tabletaudiosample! CMiniportWaveRT::New*.

    kd> dv tabletaudiosample!CMiniportWaveRT::New*
    
  2. Menghapus titik henti sebelumnya

    bc *
    
  3. Atur titik henti simbol pada rutinitas CMiniportWaveCyclicStreamMSVAD menggunakan perintah berikut.

    0: kd> bm tabletaudiosample!CMiniportWaveRT::NewStream
      1: fffff801`177dffc0 @!"tabletaudiosample!CMiniportWaveRT::NewStream"
    
  4. Mulai ulang eksekusi kode pada sistem target dengan mengetik perintah go g.

  5. -> Pada sistem target

    Temukan file media kecil (seperti file suara pemberitahuan Windows dengan ekstensi file .wav) dan pilih file untuk memutarnya. Misalnya, Anda dapat menggunakan Ring05.wav yang terletak di direktori Windows\Media.

  6. <- Pada sistem host

    Ketika file media diputar, titik henti harus diaktifkan, dan eksekusi kode driver pada sistem target harus dihentikan.

    Breakpoint 1 hit
    tabletaudiosample!CMiniportWaveRT::NewStream:
    fffff801`177dffc0 44894c2420      mov     dword ptr [rsp+20h],r9d
    

    Jendela kode sumber harus menyoroti kurung kurawal pada pintu masuk ke fungsi NewStream.

    /*++
    
    Routine Description:
    
      The NewStream function creates a new instance of a logical stream 
      associated with a specified physical channel. Callers of NewStream should 
      run at IRQL PASSIVE_LEVEL.
    
    Arguments:
    
      OutStream -
    
      OuterUnknown -
    
      Pin - 
    
      Capture - 
    
      DataFormat -
    
    Return Value:
    
      NT status code.
    
    --*/
    {
    
    ...
    
  7. Variabel lokal

    Anda dapat menampilkan nama dan nilai semua variabel lokal untuk bingkai tertentu dengan mengetik perintah dv .

    0: kd> dv
                    this = 0xffffe000`4436f8e0
               OutStream = 0xffffe000`49d2f130
            OuterUnknown = 0xffffe000`4436fa30
                     Pin = 0
                 Capture = 0x01 '
              DataFormat = 0xffffe000`44227790
    signalProcessingMode = {487E9220-E000-FFFF-30F1-D24900E0FFFF}
                ntStatus = 0n1055
                  stream = 0x00000000`00000200
    
  8. Menggunakan DML untuk Menampilkan Variabel

    Untuk menggunakan DML untuk menjelajahi variabel, pilih elemen bergaris bawah. Tindakan pilih membangun perintah dx (Ekspresi NatVis Tampilan) yang memungkinkan Anda menelusuri paling detail struktur data berlapis.

    0: kd> dx -r1 (*((tabletaudiosample!CMiniportWaveRT *)0xffffe001d10b8380))
    (*((tabletaudiosample!CMiniportWaveRT *)0xffffe001d10b8380)) :  [Type: CMiniportWaveRT]
        [+0x020] m_lRefCount      : 0
        [+0x028] m_pUnknownOuter  : 0xffffe001d1477e50 : [Type: IUnknown *]
        [+0x030] m_ulLoopbackAllocated : 0x2050
        [+0x034] m_ulSystemAllocated : 0x180
        [+0x038] m_ulOffloadAllocated : 0x0
        [+0x03c] m_dwCaptureAllocatedModes : 0x0
    
    0: kd> dx -r1 (*((tabletaudiosample!_GUID *)0xffffd001c8acd348))
    (*((tabletaudiosample!_GUID *)0xffffd001c8acd348)) : {487E9220-E000-FFFF-30F1-D24900E0FFFF} [Type: _GUID]
        [<Raw View>]    
    
    0: kd> dx -r1 -n (*((tabletaudiosample!_GUID *)0xffffd001c8acd348))
    (*((tabletaudiosample!_GUID *)0xffffd001c8acd348)) :  [Type: _GUID]
        [+0x000] Data1            : 0x487e9220
        [+0x004] Data2            : 0xe000
        [+0x006] Data3            : 0xffff
        [+0x008] Data4            :  [Type: unsigned char [8]]
    
    0: kd> dx -r1 -n (*((tabletaudiosample!unsigned char (*)[8])0xffffd001c8acd350))
    (*((tabletaudiosample!unsigned char (*)[8])0xffffd001c8acd350)) :  [Type: unsigned char [8]]
        [0]              : 0x30
        [1]              : 0xf1
        [2]              : 0xd2
        [3]              : 0x49
        [4]              : 0x0
        [5]              : 0xe0
        [6]              : 0xff
        [7]              : 0xff
    
  9. Variabel global

    Anda dapat menemukan lokasi memori variabel global dengan mengetik ? <nama> variabel.

    0: kd> ? signalProcessingMode
    Evaluate expression: -52768896396472 = ffffd001`c8acd348
    
  10. Ini mengembalikan lokasi memori variabel, dalam hal ini ffffd001'c8acd348. Anda dapat melihat konten lokasi memori dengan mencadangkan nilai lokasi yang mengetik perintah dd menggunakan lokasi memori yang dikembalikan oleh perintah sebelumnya.

    0: kd> dd ffffd001`c8acd348
    ffffd001`c8acd348  487e9220 ffffe000 49d2f130 ffffe000
    ffffd001`c8acd358  4837c468 ffffe000 18221570 ffffc000
    ffffd001`c8acd368  4436f8e0 ffffe000 487e9220 ffffe000
    ffffd001`c8acd378  18ab145b fffff801 4837c420 ffffe000
    ffffd001`c8acd388  4436f8e0 ffffe000 49d2f130 ffffe000
    ffffd001`c8acd398  4436fa30 ffffe000 00000000 00000000
    ffffd001`c8acd3a8  00000001 00000000 44227790 ffffe000
    ffffd001`c8acd3b8  18adc7f9 fffff801 495972a0 ffffe000
    
  11. Anda juga dapat menggunakan nama variabel dengan perintah dd .

    0: kd> dd signalProcessingMode
    ffffd001`c8acd348  487e9220 ffffe000 49d2f130 ffffe000
    ffffd001`c8acd358  4837c468 ffffe000 18221570 ffffc000
    ffffd001`c8acd368  4436f8e0 ffffe000 487e9220 ffffe000
    ffffd001`c8acd378  18ab145b fffff801 4837c420 ffffe000
    ffffd001`c8acd388  4436f8e0 ffffe000 49d2f130 ffffe000
    ffffd001`c8acd398  4436fa30 ffffe000 00000000 00000000
    ffffd001`c8acd3a8  00000001 00000000 44227790 ffffe000
    ffffd001`c8acd3b8  18adc7f9 fffff801 495972a0 ffffe000
    
  12. Tampilkan variabel

    Gunakan item menu Tampilkan>Lokal untuk menampilkan variabel lokal. Antarmuka ini juga menyediakan kemampuan ini untuk menelusuri paling detail struktur data yang lebih kompleks.

    Antarmuka WinDbg menampilkan kode sampel lokal dan jendela perintah.

  13. Gunakan p atau F10 untuk melangkah maju sekitar 10 baris dalam kode hingga Anda menyoroti ntStatus = IsFormatSupported(Pin, Capture, DataFormat); baris kode.

        PAGED_CODE();
    
        ASSERT(OutStream);
        ASSERT(DataFormat);
    
        DPF_ENTER(("[CMiniportWaveRT::NewStream]"));
    
        NTSTATUS                    ntStatus = STATUS_SUCCESS;
        PCMiniportWaveRTStream      stream = NULL;
        GUID                        signalProcessingMode = AUDIO_SIGNALPROCESSINGMODE_DEFAULT;
    
        *OutStream = NULL;
    
         //
        // If the data format attributes were specified, extract them.
        //
        if ( DataFormat->Flags & KSDATAFORMAT_ATTRIBUTES )
        {
            // The attributes are aligned (QWORD alignment) after the data format
            PKSMULTIPLE_ITEM attributes = (PKSMULTIPLE_ITEM) (((PBYTE)DataFormat) + ((DataFormat->FormatSize + FILE_QUAD_ALIGNMENT) & ~FILE_QUAD_ALIGNMENT));
            ntStatus = GetAttributesFromAttributeList(attributes, attributes->Size, &signalProcessingMode);
        }
    
        // Check if we have enough streams.
        //
        if (NT_SUCCESS(ntStatus))
        {
            ntStatus = ValidateStreamCreate(Pin, Capture, signalProcessingMode);
        }
    
        // Determine if the format is valid.
        //
        if (NT_SUCCESS(ntStatus))
        {
            ntStatus = IsFormatSupported(Pin, Capture, DataFormat);
        }
    
    ...
    
  14. Gunakan perintah dv untuk menampilkan nama dan nilai semua variabel lokal untuk bingkai tertentu. Perhatikan bahwa, seperti yang diharapkan, nilainya berbeda dari terakhir kali kita menjalankan perintah ini, karena kode tambahan telah dijalankan yang mengubah variabel lokal dan beberapa variabel sekarang tidak berada dalam bingkai saat ini atau nilainya telah berubah.

    2: kd> dv
                    this = 0xffffe001`d1182000
               OutStream = 0xffffe001`d4776d20
            OuterUnknown = 0xffffe001`d4776bc8
                     Pin = 0
                 Capture = 0x00 '
              DataFormat = 0xffffe001`cd7609b0
    signalProcessingMode = {4780004E-7133-41D8-8C74-660DADD2C0EE}
                ntStatus = 0n0
                  stream = 0x00000000`00000000
    

Bagian 9: Menampilkan tumpukan panggilan

Di Bagian 9, Anda akan melihat tumpukan panggilan untuk memeriksa kode pemanggil/panggilan.

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 perintah k*:

Kb

Menampilkan tumpukan dan tiga parameter pertama.

kp

Menampilkan tumpukan dan daftar lengkap parameter.

kn

Memungkinkan Anda melihat tumpukan dengan informasi bingkai di sampingnya.

Jika Anda ingin menyimpan tumpukan panggilan yang tersedia, Anda dapat memilih Tampilkan>tumpukan Panggilan untuk melihatnya. Pilih kolom di bagian atas jendela untuk mengalihkan tampilan informasi tambahan.

Antarmuka WinDbg menampilkan jendela tumpukan panggilan.

Output ini menunjukkan tumpukan panggilan saat menelusuri kesalahan kode adaptor sampel dalam status jeda.

0: kd> kb
# RetAddr           : Args to Child                                                           : Call Site
00 fffff800`7a0fa607 : ffffe001`d1182000 ffffe001`d4776d20 ffffe001`d4776bc8 ffffe001`00000000 : tabletaudiosample!CMiniportWaveRT::NewStream+0x1dc [c:\data1\threshold\audio\endpointscommon\minwavert.cpp @ 597]
01 fffff800`7a0fb2c3 : 00000000`00000000 ffffe001`d122bb10 ffffe001`ceb81750 ffffe001`d173f058 : portcls!CPortPinWaveRT::Init+0x2e7
02 fffff800`7a0fc7f9 : ffffe001`d4776bc0 00000000`00000000 ffffe001`d10b8380 ffffe001`d122bb10 : portcls!CPortFilterWaveRT::NewIrpTarget+0x193
03 fffff800`7a180552 : 00000000`00000000 ffffe001`d10b8380 ffffe001`d122bb10 ffffe001`d4565600 : portcls!xDispatchCreate+0xd9
04 fffff800`7a109a9a : ffffe001`d10b84d0 ffffe001`d10b8380 00000000`00000000 ffffe001`00000000 : ks!KsDispatchIrp+0x272
05 fffff800`7bd314b1 : ffffe001`d122bb10 ffffd001`c3098590 ffffe001`d122bd90 ffffe001`ce80da70 : portcls!DispatchCreate+0x7a
06 fffff803`cda1bfa8 : 00000000`00000024 00000000`00000000 00000000`00000000 ffffe001`d122bb10 : ksthunk!CKernelFilterDevice::DispatchIrp+0xf9
07 fffff803`cda7b306 : 00000000`000001f0 ffffe001`d48ce690 ffffe001`d13d6400 ffffe001`d13d64c0 : nt!IopParseDevice+0x7c8
08 fffff803`cda12916 : 00000000`000001f0 ffffd001`c30988d0 ffffe001`d13d6490 fffff803`cda7b250 : nt!IopParseFile+0xb6
09 fffff803`cda1131c : ffffe001`d2ccb001 ffffd001`c30989e0 00ffffe0`00000040 ffffe001`cd127dc0 : nt!ObpLookupObjectName+0x776
0a fffff803`cd9fedb8 : ffffe001`00000001 ffffe001`d48ce690 00000000`00000000 00000000`00000000 : nt!ObOpenObjectByNameEx+0x1ec
0b fffff803`cd9fe919 : 000000ee`6d1fc8d8 000000ee`6d1fc788 000000ee`6d1fc7e0 000000ee`6d1fc7d0 : nt!IopCreateFile+0x3d8
0c fffff803`cd752fa3 : ffffc000`1f296870 fffff803`cd9d9fbd ffffd001`c3098be8 00000000`00000000 : nt!NtCreateFile+0x79
0d 00007fff`69805b74 : 00007fff`487484e6 0000029b`00000003 00000000`0000012e 00000000`00000000 : nt!KiSystemServiceCopyEnd+0x13
0e 00007fff`487484e6 : 0000029b`00000003 00000000`0000012e 00000000`00000000 00000000`00000000 : 0x00007fff`69805b74
0f 0000029b`00000003 : 00000000`0000012e 00000000`00000000 00000000`00000000 00000000`00000000 : 0x00007fff`487484e6
10 00000000`0000012e : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000080 : 0x0000029b`00000003
11 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000080 00000000`00000000 : 0x12e

Anda dapat menggunakan DML untuk menjelajahi kode lebih lanjut. Saat Anda memilih entri 00 pertama, perintah .frame (Atur Konteks Lokal) digunakan untuk mengatur konteks lalu, perintah dv (Tampilkan Variabel Lokal) menampilkan variabel lokal.

0: kd> .frame 0n0;dv /t /v
00 ffffd001`c30981d0 fffff800`7a0fa607 tabletaudiosample!CMiniportWaveRT::NewStream+0x1dc [c:\data1\threshold\audio\endpointscommon\minwavert.cpp @ 597]
ffffd001`c30982b0 class CMiniportWaveRT * this = 0xffffe001`d1182000
ffffd001`c30982b8 struct IMiniportWaveRTStream ** OutStream = 0xffffe001`d4776d20
ffffd001`c30982c0 struct IPortWaveRTStream * OuterUnknown = 0xffffe001`d4776bc8
ffffd001`c30982c8 unsigned long Pin = 0
ffffd001`c30982d0 unsigned char Capture = 0x00 '
ffffd001`c30982d8 union KSDATAFORMAT * DataFormat = 0xffffe001`cd7609b0
ffffd001`c3098270 struct _GUID signalProcessingMode = {4780004E-7133-41D8-8C74-660DADD2C0EE}
ffffd001`c3098210 long ntStatus = 0n0
ffffd001`c3098218 class CMiniportWaveRTStream * stream = 0x00000000`00000000

Bagian 10: Menampilkan proses dan utas

Di Bagian 10, Anda akan menggunakan perintah debugger untuk menampilkan proses dan utas.

Proses

Untuk mengubah konteks proses saat ini, gunakan perintah .process <process> . Contoh berikut menunjukkan cara mengidentifikasi proses dan beralih konteks ke dalamnya.

  • !process Gunakan perintah untuk menampilkan proses saat ini yang terlibat dalam memutar suara.

    Untuk informasi selengkapnya lihat !process

Output menunjukkan bahwa proses dikaitkan dengan audiodg.exe. Jika Anda masih berada di titik henti yang dijelaskan di bagian sebelumnya dari topik ini, proses saat ini harus dikaitkan dengan gambar audiodg.exe.

<- Pada sistem host

0: kd> !process
PROCESS ffffe001d147c840
    SessionId: 0  Cid: 10f0    Peb: ee6cf8a000  ParentCid: 0434
    DirBase: d2122000  ObjectTable: ffffc0001f191ac0  HandleCount: <Data Not Accessible>
    Image: audiodg.exe
    VadRoot ffffe001d4222f70 Vads 70 Clone 0 Private 504. Modified 16. Locked 0.
    DeviceMap ffffc00019113080
    Token                             ffffc0001f1d4060
    ElapsedTime                       <Invalid>
    UserTime                          00:00:00.000
    KernelTime                        00:00:00.000
    QuotaPoolUsage[PagedPool]         81632
    QuotaPoolUsage[NonPagedPool]      9704
    Working Set Sizes (now,min,max)  (2154, 1814, 2109) (8616KB, 7256KB, 8436KB)
    PeakWorkingSetSize                2101
    VirtualSize                       2097192 Mb
    PeakVirtualSize                   2097192 Mb
    PageFaultCount                    2336
    MemoryPriority                    BACKGROUND
    BasePriority                      8
    CommitCharge                      1573

        THREAD ffffe001d173e840  Cid 10f0.1dac  Teb: 000000ee6cf8b000 Win32Thread: ffffe001d1118cf0 WAIT: (UserRequest) UserMode Non-Alertable
            ffffe001d16c4dd0  NotificationEvent
            ffffe001d08b0840  ProcessObject

        THREAD ffffe001ceb77080  Cid 10f0.16dc  Teb: 000000ee6cf8d000 Win32Thread: 0000000000000000 WAIT: (WrQueue) UserMode Alertable
            ffffe001cf2d1840  QueueObject

        THREAD ffffe001d112c840  Cid 10f0.0a4c  Teb: 000000ee6cf8f000 Win32Thread: 0000000000000000 WAIT: (WrQueue) UserMode Alertable
            ffffe001cf2d1840  QueueObject

        THREAD ffffe001d16c7840  Cid 10f0.13c4  Teb: 000000ee6cf91000 Win32Thread: 0000000000000000 WAIT: (WrQueue) UserMode Alertable
            ffffe001cf2d1840  QueueObject

        THREAD ffffe001cec67840  Cid 10f0.0dbc  Teb: 000000ee6cf93000 Win32Thread: 0000000000000000 WAIT: (WrQueue) UserMode Alertable
            ffffe001d173e5c0  QueueObject

        THREAD ffffe001d1117840  Cid 10f0.1d6c  Teb: 000000ee6cf95000 Win32Thread: 0000000000000000 WAIT: (WrQueue) UserMode Alertable
            ffffe001d173e5c0  QueueObject

        THREAD ffffe001cdeae840  Cid 10f0.0298  Teb: 000000ee6cf97000 Win32Thread: 0000000000000000 RUNNING on processor 2

Perhatikan bahwa salah satu utas yang terkait dengan proses ini berada dalam status BERJALAN. Utas ini mendukung pemutaran klip media ketika titik henti tertembak.

Gunakan perintah !process 0 0 untuk menampilkan informasi ringkasan untuk semua proses. Dalam output perintah gunakan CTRL+F untuk menemukan ID proses untuk proses yang terkait dengan gambar audiodg.exe. Dalam contoh yang ditunjukkan di bawah ini, ID prosesnya adalah ffffe001d147c840.

Rekam ID proses yang terkait dengan audiodg.exe pada PC Anda untuk digunakan nanti di lab ini. ________________________

...

PROCESS ffffe001d147c840
    SessionId: 0  Cid: 10f0    Peb: ee6cf8a000  ParentCid: 0434
    DirBase: d2122000  ObjectTable: ffffc0001f191ac0  HandleCount: <Data Not Accessible>
    Image: audiodg.exe
...

Masukkan g ke debugger untuk menjalankan kode ke depan hingga klip media selesai diputar. Kemudian istirahat ke debugger, dengan menekan Ctrl+ScrLk (Ctrl+Break) Gunakan perintah !process untuk mengonfirmasi bahwa Anda sekarang menjalankan proses yang berbeda.

!process
PROCESS ffffe001cd0ad040
    SessionId: none  Cid: 0004    Peb: 00000000  ParentCid: 0000
    DirBase: 001aa000  ObjectTable: ffffc00017214000  HandleCount: <Data Not Accessible>
    Image: System
    VadRoot ffffe001d402b820 Vads 438 Clone 0 Private 13417. Modified 87866. Locked 64.
    DeviceMap ffffc0001721a070
    Token                             ffffc00017216a60
    ElapsedTime                       05:04:54.716
    UserTime                          00:00:00.000
    KernelTime                        00:00:20.531
    QuotaPoolUsage[PagedPool]         0
    QuotaPoolUsage[NonPagedPool]      0
    Working Set Sizes (now,min,max)  (1720, 50, 450) (6880KB, 200KB, 1800KB)
    PeakWorkingSetSize                15853
    VirtualSize                       58 Mb
    PeakVirtualSize                   74 Mb
    PageFaultCount                    46128
   MemoryPriority                    BACKGROUND
    BasePriority                      8
    CommitCharge                      66

        THREAD ffffe001cd0295c0  Cid 0004.000c  Teb: 0000000000000000 Win32Thread: 0000000000000000 WAIT: (Executive) KernelMode Non-Alertable
            fffff803cd8e0120  SynchronizationEvent

        THREAD ffffe001cd02a6c0  Cid 0004.0010  Teb: 0000000000000000 Win32Thread: 0000000000000000 WAIT: (Executive) KernelMode Non-Alertable
            fffff803cd8e0ba0  Semaphore Limit 0x7fffffff
...

Output di atas menunjukkan bahwa proses sistem ffffe001cd0ad040 yang berbeda sedang berjalan. Nama gambar menunjukkan Sistem, bukan audiodg.exe.

Sekarang gunakan perintah !process untuk beralih ke proses yang terkait dengan audiodg.exe. Dalam contoh, ID proses adalah ffffe001d147c840. Ganti ID proses dalam contoh dengan ID proses Anda, yang Anda rekam sebelumnya.

0: kd> !process  ffffe001d147c840
PROCESS ffffe001d147c840
    SessionId: 0  Cid: 10f0    Peb: ee6cf8a000  ParentCid: 0434
    DirBase: d2122000  ObjectTable: ffffc0001f191ac0  HandleCount: <Data Not Accessible>
    Image: audiodg.exe
    VadRoot ffffe001d4222f70 Vads 60 Clone 0 Private 299. Modified 152. Locked 0.
    DeviceMap ffffc00019113080
    Token                             ffffc0001f1d4060
    ElapsedTime                       1 Day 01:53:14.490
    UserTime                          00:00:00.031
    KernelTime                        00:00:00.031
    QuotaPoolUsage[PagedPool]         81552
    QuotaPoolUsage[NonPagedPool]      8344
    Working Set Sizes (now,min,max)  (1915, 1814, 2109) (7660KB, 7256KB, 8436KB)
    PeakWorkingSetSize                2116
    VirtualSize                       2097189 Mb
    PeakVirtualSize                   2097192 Mb
    PageFaultCount                    2464
    MemoryPriority                    BACKGROUND
    BasePriority                      8
    CommitCharge                      1418

        THREAD ffffe001d173e840  Cid 10f0.1dac  Teb: 000000ee6cf8b000 Win32Thread: ffffe001d1118cf0 WAIT: (UserRequest) UserMode Non-Alertable
            ffffe001d16c4dd0  NotificationEvent
            ffffe001d08b0840  ProcessObject
        Not impersonating
        DeviceMap                 ffffc00019113080
        Owning Process            ffffe001d147c840       Image:         audiodg.exe
        Attached Process          N/A            Image:         N/A
        Wait Start TickCount      338852         Ticks: 197682 (0:00:51:28.781)
        Context Switch Count      36             IdealProcessor: 0             
        UserTime                  00:00:00.015
        KernelTime                00:00:00.000
        Win32 Start Address 0x00007ff7fb928de0
        Stack Init ffffd001c2ec6dd0 Current ffffd001c2ec60c0
        Base ffffd001c2ec7000 Limit ffffd001c2ec1000 Call 0
        Priority 8 BasePriority 8 UnusualBoost 0 ForegroundBoost 0 IoPriority 2 PagePriority 5
        Kernel stack not resident.

        THREAD ffffe001d115c080  Cid 10f0.15b4  Teb: 000000ee6cf9b000 Win32Thread: 0000000000000000 WAIT: (WrQueue) UserMode Alertable
            ffffe001d0bf0640  QueueObject
        Not impersonating
        DeviceMap                 ffffc00019113080
        Owning Process            ffffe001d147c840       Image:         audiodg.exe
        Attached Process          N/A            Image:         N/A
        Wait Start TickCount      338852         Ticks: 197682 (0:00:51:28.781)
        Context Switch Count      1              IdealProcessor: 0             
        UserTime                  00:00:00.000
        KernelTime                00:00:00.000
        Win32 Start Address 0x00007fff6978b350
        Stack Init ffffd001c3143dd0 Current ffffd001c3143520
        Base ffffd001c3144000 Limit ffffd001c313e000 Call 0
        Priority 8 BasePriority 8 UnusualBoost 0 ForegroundBoost 0 IoPriority 2 PagePriority 5
        Kernel stack not resident.

        THREAD ffffe001d3a27040  Cid 10f0.17f4  Teb: 000000ee6cf9d000 Win32Thread: 0000000000000000 WAIT: (WrQueue) UserMode Alertable
            ffffe001d173e5c0  QueueObject
        Not impersonating
        DeviceMap                 ffffc00019113080
        Owning Process            ffffe001d147c840       Image:         audiodg.exe
        Attached Process          N/A            Image:         N/A
        Wait Start TickCount      518918         Ticks: 17616 (0:00:04:35.250)
        Context Switch Count      9              IdealProcessor: 1             
        UserTime                  00:00:00.000
        KernelTime                00:00:00.000
        Win32 Start Address 0x00007fff6978b350
        Stack Init ffffd001c70c6dd0 Current ffffd001c70c6520
        Base ffffd001c70c7000 Limit ffffd001c70c1000 Call 0
        Priority 9 BasePriority 8 UnusualBoost 0 ForegroundBoost 0 IoPriority 2 PagePriority 5
        Kernel stack not resident.

Karena kode ini tidak aktif, semua utas dalam status WAIT, seperti yang diharapkan.

Benang

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

Untuk menjelajahi utas yang terkait dengan pemutar media, putar lagi klip media. Jika titik henti yang dijelaskan di bagian sebelumnya masih diberlakukan, Anda akan berhenti dalam konteks audiodg.exe.

Gunakan !thread -1 0 untuk menampilkan informasi singkat untuk utas saat ini. Ini menunjukkan alamat utas, utas dan ID proses, alamat blok lingkungan utas (TEB), alamat fungsi Win32 (jika ada) utas dibuat untuk dijalankan, dan status penjadwalan utas.

0: kd> !thread -1 0
THREAD ffffe001d3a27040  Cid 10f0.17f4  Teb: 000000ee6cf9d000 Win32Thread: 0000000000000000 RUNNING on processor 0

Untuk melihat informasi selengkapnya tentang utas yang sedang berjalan, ketik !thread. Informasi yang mirip dengan berikut ini harus ditampilkan.

0: kd> !thread
THREAD ffffe001d3a27040  Cid 10f0.17f4  Teb: 000000ee6cf9d000 Win32Thread: 0000000000000000 RUNNING on processor 0
IRP List:
    ffffe001d429e580: (0006,02c8) Flags: 000008b4  Mdl: 00000000
Not impersonating
DeviceMap                 ffffc00019113080
Owning Process            ffffe001d147c840       Image:         audiodg.exe
Attached Process          N/A            Image:         N/A
Wait Start TickCount      537630         Ticks: 0
Context Switch Count      63             IdealProcessor: 1             
UserTime                  00:00:00.000
KernelTime                00:00:00.015
Win32 Start Address 0x00007fff6978b350
Stack Init ffffd001c70c6dd0 Current ffffd001c70c6520
Base ffffd001c70c7000 Limit ffffd001c70c1000 Call 0
Priority 8 BasePriority 8 UnusualBoost 0 ForegroundBoost 0 IoPriority 2 PagePriority 5
Child-SP          RetAddr           : Args to Child                                                           : Call Site
ffffd001`c70c62a8 fffff800`7a0fa607 : ffffe001`d4aec5c0 ffffe001`cdefd3d8 ffffe001`d4aec5c0 ffffe001`cdefd390 : tabletaudiosample!CMiniportWaveRT::NewStream [c:\data1\threshold\audio\endpointscommon\minwavert.cpp @ 562]
ffffd001`c70c62b0 fffff800`7a0fb2c3 : 00000000`00000000 ffffe001`d429e580 ffffe001`d4ea47b0 ffffe001`cdefd3d8 : portcls!CPortPinWaveRT::Init+0x2e7
ffffd001`c70c6340 fffff800`7a0fc7f9 : ffffe001`d4aec430 00000000`00000000 ffffe001`d10b8380 ffffe001`d429e580 : portcls!CPortFilterWaveRT::NewIrpTarget+0x193
ffffd001`c70c63c0 fffff800`7a180552 : 00000000`00000000 ffffe001`d10b8380 ffffe001`d429e580 ffffe001`d4565600 : portcls!xDispatchCreate+0xd9
ffffd001`c70c6450 fffff800`7a109a9a : ffffe001`d10b84d0 ffffe001`d10b8380 00000000`00000000 ffffe001`00000000 : ks!KsDispatchIrp+0x272
ffffd001`c70c6510 fffff800`7bd314b1 : ffffe001`d429e580 ffffd001`c70c6590 ffffe001`d429e800 ffffe001`ce80da70 : portcls!DispatchCreate+0x7a
ffffd001`c70c6540 fffff803`cda1bfa8 : 00000000`00000025 00000000`00000000 00000000`00000000 ffffe001`d429e580 : ksthunk!CKernelFilterDevice::DispatchIrp+0xf9
ffffd001`c70c65a0 fffff803`cda7b306 : 00000000`000002fc ffffe001`d5e0d510 00000000`00000000 ffffe001`d3341bd0 : nt!IopParseDevice+0x7c8
ffffd001`c70c6770 fffff803`cda12916 : 00000000`000002fc ffffd001`c70c68d0 ffffe001`d3341ba0 fffff803`cda7b250 : nt!IopParseFile+0xb6
ffffd001`c70c67d0 fffff803`cda1131c : ffffe001`ceb6c601 ffffd001`c70c69e0 00000000`00000040 ffffe001`cd127dc0 : nt!ObpLookupObjectName+0x776
ffffd001`c70c6970 fffff803`cd9fedb8 : ffff8ab8`00000001 ffffe001`d5e0d510 00000000`00000000 00000000`00000000 : nt!ObOpenObjectByNameEx+0x1ec
ffffd001`c70c6a90 fffff803`cd9fe919 : 000000ee`6d37c6e8 00000004`6d37c500 000000ee`6d37c5f0 000000ee`6d37c5e0 : nt!IopCreateFile+0x3d8
ffffd001`c70c6b40 fffff803`cd752fa3 : fffff6fb`7da05360 fffff6fb`40a6c0a8 fffff681`4d815760 ffff8ab8`92895e23 : nt!NtCreateFile+0x79
ffffd001`c70c6bd0 00007fff`69805b74 : 00007fff`487484e6 0000029b`00000003 00000000`0000012e 00000000`00000000 : nt!KiSystemServiceCopyEnd+0x13 (TrapFrame @ ffffd001`c70c6c40)
000000ee`6d37c568 00007fff`487484e6 : 0000029b`00000003 00000000`0000012e 00000000`00000000 00000000`00000000 : 0x00007fff`69805b74
000000ee`6d37c570 0000029b`00000003 : 00000000`0000012e 00000000`00000000 00000000`00000000 00000000`00000000 : 0x00007fff`487484e6
000000ee`6d37c578 00000000`0000012e : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000080 : 0x0000029b`00000003
000000ee`6d37c580 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000080 00000000`00000000 : 0x12e

Gunakan perintah k untuk melihat tumpukan panggilan yang terkait dengan utas.

0: kd> k
# Child-SP          RetAddr           Call Site
00 ffffd001`c70c62a8 fffff800`7a0fa607 tabletaudiosample!CMiniportWaveRT::NewStream [c:\data1\threshold\audio\endpointscommon\minwavert.cpp @ 562]
01 ffffd001`c70c62b0 fffff800`7a0fb2c3 portcls!CPortPinWaveRT::Init+0x2e7
02 ffffd001`c70c6340 fffff800`7a0fc7f9 portcls!CPortFilterWaveRT::NewIrpTarget+0x193
03 ffffd001`c70c63c0 fffff800`7a180552 portcls!xDispatchCreate+0xd9
04 ffffd001`c70c6450 fffff800`7a109a9a ks!KsDispatchIrp+0x272
05 ffffd001`c70c6510 fffff800`7bd314b1 portcls!DispatchCreate+0x7a
06 ffffd001`c70c6540 fffff803`cda1bfa8 ksthunk!CKernelFilterDevice::DispatchIrp+0xf9
07 ffffd001`c70c65a0 fffff803`cda7b306 nt!IopParseDevice+0x7c8
08 ffffd001`c70c6770 fffff803`cda12916 nt!IopParseFile+0xb6
09 ffffd001`c70c67d0 fffff803`cda1131c nt!ObpLookupObjectName+0x776
0a ffffd001`c70c6970 fffff803`cd9fedb8 nt!ObOpenObjectByNameEx+0x1ec
0b ffffd001`c70c6a90 fffff803`cd9fe919 nt!IopCreateFile+0x3d8
0c ffffd001`c70c6b40 fffff803`cd752fa3 nt!NtCreateFile+0x79
0d ffffd001`c70c6bd0 00007fff`69805b74 nt!KiSystemServiceCopyEnd+0x13
0e 000000ee`6d37c568 00007fff`487484e6 0x00007fff`69805b74
0f 000000ee`6d37c570 0000029b`00000003 0x00007fff`487484e6
10 000000ee`6d37c578 00000000`0000012e 0x0000029b`00000003
11 000000ee`6d37c580 00000000`00000000 0x12e

Masukkan g ke debugger untuk menjalankan kode ke depan hingga klip media selesai diputar. Kemudian istirahat ke debugger, dengan menekan Ctrl - ScrLk (Ctrl-Break) Gunakan perintah !thread untuk mengonfirmasi bahwa Anda sekarang menjalankan utas yang berbeda.

0: kd> !thread
THREAD ffffe001ce80b840  Cid 17e4.01ec  Teb: 00000071fa9b9000 Win32Thread: ffffe001d41690d0 RUNNING on processor 0
Not impersonating
DeviceMap                 ffffc0001974e2c0
Owning Process            ffffe001d1760840       Image:         rundll32.exe
Attached Process          N/A            Image:         N/A
Wait Start TickCount      538040         Ticks: 0
Context Switch Count      3181840        IdealProcessor: 0             
UserTime                  00:00:08.250
KernelTime                00:00:10.796
Win32 Start Address 0x00007ff6d2f24270
Stack Init ffffd001cd16afd0 Current ffffd001cd16a730
Base ffffd001cd16b000 Limit ffffd001cd165000 Call 0
Priority 8 BasePriority 8 UnusualBoost 0 ForegroundBoost 0 IoPriority 2 PagePriority 5

Child-SP          RetAddr           : Args to Child                                                           : Call Site
fffff803`cf373d18 fffff800`7a202852 : fffff803`cf373e60 00000000`00000001 ffffe001`cf4ed330 00000000`0000ffff : nt!DbgBreakPointWithStatus
fffff803`cf373d20 fffff803`cd6742c6 : ffffe001`cf4ed2f0 fffff803`cf373e60 00000000`00000001 00000000`0004e4b8 : kdnic!TXSendCompleteDpc+0x142
fffff803`cf373d60 fffff803`cd74d495 : 00000000`00000000 fffff803`cd923180 fffff803`cde1f4b0 fffff901`40669010 : nt!KiRetireDpcList+0x5f6
fffff803`cf373fb0 fffff803`cd74d2a0 : 00000000`00000090 0000000e`0000006a 00000000`00000092 00000000`00000000 : nt!KxRetireDpcList+0x5 (TrapFrame @ fffff803`cf373e70)
ffffd001`cd16a6c0 fffff803`cd74bd75 : 00000000`00000000 fffff803`cd74a031 00000000`00000000 00000000`00000000 : nt!KiDispatchInterruptContinue
ffffd001`cd16a6f0 fffff803`cd74a031 : 00000000`00000000 00000000`00000000 ffffe001`cff4d2a0 fffff803`cd67738e : nt!KiDpcInterruptBypass+0x25
ffffd001`cd16a700 fffff960`50cdb5a4 : fffff901`400006d0 00000000`00000001 fffff901`40000d60 ffffd001`cd16a9f0 : nt!KiInterruptDispatchNoLockNoEtw+0xb1 (TrapFrame @ ffffd001`cd16a700)
ffffd001`cd16a890 fffff960`50c66b2f : 00000000`00000000 fffff901`40669010 fffff901`42358580 fffff901`40000d60 : win32kfull!Win32FreePoolImpl+0x34
ffffd001`cd16a8c0 fffff960`50c68cd6 : 00000000`00000000 ffffd001`cd16a9f0 fffff901`400006d0 fffff901`400c0460 : win32kfull!EXLATEOBJ::vAltUnlock+0x1f
ffffd001`cd16a8f0 fffff803`cd752fa3 : 00000000`00000000 00000000`00000000 ffffe001`ce80b840 00000000`00000000 : win32kfull!NtGdiAlphaBlend+0x1d16
ffffd001`cd16add0 00007fff`674c1494 : 00007fff`674b1e97 0000a7c6`daee0559 00000000`00000001 0000020b`741f3c50 : nt!KiSystemServiceCopyEnd+0x13 (TrapFrame @ ffffd001`cd16ae40)
00000071`fa74c9a8 00007fff`674b1e97 : 0000a7c6`daee0559 00000000`00000001 0000020b`741f3c50 00000000`00ffffff : 0x00007fff`674c1494
00000071`fa74c9b0 0000a7c6`daee0559 : 00000000`00000001 0000020b`741f3c50 00000000`00ffffff 00000000`00000030 : 0x00007fff`674b1e97
00000071`fa74c9b8 00000000`00000001 : 0000020b`741f3c50 00000000`00ffffff 00000000`00000030 00000000`01010bff : 0x0000a7c6`daee0559
00000071`fa74c9c0 0000020b`741f3c50 : 00000000`00ffffff 00000000`00000030 00000000`01010bff 00000000`00000000 : 0x1
00000071`fa74c9c8 00000000`00ffffff : 00000000`00000030 00000000`01010bff 00000000`00000000 00000000`000000c0 : 0x0000020b`741f3c50
00000071`fa74c9d0 00000000`00000030 : 00000000`01010bff 00000000`00000000 00000000`000000c0 00000000`00000030 : 0xffffff
00000071`fa74c9d8 00000000`01010bff : 00000000`00000000 00000000`000000c0 00000000`00000030 00000071`00000030 : 0x30
00000071`fa74c9e0 00000000`00000000 : 00000000`000000c0 00000000`00000030 00000071`00000030 00000071`01ff8000 : 0x1010bff

Nama gambar rundll32.exe, yang memang bukan nama gambar yang terkait dengan pemutaran klip media.

Catatan Untuk mengatur utas saat ini, ketik nomor> utas .thread<.

Untuk informasi selengkapnya tentang utas dan proses, lihat referensi berikut ini:

Utas dan Proses

Mengubah Konteks

Bagian 11: IRQL, daftar, dan pembongkaran

Menampilkan IRQL yang disimpan

Di Bagian 11, Anda akan menampilkan IRQL, dan konten regsister.

<- Pada sistem host

Tingkat permintaan interupsi (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 akan mengganggu operasi saat ini. Interupsi yang terjadi di atas pengaturan IRQL prosesor lebih diutamakan daripada operasi saat ini. Ekstensi !irql menampilkan tingkat permintaan interupsi (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)

<Melihat register dan pembongkaran

Lihat register

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

Cuplikan layar jendela pendaftaran WinDbg yang menampilkan sekitar 12 register.

Melihat konten register dapat membantu saat melangkah melalui eksekusi kode bahasa assembly dan dalam skenario lain. Untuk informasi selengkapnya, lihat r (Registers).

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

Pembongkaran

Anda dapat membongkar kode yang sedang dieksekusi untuk melihat kode bahasa rakitan yang sedang dijalankan dengan memilih Tampilkan>Pembongkaran.

Cuplikan layar jendela pembongkaran WinDbg memperlihatkan kode bahasa rakitan.

Untuk informasi selengkapnya tentang pembongkaran bahasa rakitan, lihat Pembongkaran anotasi x86 dan Pembongkaran x64 Yang Diannotasi.

Bagian 12: Bekerja dengan memori

Di Bagian 12, Anda akan menggunakan perintah debugger untuk menampilkan konten memori.

Lihat memori

Anda mungkin perlu memeriksa memori untuk mengidentifikasi masalah atau untuk memeriksa variabel, pointer, dan sebagainya. Anda dapat menampilkan memori dengan mengetik salah satu perintah alamat> d* <berikut.

db

Menampilkan data dalam nilai byte dan karakter ASCII.

dd

Menampilkan data sebagai kata lebar ganda (4 byte).

du

Menampilkan data sebagai karakter Unicode.

Dw

Menampilkan data sebagai nilai kata (2 byte) dan karakter ASCII.

Catatan Jika Anda mencoba menampilkan alamat yang tidak valid, kontennya ditampilkan sebagai tanda tanya (?).

Atau, Anda dapat melihat memori dengan memilih Lihat>Memori. Gunakan tarik ke bawah Format tampilan untuk mengubah tampilan memori.

Cuplikan layar jendela memori tampilan WinDbg dengan berbagai opsi format tampilan.

  1. Untuk melihat data yang terkait dengan kontrol volume, atur titik henti untuk mengaktifkan rutinitas PropertyHandlerAudioEngineVolumeLevel menggunakan perintah bm. Sebelum kita mengatur titik henti baru, kita akan menghapus semua titik henti sebelumnya menggunakan bc *.

    kd> bc *
    
  2. Atur titik henti untuk mengaktifkan rutinitas PropertyHandlerAudioEngineVolumeLevel menggunakan perintah bm.

    kd> bm tabletaudiosample!CMiniportWaveRT::SetDeviceChannelVolume
      1: fffff80f`02c3a4b0 @!"tabletaudiosample!CMiniportWaveRT::SetDeviceChannelVolume"
    
  3. Cantumkan titik henti untuk mengonfirmasi bahwa titik henti diatur dengan benar.

    kd> bl
      1: fffff80f`02c3a4b0 @!"tabletaudiosample!CMiniportWaveRT::SetDeviceChannelVolume"
    
  4. Gunakan perintah g untuk memulai ulang eksekusi kode.

    Pada sistem target sesuaikan volume di baki sistem. Ini akan menyebabkan titik henti ditembakkan.

    Breakpoint 1 hit
    tabletaudiosample!CMiniportWaveRT::SetDeviceChannelVolume:
    fffff80f`02c3a4b0 44894c2420      mov     dword ptr [rsp+20h],r9d
    
  5. Gunakan item menu Tampilkan>Lokal untuk menampilkan variabel lokal. Perhatikan nilai variabel IVolume saat ini.

  6. Anda dapat menampilkan jenis data dan nilai saat ini untuk variabel IVolume dalam kode sampel dengan mengetik perintah dt dan nama variabel.

    kd> dt lVolume
    Local var @ 0xa011ea50 Type long
    0n-6291456
    
  7. Titik henti ditemui saat memasuki SetDeviceChannelVolume.

    STDMETHODIMP_(NTSTATUS) CMiniportWaveRT::SetDeviceChannelVolume(_In_  ULONG _ulNodeId, _In_ UINT32 _uiChannel, _In_  LONG  _Volume)
    {
        NTSTATUS ntStatus = STATUS_INVALID_DEVICE_REQUEST;
    
        PAGED_CODE ();
    
        DPF_ENTER(("[CMiniportWaveRT::SetEndpointChannelVolume]"));
        IF_TRUE_ACTION_JUMP(_ulNodeId != KSNODE_WAVE_AUDIO_ENGINE, ntStatus = STATUS_INVALID_DEVICE_REQUEST, Exit);
    
        // Snap the volume level to our range of steppings.
        LONG lVolume = VOLUME_NORMALIZE_IN_RANGE(_Volume); 
    
        ntStatus = SetChannelVolume(_uiChannel, lVolume);
    Exit:
        return ntStatus;
    }
    
  8. Coba tampilkan nilai di lokasi memori IVolume dengan menggunakan perintah dt (Jenis Tampilan).

    kd> dt dt lVolume
    Local var @ 0xffffb780b7eee664 Type long
    0n0
    

    Karena variabel belum ditentukan, variabel tersebut tidak berisi informasi.

  9. Tekan F10 untuk menjalankan maju ke baris terakhir kode di SetDeviceChannelVolume.

        return ntStatus;
    
  10. Tampilkan nilai di lokasi memori IVolume dengan menggunakan perintah dt (Jenis Tampilan).

    kd> dt lVolume
    Local var @ 0xffffb780b7eee664 Type long
    0n-6291456
    

    Sekarang setelah variabel aktif, nilai 6291456 ditampilkan dalam contoh ini.

  11. Anda juga dapat menampilkan lokasi memori IVolume dengan menggunakan ? (Evaluasi Ekspresi) Perintah.

    kd> ? lVolume
    Evaluate expression: -79711507126684 = ffffb780`b7eee664
    
  12. Alamat yang ditampilkan, ffffb780'b7eee664 adalah alamat variabel lVolume. Gunakan perintah dd untuk menampilkan konten memori di lokasi tersebut.

    kd>  dd ffffb780`b7eee664
    ffffb780`b7eee664  ffa00000 00000018 00000000 c52d7008
    ffffb780`b7eee674  ffffc98e e0495756 fffff80e c52d7008
    ffffb780`b7eee684  ffffc98e 00000000 fffff80e 00000000
    ffffb780`b7eee694  ffffc98e ffa00000 ffffb780 b7eee710
    ffffb780`b7eee6a4  ffffb780 00000000 00000000 c7477260
    ffffb780`b7eee6b4  ffffc98e b7eee7a0 ffffb780 b7eee6f0
    ffffb780`b7eee6c4  ffffb780 e04959ca fffff80e 00000000
    ffffb780`b7eee6d4  00000000 00000028 00000000 00000002
    
  13. Anda dapat menampilkan empat byte pertama alamat dengan menentukan parameter rentang L4.

    kd> dd ffffb780`b7eee664 l4
    ffffb780`b7eee664  ffa00000 00000018 00000000 c52d7008
    
  14. Untuk melihat berbagai jenis output memori yang ditampilkan, ketik perintah du, da, dan db.

    kd> du ffffb780`b7eee664 
    ffffb780`b7eee664  ""
    
    kd> a ffffb780`b7eee664 
    ffffb780`b7eee664  ""
    
    kd> db 0xffffae015ff97664 
    ffffae01`5ff97664  00 80 bc ff 18 00 00 00-00 00 00 00 08 50 e0 51  .............P.Q
    ffffae01`5ff97674  00 c0 ff ff 56 57 da 56-0e f8 ff ff 08 50 e0 51  ....VW.V.....P.Q
    ffffae01`5ff97684  00 c0 ff ff 00 00 00 00-0e f8 ff ff 00 00 00 00  ................
    ffffae01`5ff97694  00 c0 ff ff aa 80 bc ff-01 ae ff ff 10 77 f9 5f  .............w._
    ffffae01`5ff976a4  01 ae ff ff 40 00 00 00-00 e6 ff ff 10 dc 30 55  ....@.........0U
    ffffae01`5ff976b4  00 c0 ff ff a0 77 f9 5f-01 ae ff ff f0 76 f9 5f  .....w._.....v._
    ffffae01`5ff976c4  01 ae ff ff ca 59 da 56-0e f8 ff ff 00 00 00 00  .....Y.V........
    ffffae01`5ff976d4  00 00 00 00 28 00 00 00-00 00 00 00 02 00 00 00  ....(...........
    

    Gunakan opsi float df untuk menampilkan data sebagai angka floating-point presisi tunggal (4 byte).

    df ffffb780`b7eee664 
    ffffb780`b7eee664          -1.#QNAN   3.3631163e-044                0        -2775.002
    ffffb780`b7eee674          -1.#QNAN  -5.8032637e+019         -1.#QNAN        -2775.002
    ffffb780`b7eee684          -1.#QNAN                0         -1.#QNAN                0
    ffffb780`b7eee694          -1.#QNAN         -1.#QNAN         -1.#QNAN  -2.8479408e-005
    

Menulis ke memori

Mirip dengan perintah yang digunakan untuk membaca memori, Anda dapat menggunakan perintah e* untuk mengubah konten memori.

Perintah Deskripsi

Ea

String ASCII (bukan dihentikan NULL)

eu

String Unicode (bukan dihentikan NULL

Ew

Nilai kata (2 byte)

Eza

String ASCII yang dihentikan NULL

ezu

Untai (karakter) Unicode yang dihentikan NULL

Eb

Nilai byte

ed

Nilai kata ganda (4 byte)

Contoh berikut menunjukkan cara menimpa memori.

  1. Pertama, temukan alamat lVolume yang digunakan dalam kode sampel.

    kd> ? lVolume
    Evaluate expression: -79711507126684 = ffffb780`b7eee664
    
  2. Timpa alamat memori tersebut dengan karakter baru menggunakan perintah eb .

    kd> eb 0xffffb780`b7eee664 11 11 11 11 11
    
  3. Tampilkan lokasi memori untuk mengonfirmasi bahwa karakter telah ditimpa dengan mengetik perintah db .

    kd> db 0xffffb780`b7eee664
    ffffb780`b7eee664  11 11 11 11 11 00 00 00-00 00 00 00 08 70 2d c5  .............p-.
    ffffb780`b7eee674  8e c9 ff ff 56 57 49 e0-0e f8 ff ff 08 70 2d c5  ....VWI......p-.
    ffffb780`b7eee684  8e c9 ff ff 00 00 00 00-0e f8 ff ff 00 00 00 00  ................
    ffffb780`b7eee694  8e c9 ff ff 00 00 a0 ff-80 b7 ff ff 10 e7 ee b7  ................
    ffffb780`b7eee6a4  80 b7 ff ff 00 00 00 00-00 00 00 00 60 72 47 c7  ............`rG.
    ffffb780`b7eee6b4  8e c9 ff ff a0 e7 ee b7-80 b7 ff ff f0 e6 ee b7  ................
    ffffb780`b7eee6c4  80 b7 ff ff ca 59 49 e0-0e f8 ff ff 00 00 00 00  .....YI.........
    ffffb780`b7eee6d4  00 00 00 00 28 00 00 00-00 00 00 00 02 00 00 00  ....(...........
    

Atau, Anda dapat memodifikasi konten memori di jendela jam tangan atau lokal. Untuk jendela pengawasan, Anda mungkin melihat variabel yang berada di luar konteks bingkai saat ini. Mengubahnya tidak relevan jika tidak dalam konteks.

Bagian 13: Mengakhiri sesi WinDbg

<-Pada sistem host

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 Debugging di WinDbg (Klasik) dalam dokumentasi referensi penelusuran kesalahan.

Bagian 14: Sumber daya penelusuran kesalahan Windows

Informasi tambahan tersedia pada penelusuran kesalahan Windows. Perhatikan bahwa beberapa buku ini akan menggunakan versi Windows yang lebih lama seperti Windows Vista dalam contohnya, tetapi konsep yang dibahas berlaku untuk sebagian besar versi Windows.

Buku

  • Debugging Windows Tingkat Lanjut oleh Mario Hewardt dan Daniel Pravat

  • Di dalam Windows Debugging: Panduan Praktis untuk Men-debug dan Melacak Strategi di Windows® oleh Tarik Soulami

  • Windows Internals oleh Pavel Yosifovich, Alex Ionescu, Mark Russinovich dan David Solomon

Video

Alat Defrag Tampilkan WinDbg Episodes 13-29: </show/defrag-tools/>

Vendor Pelatihan:

OSR- https://www.osr.com/

Lihat Juga

Memulai Penelusuran Kesalahan Windows