Bagikan melalui


Menyiapkan penelusuran kesalahan Mode Kernel QEMU menggunakan EXDI

Topik ini menjelaskan cara menyiapkan Debugging Mode Kernel QEMU menggunakan EXDI dengan debugger Windows.

Untuk informasi umum tentang menyiapkan konfigurasi dan pemecahan masalah koneksi EXDI, lihat Mengonfigurasi Exdi Debugger Transport.

Menggunakan QEMU, perangkat lunak virtualisasi dan emulasi mesin, dimungkinkan untuk terhubung ke sistem operasi lain yang berfungsi sebagai host, seperti Linux. QEMU sendiri dapat berjalan pada berbagai arsitektur, seperti x64 dan Arm64. Server debugging ExdiGdb juga mendukung prosesor lain, misalnya dimungkinkan untuk menggunakan WinDbg untuk men-debug QEMU yang berjalan pada x64, meniru Arm64. Menggunakan EXDI juga memungkinkan VM untuk di-debug HW di awal proses boot, bahkan sebelum OS dimuat.

Catatan

EXDI adalah bentuk debugging khusus yang canggih untuk lingkungan tertentu. Menggunakan koneksi KDNET standar lebih mudah dikonfigurasi, dan disarankan. Untuk menyiapkan penelusuran kesalahan jaringan secara otomatis, lihat Menyiapkan Penelusuran Kesalahan Kernel Jaringan KDNET Secara Otomatis.

EXDI COM Server

EXDI adalah antarmuka yang memungkinkan perluasan WinDbg dengan menambahkan dukungan untuk debugger perangkat keras (misalnya berbasis JTAG, atau berbasis GdbServer). Diagram di bawah ini mengilustrasikan peran EXDI-GdbServer.

Diagram tumpukan memperlihatkan peran EXDI-GdbServer dengan WinDbg-DbgEng di atasnya, antarmuka EXDI, dan server EXDI COM berkomunikasi dengan server GDB.

Penting

Karena EXDI tidak menggunakan protokol KDNET, debugger yang terhubung memiliki informasi yang jauh lebih sedikit tentang apa yang berjalan pada PC dan banyak perintah akan bekerja secara berbeda atau mungkin tidak berfungsi sama sekali. Akses ke simbol privat untuk kode yang di-debug dapat membantu debugger lebih memahami eksekusi kode sistem target. Untuk informasi selengkapnya, lihat Simbol Publik dan Privat.

Menyiapkan koneksi debugger ke Gambar Windows di QEMU

Langkah-langkah ini menjelaskan cara melampirkan ke Windows x64 Virtual Machine yang mengekspos server GDB ke klien Windbg (yang menggunakan server EXDI COM), juga berjalan di Windows. Sesi RSP GdbServer antara winDbg ExdiGdbSrv.dll (klien server GDB) dan server QEMU GDB digunakan.

  1. Unduh dan instal QEMU di Windows.
  2. Konfigurasikan gambar Windows virtual QEMU target untuk diluncurkan dengan jaringan yang diperlukan dan pengaturan BIOS/UEFI untuk penelusuran kesalahan.
  3. Mulai lingkungan QEMU, menggunakan skrip peluncuran.
  4. Mulai GdbServer di QEMU.
  5. Periksa konektivitas jaringan dan temukan dan rekam alamat IP gambar target. (Alamat default IP HOST LocalHost, dan port 1234).
  6. Unduh dan instal alat penelusuran kesalahan Windows pada sistem host.
  7. Luncurkan WinDbg menggunakan baris perintah atau UI untuk menyambungkan ke server EXDI.
  8. Gunakan WinDbg untuk men-debug gambar Windows QEMU target.

Emulator mesin sumber terbuka QEMU

QEMU adalah emulator dan virtualizer komputer generik dan sumber terbuka yang menyebabkan terjemahan dinamis. Ketika QEMU digunakan sebagai emulator mesin - ia dapat menjalankan OS dan program yang dibuat untuk satu prosesor (seperti Arm64) pada komputer yang berbeda (PC x64). Ini juga dapat menjalankan/menghosting gambar komputer virtual untuk OS yang berbeda (Windows/Linux/Mac).

QEMU dapat beroperasi dengan hypervisor lain seperti KVM untuk menggunakan ekstensi CPU (HVM) untuk virtualisasi. Ketika QEMU digunakan sebagai virtualizer, QEMU mencapai performa mendekati asli dengan mengeksekusi kode tamu langsung di CPU host. QEMU dapat memanfaatkan fitur hypervisor OS untuk membongkar emulasi CPU dan MMU ke perangkat keras nyata.

Unduh dan Instal QEMU

Dalam panduan ini, QEMU untuk Windows x64 akan diinstal pada PC x64 tempat debugger Windows juga akan berjalan.

