Dela via


Konfigurering av EXDI-debuggerns transportprotokoll

Det här avsnittet beskriver hur du konfigurerar Kernel-Mode felsökning med EXDI. Det utökade felsökningsgränssnittet (EXDI) är ett anpassningslager mellan ett programfelsökare och ett felsökningsmål.

  • Felsökningsverktygen för Windows stöder kernelfelsökning med EXDI från och med Windows version 22000.

  • Användargränssnittet för att konfigurera EXDI är tillgängligt i felsökningsprogrammet från och med version 1.2410.11001.0.

EXDI kan användas för att upprätta en anslutning till den virtuella QEMU-miljön. Mer information finns i Konfigurera QEMU-Kernel-Mode felsökning med EXDI.

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.

Översikt över EXDI COM-server

EXDI är ett gränssnitt som utökar 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.

Stackdiagram som visar EXDI-GdbServers roll med WinDbg-DbgEng överst, ett EXDI-gränssnitt och en EXDI COM-server som kommunicerar med en GDB-server.

En COM-server refererar till en binär komponent som implementerar ett COM-gränssnitt. I det här fallet exdi3.idl implementerat av ExdiGdbSrv.dll för Windows-felsökningsprotokollklienten.

Själva ExdiGdbsrv.dll implementerar klientsidan av GDB-RSP-protokollet, och GDB-serversidan (eller ibland kallad GDB-serverstub) implementeras av QEMU GDB-servern (eller Trace32/OpenOCD/UEFI GDB-serverstub, etc.)

Eftersom EXDI-anslutningen inte är beroende av att Windows eller Windows felsökningsprotokollet KDNET laddas på måldatorn. Eftersom dessa komponenter för programvarufelsökning inte krävs kan EXDI vara användbart i tidiga enhetsuppladdningar och felsökning av problem med operativsystemstart.

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.

KRAV för EXDI-Kernel-Mode enhet

Den dator som kör felsökningsprogrammet kallas värddatoroch datorn som debuggas kallas måldator.

Följande krävs:

  • På mål- och värddatorn krävs ett nätverkskort som är kompatibelt med den önskade miljön, till exempel QEMU.

  • En nätverksanslutning mellan måldatorn och värddatorn med TCP/IP.

  • Windows 10 eller Windows 11 version 22000 eller senare.

Begränsningar

Som beskrivs ovan, eftersom EXDI inte använder KDNET-protokollet, har det anslutna felsökningsprogrammet mindre information om målsystemet och användningen av felsökningsprogrammet är annorlunda. Utan åtkomst till privata symboler för målkoden fungerar inte många kommandon som använder symboler för att förstå målsystemets tillstånd. I det här fallet är det möjligt att visa minne och registrera innehåll och demontera kod. Det kan vara mycket svårt och tidskrävande att fastställa platsen för att köra kod eller utföra andra vanliga felsökningsuppgifter utan privata symboler.

Samtidig EXDI- och KDNET-felsökning

I vissa komplexa scenarier, till exempel i tidig enhetsuppladdning, kan det vara användbart att ha två anslutningar till målenheten. En EXDI och ett KDNET. Om målet är ett Windows-operativsystem konfigureras KDNET-programfelsökning som normalt, till exempel för att ansluta till en virtuell dator. I den här konfigurationen kan någon av de två samtidiga felsökarna bryta sig in för att felsöka kod på måldatorn.

WinDbg i processerver

Den binära EXDI-komponenten kan köras antingen ur Windbg-processen eller inom Windbg-processen. Genom att använda det EXDI-användargränssnittet eller Inproc=<EXDI COM server binary> förbättras tillförlitligheten avsevärt, genom att minska COM-startfel. Därför rekommenderar vi alltid att du kör EXDI-sessionen med inproc-parametern, som alltid är aktiverad när du använder användargränssnittet.

För start av kommandoraden är standardalternativet utanför process, men i process bör aktiveras med hjälp av parametern InProc=ExdiGdbDrv.dll.

COM GDB Server-klient

