Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Toto téma popisuje, jak nastavit ladění QEMU Kernel-Mode pomocí EXDI ve spojení s ladicím programem Windows.
Obecné informace o nastavení konfigurace a řešení potíží s připojením EXDI naleznete v tématu Konfigurace přenosu ladicího programu EXDI.
Pomocí QEMU, virtualizačního a strojového emulačního softwaru je možné se připojit k jiným operačním systémům, které slouží jako hostitel, jako je Linux. QEMU může běžet na mnoha architekturách, jako jsou x64 a Arm64. Ladicí server ExdiGdb také podporuje další procesory, například je možné použít WinDbg k ladění QEMU spuštěného na x64 emulujícího Arm64. Použití EXDI také umožňuje, aby byl VM laděn na úrovni HW v rané fázi spuštění, dokonce ještě před načtením operačního systému.
Poznámka:
EXDI je pokročilá, specializovaná forma ladění pro specifická prostředí. Použití standardního připojení KDNET je snazší nakonfigurovat a doporučuje se. Pokud chcete nastavit ladění sítě automaticky, přečtěte si téma Automatické nastavení ladění jádra sítě KDNET.
EXDI COM Server
EXDI je rozhraní, které umožňuje rozšíření WinDbg přidáním podpory pro hardwarové ladicí programy (např. založené na JTAG nebo GdbServer). Následující diagram znázorňuje roli EXDI-GdbServer.
Důležité
Vzhledem k tomu, že EXDI nevyužívá protokol KDNET, má připojený ladicí program výrazně méně informací o tom, co běží na počítači, a mnoho příkazů bude fungovat jinak nebo nemusí vůbec fungovat. Přístup k soukromým symbolům pro laděný kód může ladicímu programu pomoct lépe porozumět provádění kódu cílových systémů. Další informace najdete v tématu Veřejné a soukromé symboly.
Nastavte připojení ladicího programu k obrazu Windows na QEMU
Tento postup popisuje, jak se připojit k virtuálnímu počítači s Windows x64, který vystavuje server GDB klientovi Windbg (který používá server MODELU COM EXDI), který běží také ve Windows. Používá se relace GdbServer RSP mezi serverem WinDbg ExdiGdbSrv.dll (klientem serveru GDB) a serverem QEMU GDB.
- Stáhněte a nainstalujte QEMU ve Windows.
- Nakonfigurujte cílový virtuální obraz QEMU pro Windows tak, aby se spouštěl s požadovaným nastavením sítě a BIOS/UEFI pro ladění.
- Spusťte prostředí QEMU pomocí spouštěcího skriptu.
- Spusťte GdbServer v QEMU.
- Zkontrolujte síťové připojení a vyhledejte a zaznamenejte cílovou IP adresu image. (VÝCHOZÍ IP adresa hostitele LocalHost a port 1234).
- Stáhněte a nainstalujte nástroje pro ladění systému Windows v hostitelském systému.
- Spusťte WinDbg pomocí příkazového řádku nebo uživatelského rozhraní pro připojení k serveru EXDI.
- Pro ladění cílového QEMU obrazu pro Windows použijte WinDbg.
Opensourcový emulátor počítače QEMU
QEMU je obecný a opensourcový emulátor počítače a virtualizátor, který způsobuje dynamický překlad. Pokud se QEMU používá jako emulátor počítače – může spouštět operační systém a programy vytvořené pro jeden procesor (například Arm64) na jiném počítači (počítač x64). Může také spouštět nebo hostovat image virtuálních počítačů pro různé operační systémy (Windows/Linux/Mac).
QEMU může pracovat s dalšími hypervisory, jako je KVM, aby používala rozšíření procesoru (HVM) pro virtualizaci. Pokud se QEMU používá jako virtualizátor, QEMU dosahuje téměř nativních výkonů spuštěním kódu hosta přímo na hostitelském procesoru. QEMU může využívat funkce hypervisoru operačního systému k snižování zátěže procesoru a emulace MMU na skutečný hardware.
Stažení a instalace QEMU
V tomto návodu se QEMU pro Windows x64 nainstaluje na počítač s platformou x64, na kterém bude spuštěn také ladicí program windows.
Stáhněte si QEMU ze stránky pro stažení QEMU: https://www.qemu.org/download/
Informace o instalaci QEMU najdete v dokumentaci k QEMU: https://www.qemu.org/documentation/
Konfigurace cílového virtuálního disku
Vyhledejte nebo vytvořte image virtuálního disku s softwarem, který chcete ladit.
V tomto příkladu se použije image disku virtuálního počítače s Windows x64 VHDX. Další informace o imagích virtuálních počítačů s Windows najdete v tématu Vytvoření virtuálního počítače s Hyper-V ve Windows 10.
Vložení ovladačů VirtIO do image Windows
Pokud chcete povolit síťové funkce a přiměřený výkon úložného zařízení, vložte nebo nainstalujte ovladače VirtIO do image disku virtuálního počítače s Windows. Ovladače VirtIO jsou k dispozici zde: https://github.com/virtio-win/kvm-guest-drivers-windows
VirtIO je standardizované rozhraní, které umožňuje virtuálním počítačům přístup k abstraktnímu hardwaru, jako jsou bloková zařízení, síťové adaptéry a konzoly. VirtIO slouží jako abstrakce hardwarových zařízení ve virtualizovaném prostředí, jako je QEMU.
Pokud chcete do image Windows vložit ovladač VirtIO, postupujte následovně:
- Extrahujte ovladače VirtIo ve složce, například
C:\VirtIo_Drivers. - Připojte VHDX obsahující virtuální počítač s Windows x64 poklikáním na VHDX v Průzkumníku souborů (můžete použít také diskpart). Windows připojí VHDX pomocí konkrétního písmene, například "L:".
- Vložení ovladače do připojené image pomocí dism:
dism /image:L: /Add-Driver /driver:C:\VirtIo_DriversDalší informace o nástroji DISM najdete v tématu Přehled nástroje DISM. - Po dokončení procesu můžete odpojit image a pokračovat v převodu VHDX na QEMU.
Převod VHDX na QEMU
Tento krok není povinný, ale doporučuje se, protože při použití nativní image QCOW QEMU místo VHDX je dosaženo lepšího výkonu.
K převodu souboru vhdx použijte následující příkaz qemu-img.exe. Tento nástroj se nachází tam, kde jste nainstalovali QEMU, například C:\Program Files\qemu.
C:\Program Files\qemu> qemu-img convert -c -p -O qcow2 MyVHDXFile.vhdx MyQEMUFile.qcow2
Stáhnout firmware UEFI
Nejlepších výsledků dosáhnete tak, že stáhnete nebo zkompilujte soubor firmwaru UEFI (OVMF.fd). Firmware je nutný, protože jinak QEMU emuluje starší systémy BIOS.
Jedním ze zdrojů pro firmware UEFI je projekt Open Clear Linux: https://clearlinux.org/
Příklad souboru UEFI OVMF.fd je k dispozici tady: https://github.com/clearlinux/common/tree/master/OVMF.fd
Extrahujte obsah staženého souboru v C:\Program Files\qemu\Firmware.
Pro jiné platformy než Intel AMD64 byste měli zkompilovat firmware z EDK2. Další informace najdete v tématu https://github.com/tianocore/tianocore.github.io/wiki/How-to-build-OVMF.
Konfigurace spouštěcího skriptu QEMU
Vytvořte konfigurační soubor v QEMU. Vytvořte například StartQEMUx64Windows.bat soubor v kořenovém adresáři QEMU. Podívejte se na níže uvedený ukázkový soubor.
Použití spouštěcího skriptu QEMU ke spuštění QEMU
Spuštěním spouštěcího skriptu QEMU spusťte QEMU.
c:\Program Files\qemu\StartQEMUx64Windows.bat
Pokud se zobrazí výzva od obránce firewallu, udělte aplikaci všechna práva pro všechny typy sítí, aby se aplikaci Windbg umožnil přístup přes Windows Firewall pro počítač s hostitelským ladicím programem.
Po spuštění virtuálního počítače s Windows v prostředí QEMU se zobrazí uživatelské rozhraní QEMU.
Pomocí kombinace kláves CTRL+ALT+ číselné klávesy přejděte do konzoly pro monitorování QEMU. Tento monitor je k dispozici také pomocí View->compatmonitor.
Zadejte gdbserver , aby se na QEMU spustil front-endový server GDB.
Funkce QEMU by se měla zobrazit. Waiting for gdb connection on device ‘tcp::1234’
Vraťte se do hlavního okna pomocí kombinace kláves CTRL+ALT+1.
Tip: Okno konzoly GDB podporuje system_reset příkaz pro rychlé restartování emulace. Zadejte help seznam příkazů konzoly GDB.
Ukázka spouštěcího skriptu pro QEMU x64 virtuálního počítače s Windows
Tady je příklad konfiguračního skriptu QEMU, který lze použít pro virtuální počítače AMD64. Nahraďte odkazy, které odkazují na soubory DISK a CDROM na umístění na vašem počítači.
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%
Síťové připojení
Místní hostitel
Pokud se server GDB správně spustil, zobrazí se číslo portu, na kterém bude server GDB naslouchat, a tento port budete muset použít ke konfiguraci páru hostitelského ladicího programu IP:Port.
Pokud se váš ladicí program hostitele nachází na stejném počítači, který hostuje hosta QEMU, použije se identifikátor localhost ve dvojici IP:Port. V tomto příkladu se použije ladicí program serveru a hostitele na stejném počítači LocalHost:1234 .
Vzdálený hostitel
Pokud pracujete na vzdáleném počítači, vyhledejte IP adresu Windows (pokud se hostitelská relace ladicího programu nenachází na stejném počítači s Windows jako virtuální počítač QEMU).
Cílová IP adresa <address>QEMU :<port number> se nakonfiguruje v uživatelském rozhraní EXDI.
V konzole QEMU (compatmonitor0) lze vydat následující příkazy, které zobrazí informace o stavu sítě a připojení.
info network
info usernet
Další informace o sítích QEMU najdete v tématu https://wiki.qemu.org/Documentation/Networking
Stažení a instalace nástrojů pro ladění systému Windows v hostitelském systému
Nainstalujte nástroje pro ladění systému Windows do hostitelského systému. Informace o stahování a instalaci nástrojů ladicího programu naleznete v tématu Nástroje ladění pro systém Windows.
Spuštění WinDbg v hostitelském systému
V tomto scénáři nastavte v uživatelském rozhraní EXDI následující možnosti pro připojení.
Typ cíle – QEMU
Cílová architektura – x64
Cílový operační systém – Windows
Heurtická velikost skenování obrázků – 0xFFE – NT
Server a port GDB – localhost:1234
Přerušení připojení – ano
I když se doporučuje použít uživatelské rozhraní EXDI, je také možné spustit WinDbg pomocí možnosti příkazového řádku podobné tomu, co je zde zobrazeno.
c:\Debuggers> windbg.exe -v -kx exdi:CLSID={29f9906e-9dbe-4d4b-b0fb-6acf7fb6d014},Kd=Guess,Inproc=ExdiGdbSrv.dll,DataBreaks=Exdi
Při použití příkazového řádku se IP adresa a port konfigurují pomocí souboru exdiConfigData.xml. Další informace naleznete v tématu EXDI XML Konfigurační soubory.
Chcete-li zobrazit další výstup, lze použít podrobnou relaci -v:. Obecné informace o možnostech WinDbg naleznete v tématu WinDbg Command-Line Možnosti.
Ladicí program by se měl spustit a připojit se k QEMU GdbServer.
Ladicí program bude indikovat úspěšnou inicializaci přenosu EXDI.
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
Okno paketů konzoly EXDIGdbServer může také zobrazit informace o stavu připojení EXDI, pokud *"Zobrazit protokol komunikačních paketů v části Upřesnit možnosti je nastaven na zapnuto. Další informace najdete v pokynech pro řešení potíží při konfiguraci přenosu ladicího programu EXDI.
Použijte WinDbg k ladění cílového obrazu QEMU pro Windows
dbgeng.dll používá heuristický algoritmus k vyhledání umístění základní načítací adresy NT v době, kdy došlo k příkazu k přerušení. Pokud soukromé symboly nejsou k dispozici, tento proces selže.
To znamená, že v mnoha režimech připojení nebude přerušení fungovat podle očekávání. Pokud ručně narušíte kód, bude to na náhodném místě, kde se Windows právě v tu chvíli prováděl. Protože symboly pro cílový kód nemusí být dostupné, může být obtížné nastavit zarážky pomocí symbolů.
Dostupné příkazy pro přístup k paměti ladicího programu
Příkazy, které přistupují k paměti přímo, budou fungovat.
k, kb, kc, kd, kp, kP, kv (Zobrazení zásobníku zpětného sledování)
d, da, db, dc, dd, dD, df, dp, dq, du, dw (Display Memory)
A můžete procházet kód.
Existují také příkazy, které lze použít k pokusu o vyhledání kódu, který chcete ladit.
.imgscan (Najít záhlaví obrázků)
Imgscan může být užitečné při ladění EDXI, protože na rozdíl od tradičního ladění jádra založeného na KDNET nemusí být k dispozici nastavení zarážek na základě symbolů. Vyhledání požadované cílové image může usnadnit použití jejího umístění k nastavení zarážky přístupu k paměti.
.exdicmd (příkaz EXDI)
.exdicmd odešle příkaz EXDI do cílového systému pomocí aktivního připojení pro ladění EXDI. Další informace najdete v tématu .exdicmd (příkaz EXDI).
Řešení problémů
Odkazujte na informace k řešení potíží v Configuring the EXDI Debugger Transport.
Viz také
Konfigurace transportního mechanismu ladicího programu EXDI
Nastavení ladění síťového jádra KDNET automaticky
#B0 Ruční nastavení síťového ladění jádra KDNET #C1