Unduh QEMU dari halaman unduhan QEMU: https://www.qemu.org/download/

Lihat dokumentasi QEMU untuk informasi tentang menginstal QEMU: https://www.qemu.org/documentation/

Mengonfigurasi Disk Virtual Target

Temukan atau buat gambar disk virtual yang memiliki perangkat lunak yang ingin Anda debug.

Dalam contoh ini, citra disk komputer virtual Windows x64 VHDX akan digunakan. Untuk mempelajari selengkapnya tentang gambar komputer virtual Windows, lihat Membuat Komputer Virtual dengan Hyper-V di Windows 10.

Menyuntikkan driver VirtIO ke dalam Gambar Windows

Untuk memungkinkan fungsionalitas jaringan dan performa perangkat penyimpanan yang wajar, baik menyuntikkan atau menginstal driver VirtIO ke dalam gambar disk komputer virtual Windows. Driver VirtIO tersedia di sini: https://github.com/virtio-win/kvm-guest-drivers-windows

VirtIO adalah antarmuka standar yang memungkinkan komputer virtual mengakses perangkat keras abstrak, seperti perangkat blok, adaptor jaringan, dan konsol. VirtIO berfungsi sebagai lapisan abstraksi untuk perangkat keras di lingkungan virtual seperti QEMU.

Untuk menyuntikkan driver VirtIO ke gambar Windows, ikuti langkah-langkah di bawah ini:

  1. Ekstrak driver VirtIo dalam folder, misalnya C:\VirtIo_Drivers.
  2. Pasang VHDX yang berisi komputer Virtual Windows x64 dengan mengklik dua kali pada VHDX di File Explorer (Anda juga dapat menggunakan diskpart). Windows akan memasang VHDX menggunakan huruf tertentu, misalnya "L:"
  3. Masukkan driver dalam gambar yang dipasang menggunakan Dism: dism /image:L: /Add-Driver /driver:C:\VirtIo_Drivers Untuk informasi selengkapnya tentang DISM, lihat Gambaran Umum DISM.
  4. Setelah proses selesai, Anda dapat melepas citra dan melanjutkan untuk mengonversi VHDX ke QEMU.

Mengonversi VHDX ke QEMU

Langkah ini tidak diperlukan, tetapi disarankan, karena performa yang lebih baik dicapai saat menggunakan gambar QEMU QCOW asli alih-alih VHDX.

Gunakan perintah qemu-img.exe berikut untuk mengonversi vhdx. Utilitas ini terletak di mana Anda menginstal QEMU, misalnya C:\Program Files\qemu.

C:\Program Files\qemu> qemu-img convert -c -p -O qcow2 MyVHDXFile.vhdx MyQEMUFile.qcow2 

Unduh Firmware UEFI

Untuk hasil terbaik, unduh atau kompilasi file firmware UEFI (OVMF.fd). Firmware diperlukan karena jika tidak, QEMU secara default meniru sistem BIOS yang lebih lama.

Salah satu sumber untuk Firmware UEFI adalah proyek Open Clear Linux: https://clearlinux.org/

Contoh file UEFI OVMF.fd tersedia di sini: https://github.com/clearlinux/common/tree/master/OVMF.fd

Ekstrak konten file yang diunduh di C:\Program Files\qemu\Firmware.

Untuk platform selain Intel AMD64, Anda harus mengkompilasi firmware dari EDK2. Untuk informasi selengkapnya, lihat https://github.com/tianocore/tianocore.github.io/wiki/How-to-build-OVMF .

Mengonfigurasi Skrip Peluncuran QEMU

Buat file konfigurasi Anda di QEMU. Misalnya, buat StartQEMUx64Windows.bat file di bawah direktori akar QEMU. Lihat contoh file di bawah ini.

Gunakan Skrip Peluncuran QEMU untuk memulai QEMU

Jalankan skrip peluncuran QEMU untuk memulai QEMU.

c:\Program Files\qemu\StartQEMUx64Windows.bat

Jika permintaan firewall defender muncul, berikan aplikasi semua hak untuk semua jenis jaringan untuk mengaktifkan Windbg melalui firewall Windows untuk komputer debugger host.

Kotak dialog Windows Defender Firewall dengan ketiga opsi dicentang.

Setelah Windows Virtual Machine diluncurkan di lingkungan QEMU, antarmuka pengguna QEMU akan muncul.

Cuplikan layar QEMU yang menampilkan opsi menu tampilan.

Gunakan CTRL+ALT+ kombinasi tombol angka untuk masuk ke konsol monitor QEMU. Monitor ini juga tersedia menggunakan View-compatmonitor>.

Ketik gdbserver untuk meluncurkan server GDB ujung depan di QEMU.

QEMU harus ditampilkan Waiting for gdb connection on device ‘tcp::1234’