Det här avsnittet beskriver användningen av EXDI COM GDB Server-klienten (ExdiGdbSrv.dll), som implementerar EXDI COM-felsökningsgränssnittet. Det är möjligt att använda samma COM-gränssnitt för att implementera andra gränssnitt, till exempel en EXDI COM-server för JTAG-DCI.

Sammanfattning av processen för att använda en EXDI-anslutning

Använd den här processen för att använda en EXDI-anslutning med WinDbg.

  1. Ladda ned och installera Windows-felsökningsverktygen i värdsystemet.
  2. Starta WinDbg med hjälp av användargränssnittet eller -kx alternativet för att ansluta till EXDI-servern.
  3. Använd WinDbg för att felsöka målsystemet med hjälp av en underuppsättning med tillgängliga felsökningskommandon.

Ett exempel på ett EXDI-användningsscenario finns i Konfigurera QEMU-Kernel-Mode felsökning med EXDI.

Ladda ned och installera Windows-felsökningsverktygen

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 och anslut till EXDI-servern

Följande alternativ kan konfigureras i gränssnittet för EXDI-kernelanslutning.

Windbg EXDI-kernelanslutningsgränssnittet, med anslutningsalternativ som visas, inklusive IP- och portadress.

  • Måltyp[Trace32|BMC-OpenOCD|QEMU|VMware|UEFI] Välj enligt den måltyp som du vill felsöka. Följande måltyper är tillgängliga.

    • Trace32 : Konfiguration av GDB-serverkonfiguration för Lauterbach Trace32 HW-felsökningsprogrammet
    • BMC-OpenOCD : BMC-OpenOCD GDB-serverkonfiguration för HW-felsökningsprogrammet
    • QEMU: QEMU SW-simulator GDB-serverkonfiguration
    • VMware: VMware GDB-serverkonfiguration
    • UEFI: Felsökning av inbyggd UEFI-programvara
  • Målarkitektur[x86 | ARM64 | x64] – Målprocessorarkitektur. Observera att alla måltyper kanske inte stöder alla målarkitekturer.

  • Måloperativsystem[Windows|Linux] – Välj enligt det måloperativsystem som du vill felsöka.

  • Bildgenomsökning av heuristisk storlek[None | 0xFE - PreNT |0xFFE - NT] – Välj ett av de tre alternativen för att fastställa heuristisk storlek för bildgenomsökning. Det här värdet konfigurerar hur felsökningsmotorn söker igenom minnet efter PE DOS-signaturen, som används för att samla in kodexkuitionstillstånd. Om attributvärdet inte har angetts (eller "0") använder felsökningsmotorn inte den snabba heuristiken och återgår till den äldre heuristik som söker igenom hela minnet och letar efter PE DOS-signaturen. Standardvärdet väljs för varje måltyp och rekommenderas.

  • Gdb-server och portTargetIPAddress:TargetPortAddress – Ange till en sträng som innehåller IPTargetAddress, ett kolon och MålportAddress. Till exempel: LocalHost:1234 eller 168.82.1.5:5555.

  • Avbrott i anslutningar[on|off] Markera kryssrutan för att bryta sig in i målet när anslutningen har upprättats.

  • Avancerade alternativ

    Visa loggen[on|off] för kommunikationspaket – Markera kryssrutan om du vill visa den råa GDBServer-kommunikationspaketloggen i hexvärden för felsökning och felsökning.

När du har valt önskade alternativ väljer du Ok för att ansluta.

Konfigurera avancerade alternativ med HJÄLP av XML-filerna för EXDI-konfiguration

De flesta alternativ som behövs är tillgängliga i användargränssnittet som beskrivs i det här avsnittet. Information om hur du konfigurerar avancerade alternativ med XML-filerna för EXDI-konfiguration finns i EXDI XML-konfigurationsfiler.

WinDbg-kommandoradens EXDI-exempel

Använd dessa alternativ för att starta windbg-sessionen som använder EXDI-gränssnittet i kommandotolken.

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

