Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
I det här avsnittet beskrivs hur du konfigurerar QEMU-Kernel-Mode felsökning med EXDI med Windows-felsökningsprogrammet.
Allmän information om hur du konfigurerar och felsöker EXDI-anslutningar finns i Konfigurera EXDI-felsökningsprogrammets transport.
Med QEMU, virtualiserings- och maskinemuleringsprogramvaran, är det möjligt att ansluta till andra operativsystem som fungerar som värd, till exempel Linux. Själva QEMU kan köras på flera arkitekturer, till exempel x64 och Arm64. ExdiGdb-felsökningsservern stöder även andra processorer, till exempel är det möjligt att använda WinDbg för att felsöka QEMU som körs på x64 och emulera Arm64. Med EXDI kan också den virtuella datorn vara hårdvarudebuggad i startprocessen tidigt, även innan operativsystemet har lästs in.
Anmärkning
EXDI är en avancerad, specialiserad form av felsökning för specifika miljöer. Att använda en vanlig KDNET-anslutning är enklare att konfigurera och rekommenderas. Information om hur du konfigurerar nätverksfelsökning automatiskt finns i Konfigurera KDNET Network Kernel-felsökning automatiskt.
EXDI COM Server
EXDI är ett gränssnitt som gör det möjligt att utöka WinDbg genom att lägga till stöd för maskinvarufelsökare (t.ex. JTAG-baserade eller GdbServer-baserade). Diagrammet nedan visar rollen för EXDI-GdbServer.
Viktigt!
Eftersom EXDI inte använder KDNET-protokollet har det anslutna felsökningsprogrammet betydligt mindre information om vad som körs på datorn och många kommandon fungerar annorlunda eller fungerar kanske inte alls. Åtkomst till privata symboler för koden som debuggas kan hjälpa felsökaren att bättre förstå körningen av målsystemkoden. För mer information, se offentliga och privata symboler.
Konfigurera en felsökningsanslutning till en Windows-avbildning på QEMU
De här stegen beskriver hur du ansluter till en virtuell Windows x64-dator som exponerar en GDB-server för en Windbg-klient (som använder EXDI COM-servern), som även körs i Windows. En GdbServer RSP-session mellan WinDbg-ExdiGdbSrv.dll (GDB-serverklient) och QEMU GDB-servern används.
- Ladda ned och installera QEMU i Windows.
- Konfigurera en virtuell Windows-målbild för QEMU att starta med det nätverk som krävs och BIOS/UEFI-inställningar för felsökning.
- Starta QEMU-miljön med hjälp av ett startskript.
- Starta GdbServer på QEMU.
- Kontrollera nätverksanslutningen och leta upp och registrera målbildens IP-adress. (VÄRD-IP-standardadressen för LocalHost och porten 1234).
- Ladda ned och installera Windows-felsökningsverktygen i värdsystemet.
- Starta WinDbg med hjälp av kommandoraden eller användargränssnittet för att ansluta till EXDI-servern.
- Använd WinDbg för att felsöka QEMU Windows-målbilden.
QEMU-datoremulator med öppen källkod
QEMU är en allmän datoremulator med öppen källkod och virtualiserare som orsakar dynamisk översättning. När QEMU används som en datoremulator kan den köra operativsystem och program som skapats för en processor (till exempel en Arm64) på en annan dator (en x64-dator). Den kan också köra/vara värd för avbildningar av virtuella datorer för olika operativsystem (Windows/Linux/Mac).
QEMU kan användas med andra hypervisor-enheter som KVM för att använda CPU-tillägg (HVM) för virtualisering. När QEMU används som virtualiserare uppnår QEMU nära interna prestanda genom att köra gästkoden direkt på värdprocessorn. QEMU kan dra nytta av os hypervisor-funktioner för att avlasta CPU- och MMU-emulering till verklig maskinvara.
Ladda ned och installera QEMU
I den här genomgången installeras QEMU för Windows x64 på en x64-dator där Även Windows-felsökningsprogrammet körs.
Ladda ned QEMU från QEMU-nedladdningssidan: https://www.qemu.org/download/
Mer information om hur du installerar QEMU finns i QEMU-dokumentationen: https://www.qemu.org/documentation/
Konfigurera en virtuell måldisk
Leta upp eller skapa en virtuell diskbild som har den programvara som du vill felsöka.
I det här exemplet används en windows x64 VHDX-diskbild för virtuella datorer. Mer information om avbildningar av virtuella Windows-datorer finns i Skapa virtuell dator med Hyper-V på Windows 10.
Mata in VirtIO-drivrutinerna i Windows-avbildningen
Om du vill tillåta nätverksfunktioner och rimlig lagringsenhetsprestanda kan du antingen mata in eller installera VirtIO-drivrutinerna i diskbilden för den virtuella Windows-datorn. VirtIO-drivrutinerna finns här: https://github.com/virtio-win/kvm-guest-drivers-windows
VirtIO är ett standardiserat gränssnitt som ger virtuella datorer åtkomst till abstrakt maskinvara, till exempel blockenheter, nätverkskort och konsoler. VirtIO fungerar som ett abstraktionslager för maskinvaruenheter i en virtualiserad miljö som QEMU.
Om du vill mata in VirtIO-drivrutinen i Windows-avbildningen följer du stegen nedan:
- Extrahera VirtIo-drivrutinerna i en mapp, till exempel
C:\VirtIo_Drivers. - Montera VHDX som innehåller den virtuella Windows x64-datorn genom att dubbelklicka på VHDX i Utforskaren (du kan även använda diskpart). Windows monterar VHDX med en specifik bokstav, till exempel "L:"
- Infoga drivrutinen i den monterade avbilden med DISM:
dism /image:L: /Add-Driver /driver:C:\VirtIo_DriversMer information om DISM finns i Översikt över DISM. - När processen är klar kan du demontera avbildningen och fortsätta att konvertera VHDX till QEMU.
Konvertera VHDX till QEMU
Det här steget krävs inte, men det rekommenderas eftersom bättre prestanda uppnås när du använder en inbyggd QEMU QCOW-avbildning i stället för en VHDX.
Använd följande qemu-img.exe kommando för att konvertera vhdx. Det här verktyget finns där du installerade QEMU, till exempel C:\Program Files\qemu.
C:\Program Files\qemu> qemu-img convert -c -p -O qcow2 MyVHDXFile.vhdx MyQEMUFile.qcow2
Ladda ned inbyggd UEFI-programvara
För bästa resultat, ladda ned eller kompilera UEFI-firmwarefilen (OVMF.fd). Den inbyggda programvaran behövs eftersom QEMU annars som standard emulerar äldre BIOS-system.
En källa för UEFI Firmware är Open Clear Linux-projektet: https://clearlinux.org/
UEFI-exempelfilen OVMF.fd finns här: https://github.com/clearlinux/common/tree/master/OVMF.fd
Extrahera innehållet i den nedladdade filen i C:\Program Files\qemu\Firmware.
För andra plattformar än Intel AMD64 bör du kompilera den inbyggda programvaran från EDK2. Mer information finns i https://github.com/tianocore/tianocore.github.io/wiki/How-to-build-OVMF.
Konfigurera QEMU-startskript
Skapa konfigurationsfilen i QEMU. Skapa till exempel en StartQEMUx64Windows.bat fil under QEMU-rotkatalogen. Se exempelfilen nedan.
Använd QEMU-startskriptet för att starta QEMU
Kör QEMU-startskriptet för att starta QEMU.
c:\Program Files\qemu\StartQEMUx64Windows.bat
Om en uppmaning från brandväggsförsvararen visas, ge appen alla rättigheter till alla typer av nätverk för att möjliggöra Windbg genom Windows-brandväggen på värdfelsökningsdatorn.
När den virtuella Windows-datorn har startats i QEMU-miljön visas QEMU-användargränssnittet.
Använd CTRL+ALT+ en kombination av talnycklar för att gå till QEMU-övervakningskonsolen. Den här skärmen är också tillgänglig med använd View-compatmonitor>.
Skriv gdbserver för att starta FRONT END GDB-servern på QEMU.
QEMU bör visa Waiting for gdb connection on device ‘tcp::1234’
Gå tillbaka till huvudfönstret med hjälp av tangentkombinationen CTRL+ALT+1.
Tips: GDB-konsolfönstret stöder system_reset kommandot för att snabbt starta om emulering. Skriv help för en lista över GDB-konsolkommandon.
Exempel på QEMU x64 Windows VM-startskript
Här är ett exempel på ett QEMU-konfigurationsskript som kan användas för virtuella AMD64-datorer. Ersätt länkarna som pekar på DISK- och CDROM-filerna till platserna på datorn.
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%
Nätverksanslutningar
Lokal värd
Om GDB-servern startade korrekt kommer du att se portnumret där GDB-servern lyssnar, och du kommer att behöva använda denna port för att ställa in värdfelsökarparet IP:Port.
Om ditt värdfelsökningsprogram är beläget på samma dator som den är värd för QEMU-gästen, används localhost-identifikatorn i ip:port-paret. I det här exemplet, när server- och värdfelsökaren är på samma dator, används LocalHost:1234.
Fjärrvärd
Om du arbetar på en fjärrdator letar du upp Windows IP-adressen (om värdsessionen för felsökningsprogrammet inte finns på samma Windows-dator som den virtuella QEMU-datorn).
QEMU-mål-IP: <address><port number> konfigureras i EXDI-användargränssnittet.
Följande kommandon kan utfärdas på QEMU-konsolen (compatmonitor0) för att visa information om nätverket och anslutningsstatusen.
info network
info usernet
Mer information om QEMU-nätverk finns i https://wiki.qemu.org/Documentation/Networking
Ladda ned och installera Windows-felsökningsverktygen i värdsystemet
Installera Windows Felsökningsverktyg på värdsystemet. Information om hur du laddar ned och installerar felsökningsverktygen finns i Felsökningsverktyg för Windows.
Starta WinDbg på värdsystemet
I scenariot som beskrivs här anger du följande alternativ i EXDI-användargränssnittet för att ansluta.
Måltyp – QEMU
Målarkitektur – x64
Måloperativsystem – Windows
Bildgenomsökning av heuristisk storlek – 0xFFE – NT
Gdb-server och port – LocalHost:1234
Pausa anslutningar – ja
Även om användning av EXDI-användargränssnittet rekommenderas är det också möjligt att starta WinDbg med kommandoradsalternativet som liknar det som visas här.
c:\Debuggers> windbg.exe -v -kx exdi:CLSID={29f9906e-9dbe-4d4b-b0fb-6acf7fb6d014},Kd=Guess,Inproc=ExdiGdbSrv.dll,DataBreaks=Exdi
När du använder kommandoraden konfigureras IP-adressen och porten med hjälp av filen exdiConfigData.xml. Mer information finns i EXDI XML-konfigurationsfiler.
Om du vill visa ytterligare utdata kan den utförliga sessionen -v: användas. Allmän information om WinDbg-alternativen finns i WinDbg Command-Line Alternativ.
Felsökningsprogrammet ska starta och ansluta till QEMU GdbServer.
Felsökningsprogrammet visar den lyckade EXDI-transportinitieringen.
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
Fönstret EXDIGdbServer-konsolpaket kan också visa information om status för EXDI-anslutningen, om *"Visa kommunikationspaketloggen under Avancerade alternativ är inställd på på. Mer information finns i felsökningsinformationen i Konfigurera EXDI-felsökningsprogrammets transport.
Använda WinDbg för att felsöka QEMU Windows-målbilden
dbgeng.dll använder en heuristisk algoritm för att hitta platsen för NT-basbelastningsadressen när kommandot break inträffade. Om privata symboler inte är tillgängliga misslyckas den här processen.
Det innebär att pausen inte fungerar som förväntat under många anslutningssekvenser. Om du bryter dig in i koden manuellt är det en slumpmässig plats som Windows råkade köra vid den tidpunkten. Eftersom symboler för målkoden kanske inte är tillgängliga kan det vara svårt att ange brytpunkter med hjälp av symboler.
Tillgängliga kommandon för minnesåtkomst för felsökningsprogram
Kommandon som de följande, som direkt får åtkomst till minnet, kommer att fungera.
k, kb, kc, kd, kp, kP, kv (Visa stackspårning)
d, da, db, dc, dd, dD, df, dp, dq, du, dw (Visningsminne)
Och du kan gå igenom kod.
Det finns också kommandon som kan användas för att försöka hitta kod som du vill felsöka.
Imgscan kan vara till hjälp vid EDXI-felsökning, eftersom det till skillnad från traditionell KDNET-baserad kernelfelsökning kanske inte är tillgängligt att ange brytpunkter baserade på symboler. Att hitta en önskad målbild kan underlätta användningen av dess plats för att ange en brytpunkt för minnesåtkomst.
.exdicmd (EXDI-kommando)
.exdicmd skickar ett EXDI-kommando till målsystemet med hjälp av den aktiva EXDI-felsökningsanslutningen. Mer information finns i .exdicmd (EXDI-kommando).
Felsökning
Se felsökningsinformationen i Konfigurera EXDI-felsökningsprogrammets transport.
Se även
Konfigurera EXDI-felsökningsprogrammets transport