Kembali ke jendela utama menggunakan kombinasi tombol CTRL+ALT+1.

Tips: Jendela konsol system_reset GDB mendukung perintah untuk memulai ulang emulasi dengan cepat. Ketik help untuk daftar perintah konsol GDB.

Sampel skrip peluncuran VM Windows QEMU x64

Berikut adalah contoh skrip konfigurasi QEMU yang dapat digunakan untuk KOMPUTER Virtual AMD64. Ganti tautan yang menunjuk ke file DISK dan CDROM ke lokasi di PC Anda.

    REM
    REM  This script is used to run a Windows x64 VM on QEMU that is hosted by a Windows x64 host system
    REM  The Host system is a PC with Intel(R) Xeon(R) CPU.
    REM
    set EXECUTABLE=qemu-system-x86_64
    set MACHINE=-m 6G -smp 4

    REM No acceleration
    REM generic cpu emulation.
    REM to find out which CPU types are supported by the QEMU version on your system, then run:
    REM	 qemu-system-x86_64.exe -cpu help
    REM the see if your host system CPU is listed
    REM

    set CPU=-machine q35 

    REM Enables x64 UEFI-BIOS that will be used by QEMU :
    set BIOS=-bios "C:\Program Files\qemu\Firmware\OVMF.fd"

    REM  Use regular GFX simulation
    set GFX=-device ramfb -device VGA 
    set USB_CTRL=-device usb-ehci,id=usbctrl
    set KEYB_MOUSE=-device usb-kbd -device usb-tablet

    REM # The following line enable the full-speed HD controller (requires separate driver)
    REM # Following line uses the AHCI controller for the Virtual Hard Disk:
    set DRIVE0=-device ahci,id=ahci -device ide-hd,drive=disk,bus=ahci.0

    REM
    REM This will set the Windows VM x64 disk image that will be launched by QEMU
    REM The disk image is in the qcow2 format accepted by QEMU.
    REM You get the .qcow2 image, once you get the VHDX Windows VM x64 image 
    REM and apply the script to inject the virtio x64 drivers and then run the 
    REM the QEMU tool to convert the .VHDX image to .qcow2 format
    REM 	i.e. 
    REM	qemu-img convert -c -p -O qcow2 Windows_VM_VHDX_with_injected_drivers_file.vhdx file.qcow2
    REM file : points to the specified qcow2 image path.
    REM
    set DISK0=-drive id=disk,file="C:\Program Files\qemu\MyQEMUFile.qcow2",if=none

    REM
    REM for kdnet on, then best option:
    REM   NETWORK0="-netdev user,id=net0,hostfwd=tcp::53389-:3389,hostfwd=tcp::50001-:50001 -device virtio-net,netdev=net0,disable-legacy=on"
    REM
    REM Create a mapping for the RDP service from port 3389 to 3589.
    REM
    set NETHOST=-netdev user,id=net0,hostfwd=tcp::3589-:3389
    set NETGUEST=-device e1000,netdev=net0

    REM # The following line should enable the Daemon (instead of interactive)
    set DAEMON=-daemonize"
    %EXECUTABLE% %MACHINE% %CPU% %BIOS% %GFX% %USB_CTRL% %DRIVE0% %DISK0% %NETHOST% %NETGUEST%

Konektivitas jaringan

Host Lokal

Jika server GDB dimulai dengan benar, maka Anda akan melihat nomor port tempat server GDB akan mendengarkan, dan Anda harus menggunakan port ini untuk menyiapkan pasangan debugger IP:Port host.

Jika debugger Host Anda terletak di komputer yang sama yang menghosting tamu QEMU, maka pengidentifikasi Localhost akan digunakan dalam pasangan IP:Port. Dalam contoh ini, dengan server dan debugger host pada PC yang sama, LocalHost:1234 akan digunakan.

Host Jarak Jauh

Jika bekerja pada PC jarak jauh, temukan alamat IP Windows (jika sesi host debugger tidak akan terletak di komputer Windows yang sama dengan VM QEMU).

TARGET QEMU IP <address>:<port number> akan dikonfigurasi di EXDI UI.

Perintah berikut dapat dikeluarkan pada konsol QEMU (compatmonitor0) untuk menampilkan informasi tentang status jaringan dan koneksi.

info network
info usernet

Untuk informasi tambahan tentang jaringan QEMU, lihat https://wiki.qemu.org/Documentation/Networking

Mengunduh dan menginstal alat penelusuran kesalahan Windows pada sistem host

Instal Windows Debugging Tools pada sistem host. Untuk informasi tentang mengunduh dan menginstal alat debugger, lihat Alat Debugging untuk Windows.

Luncurkan WinDbg pada sistem host

Dalam skenario yang dijelaskan di sini, atur opsi berikut di EXDI UI untuk menyambungkan.

Jenis target - QEMU

Arsitektur target - x64