Om du vill visa ytterligare utdata som är användbara för diagnostikändamål kan den utförliga sessionen -v: användas. Allmän information om WinDbg-alternativen finns i WinDbg Command-Line Alternativ. Mer information finns i EXDI WinDbg-laddningsparametrar nedan.

Felsökningskonsolen visar initieringen av EXDI-transporten.

EXDI: DbgCoInitialize returned 0x00000001
EXDI: CoCreateInstance() returned 0x00000000
EXDI: QueryInterface(IExdiServer3) returned 0x00000000
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
Kernel Debugger connection established

Main WinDbg-session som visar EXDI CLSID i fönsterrubriken.

Konsolfönstret EXDIGdbServer kan också visa information om status för EXDI-anslutningen. Mer information om konsolen finns i Felsökning.

EXDI-WinDbg-inläsningsparametrar

Följande parametrar används med WinDbg för att starta en EXDI-kernelsession.

-kx EXDI:Options

Följande EXDI-alternativ är tillgängliga med alternativet -kx. Varje alternativ ska avgränsas med ett kommatecken.

Parameter Beskrivning
CLSID Klass-ID som tilldelats Till LiveExdiGdbSrvServer (enligt definitionen i filenExdiGdbSrv.idl).
Kd=Guess -eller- NtBaseAddr Felsökningsmotorn använder en allmän heuristisk mekanism – eller – letar efter NT-basadressen.
ForceX86 Tvingar felsökningsmotorn att använda gränssnittet IeXdiX86Context3 för att hämta/ställa in CPU-kontexten.
DataBreaks=Exdi Tillåt användning av databrytpunkter.
Inproc Tillåt användning av en inproc Exdi-Server. Det här alternativet rekommenderas – InProc=ExdiGdbDrv.dll
PathToSrvCfgFiles Sökvägen till XML-konfigurationsfilerna för EXDI.

Styr heuristiska sökningar och heuristiska storlekar

Som tidigare beskrivits använder felsökningsprogrammet en heuristisk algoritm för att hitta NT-basadressen. Om du vill avbryta heuristisk sökning slutför du följande steg när du startar WinDbg via kommandoraden.

  • Ange heuristicScanSize till 0 i exdiconfigdata.xml-filen för målservern som du ska koppla till.
  • Använd den kd=NtBaseAddr heuristiska typen på Windbg-kommandoraden.

Mer information om hur du arbetar med XML-konfigurationsfiler finns i EXDI XML-konfigurationsfiler.

Använd WinDbg för att felsöka målsystemet – brytpunkter

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.

Felsökningskommandon

Kommandon som följande som kommer åt minnet direkt fungerar.

k, kb, kc, kd, kp, kP, kv (Visa stackspårning)

r (register)

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

u (ta isär)

Och du kan gå igenom kod med hjälp av p (Steg).

Det finns också kommandon som kan användas för att försöka hitta kod som du vill felsöka.

s (sökminne)

.imgscan (Hitta bildrubriker)

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

Använd utdata från fönstret ExdiGdbServer för att övervaka anslutningssekvensen.

ExdiGdbServer textfönster som visar långa hexadecimala tal.

Problem: Fel: Det gick inte att upprätta en anslutning till GbDServer. Verifiera anslutningssträngen <hostname/ip>:portnumber

Det här problemet kan orsakas av:

  • ExdiGdbSrv.dll kan inte ansluta till GDB-målservern.
  • GDB-servern körs inte än på målenheten.
  • Brandväggsproblem, se till att båda IP-adresserna kan nås med hjälp av ping, tracert eller något annat verktyg för att kontrollera att GDB-trafiken kan gå genom brandväggen.

Problem: Felscenario med målsystemet är inte tillgängligt – DbgCoInitialize returnerade 0x00000001

Följande utdata kan returneras om målsystemet inte har lästs in eller på annat sätt inte är tillgängligt.

Microsoft (R) Windows Debugger Version 10.0.20317.1 AMD64
Copyright (c) Microsoft Corporation. All rights reserved.

