Sdílet prostřednictvím


Nastavení ladění QEMU Kernel-Mode pomocí EXDI

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.

Zásobníkový diagram zobrazující roli EXDI-GdbServer s WinDbg-DbgEng nahoře, rozhraní EXDI a EXDI COM server, který komunikuje se serverem GDB.

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.

  1. Stáhněte a nainstalujte QEMU ve Windows.
  2. 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í.
  3. Spusťte prostředí QEMU pomocí spouštěcího skriptu.
  4. Spusťte GdbServer v QEMU.
  5. Zkontrolujte síťové připojení a vyhledejte a zaznamenejte cílovou IP adresu image. (VÝCHOZÍ IP adresa hostitele LocalHost a port 1234).
  6. Stáhněte a nainstalujte nástroje pro ladění systému Windows v hostitelském systému.
  7. Spusťte WinDbg pomocí příkazového řádku nebo uživatelského rozhraní pro připojení k serveru EXDI.
  8. 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ě:

  1. Extrahujte ovladače VirtIo ve složce, například C:\VirtIo_Drivers.
  2. 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:".
  3. Vložení ovladače do připojené image pomocí dism: dism /image:L: /Add-Driver /driver:C:\VirtIo_Drivers Další informace o nástroji DISM najdete v tématu Přehled nástroje DISM.
  4. 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.

Dialogové okno brány firewall Windows Defender, ve kterém jsou zaškrtnuty všechny tři možnosti.

Po spuštění virtuálního počítače s Windows v prostředí QEMU se zobrazí uživatelské rozhraní QEMU.

Snímek obrazovky QEMU zobrazující možnosti nabídky zobrazení.

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

Uživatelské rozhraní připojení jádra Windbg EXDI se zobrazenými možnostmi připojení, včetně IP adresy a adresy portu.

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.

Hlavní relace WinDbg zobrazující CLSID EXDI v názvu okna.

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í)

r (registry)

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

u (bez sestavení)

A můžete procházet kód.

p (krok)

Existují také příkazy, které lze použít k pokusu o vyhledání kódu, který chcete ladit.

s (Hledání v paměti)

.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

Konfigurační soubory EXDI XML

.exdicmd (příkaz EXDI)

Nastavení ladění síťového jádra KDNET automaticky

#B0 Ruční nastavení síťového ladění jádra KDNET #C1