OS Target - Windows

Ukuran heuristik pemindaian gambar - 0xFFE - NT

Server dan port Gdb - LocalHost:1234

Putus pada koneksi - ya

UI koneksi kernel Windbg EXDI, dengan opsi koneksi ditampilkan, termasuk IP dan alamat port.

Meskipun penggunaan EXDI UI disarankan, dimungkinkan juga untuk meluncurkan WinDbg menggunakan opsi baris perintah yang mirip dengan apa yang ditunjukkan di sini.

c:\Debuggers> windbg.exe -v -kx exdi:CLSID={29f9906e-9dbe-4d4b-b0fb-6acf7fb6d014},Kd=Guess,Inproc=ExdiGdbSrv.dll,DataBreaks=Exdi

Saat menggunakan baris perintah, alamat IP dan port dikonfigurasi menggunakan file exdiConfigData.xml. Untuk informasi selengkapnya, lihat File Konfigurasi XML EXDI.

Untuk menampilkan output tambahan, sesi -v: verbose dapat digunakan. Untuk informasi umum tentang opsi WinDbg, lihat Opsi Baris Perintah WinDbg.

Debugger harus meluncurkan dan menyambungkan ke QEMU GdbServer.

Sesi WinDbg utama menampilkan EXDI CLSID di judul jendela.

Debugger akan menampilkan inisialisasi transportasi EXDI yang berhasil.

EXDI: DbgCoInitialize returned 0x00000001
EXDI: CoCreateInstance() returned 0x00000000
EXDI: QueryInterface(IExdiServer3) returned 0x00000000
Target command response: QEMU
exdiCmd: The function: 'ExdiDbgType' was completed.
EXDI: Server::GetTargetInfo() returned 0x00000000
EXDI: Server::SetKeepaliveInterface() returned 0x00000000
EXDI: Server::GetNbCodeBpAvail() returned 0x00000000
EXDI: ExdiNotifyRunChange::Initialize() returned 0x00000000
EXDI: LiveKernelTargetInfo::Initialize() returned 0x00000000
EXDI: Target initialization succeeded

Jendela paket konsol EXDIGdbServer juga dapat menampilkan informasi tentang status koneksi EXDI, jika *"Tampilkan log paket komunikasi di bawah Opsi tingkat lanjut diatur ke aktif. Untuk informasi selengkapnya, lihat informasi pemecahan masalah dalam Mengonfigurasi Exdi Debugger Transport.

Gunakan WinDbg untuk men-debug gambar Windows QEMU target

dbgeng.dll menggunakan algoritma heuristik untuk menemukan lokasi alamat beban dasar NT pada saat perintah pemutusan terjadi. Jika simbol privat tidak tersedia, proses ini akan gagal.

Ini berarti bahwa di bawah banyak urutan koneksi, pemutusan tidak akan berfungsi seperti yang diharapkan. jika Anda secara manual memecah ke dalam kode, itu akan menjadi lokasi acak yang kebetulan dieksekusi Windows pada saat itu. Karena simbol untuk kode target mungkin tidak tersedia, mungkin sulit untuk mengatur titik henti menggunakan simbol.

Perintah akses memori debugger yang tersedia

Perintah seperti berikut ini yang mengakses memori secara langsung akan berfungsi.

k, kb, kc, kd, kp, kP, kv (Display Stack Backtrace)

r (Daftar)

d, da, db, dc, dd, dD, df, dp, dq, du, dw (Display Memory)

u (Tidak Dapat Dirakit)

Dan Anda dapat melangkah melalui kode.

p (Langkah)

Ada juga perintah yang dapat digunakan untuk mencoba menemukan kode yang ingin Anda debug.

s (Memori Pencarian)

.imgscan (Temukan Header Gambar)

Imgscan dapat membantu dengan penelusuran kesalahan EDXI, karena tidak seperti penelusuran kesalahan kernel berbasis KDNET tradisional, mengatur titik henti berdasarkan simbol mungkin tidak tersedia. Menemukan gambar target yang diinginkan, dapat memfasilitasi penggunaan lokasinya untuk mengatur titik henti akses memori.

.exdicmd (Perintah EXDI)

.exdicmd mengirimkan perintah EXDI ke sistem target menggunakan koneksi debugging EXDI aktif. Untuk informasi selengkapnya, lihat .exdicmd (Perintah EXDI).

Pemecahan Masalah

Lihat informasi pemecahan masalah dalam Mengonfigurasi Exdi Debugger Transport.

Lihat juga

Mengonfigurasi Exdi Debugger Transport

File Konfigurasi XML EXDI

.exdicmd (Perintah EXDI)

Menyiapkan penelusuran kesalahan Kernel Jaringan KDNET secara otomatis

Menyiapkan Penelusuran Kesalahan Kernel Jaringan KDNET Secara Manual