EXDI: DbgCoInitialize returned 0x00000001

Det här är ett vanligt fel när ExdiGdbSrv.dll COM-servern inte kunde ansluta till QEMU GDServer, så det kan misslyckas på grund av:

  • Den föregående sessionen i ExdiGdbSrv.dll hanteras fortfarande av en dllhost.exe-process, så du måste avsluta dllhost.exe-processen. Använd TaskList i en kommandotolk för att hitta PID för dllhost.exe som är värd för ExdiGdbSrv.dll. Använd TaskKill /PID <PID ID> /f och avliva den associerade PID:en. Mer information om hur du arbetar med PID:er finns i Hitta process-ID: t.

  • QEMU gdbserver har inte startats än, eller så innehåller filen exdiconfigdata.xml ogiltiga IP:Port-värden. Om WinDbg-sessionen startas på samma värddator som den virtuella QEMU Windows-datorn, kommer IP=localhost.

  • Det gick inte att starta EXDI COM-servern (ExdiGDbSrv.dll) via dllhost.exe processen (COM-relaterad). Lös problemet genom att starta om datorn med värdfelsökaren eller Logga ut Windows och logga in igen. Om det inte fungerar registrerar du EXDI COM-servern igen när du har startat om/loggat in igen.

    • regsvr32.exe <full path to the ExdiGdbSrv.dll)

Problem: Det gick inte att starta felsökningssessionen: FAILURE HR=0x80004005:Failed to AttachKernel.

Det här problemet kan orsakas av:

  • Som beskrivs ovan är det möjligt att föregående session i ExdiGdbSrv.dll fortfarande är aktiv. Leta upp och avsluta den associerade DLL-värdprocessen enligt beskrivningen ovan.

Dialogrutan WinDbg visar fel med HR-0x80004005.

Problem: Det gick inte att starta kernel-felsökning med EXDI.

Det här problemet kan orsakas av:

  • Det finns en annan instans av ExdiGdbSrv.dll (som hanteras av dllhost.exe) som körs på värddatorn.
  • Avsluta den extra instansen av COM-tjänsten som är värd för ExdiGdbSrv.dll.
    • Ange först processerna med hjälp av verktyg som TList på värddatorn. DLLHost som är värd för ExdiGdbSrv.dll visar ExdiGdbServer.

      tlist 261928 dllhost.exe ExdiGdbServer

    • Använd kill -f XXXXX i kommandotolken för felsökning för att avsluta processen med hjälp av processnumret.

Problem: Fel: Det går inte att konfigurera GdbServer-sessionen.

Det här problemet kan orsakas av:

  • Ett fel uppstod när sessionsinformationen skulle hittas, till exempel sökvägen till XML-konfigurationsfilerna.

Problem: Fel: Miljövariabeln EXDI_GDBSRV_XML_CONFIG_FILE har inte definierats.

Det här problemet kan orsakas av:

  • ExdiGdbSrv.dll-miljövariabler är inte angivna eller på annat sätt inte tillgängliga i miljön.

Problem: Fel: EXDI_GDBSRV_XML_CONFIG_FILE miljövariabeln har inte definierats. Det Exdi-GdbServer exemplet kommer inte att fortsätta vid denna tidpunkt. Ange den fullständiga sökvägen till Exdi XML-konfigurationsfilen.

Det här problemet kan orsakas av:

  • Miljövariabeln EXDI_GDBSRV_XML_CONFIG_FILE har inte angetts. I vissa situationer skulle ExdiGDbSrv.dll fortsätta att fungera om du trycker på ok-knappen, men windbg.exe misslyckas med att fråga systemregister (t.ex. via rdmsr/wrmsr-funktioner).

Se även

Konfigurera QEMU-Kernel-Mode felsökning med EXDI

.exdicmd (EXDI-kommando)

EXDI XML-konfigurationsfiler

Konfigurera KDNET-nätverkskärnfelsökning automatiskt

Konfigurera KDNET-nätverkskärnfelsökning manuellt

Ställ in kärnlägesfelsökning manuellt