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.
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.
- Unduh dan instal QEMU di Windows.
- Konfigurasikan gambar Windows virtual QEMU target untuk diluncurkan dengan jaringan yang diperlukan dan pengaturan BIOS/UEFI untuk penelusuran kesalahan.
- Mulai lingkungan QEMU, menggunakan skrip peluncuran.
- Mulai GdbServer di QEMU.
- Periksa konektivitas jaringan dan temukan dan rekam alamat IP gambar target. (Alamat default IP HOST LocalHost, dan port 1234).
- Unduh dan instal alat penelusuran kesalahan Windows pada sistem host.
- Luncurkan WinDbg menggunakan baris perintah atau UI untuk menyambungkan ke server EXDI.
- 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:
- Ekstrak driver VirtIo dalam folder, misalnya
C:\VirtIo_Drivers
. - 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:"
- 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. - 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.
Setelah Windows Virtual Machine diluncurkan di lingkungan QEMU, antarmuka pengguna QEMU akan muncul.
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
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.
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)
d, da, db, dc, dd, dD, df, dp, dq, du, dw (Display Memory)
Dan Anda dapat melangkah melalui kode.
Ada juga perintah yang dapat digunakan untuk mencoba menemukan kode yang ingin Anda debug.
.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
Menyiapkan penelusuran kesalahan Kernel Jaringan KDNET secara otomatis
Menyiapkan Penelusuran Kesalahan Kernel Jaringan KDNET Secara Manual