Delen via


Het transport van de EXDI-debugger configureren

In dit onderwerp wordt beschreven hoe u Kernel-Mode Foutopsporing instelt met behulp van EXDI. De Extended Debugging Interface (EXDI) is een aanpassingslaag tussen een softwaredebugger en een foutopsporingsdoel.

  • De Hulpprogramma's voor foutopsporing voor Windows ondersteunen kernelfoutopsporing met behulp van EXDI vanaf Windows versie 22000.

  • De gebruikersinterface voor het configureren van EXDI is beschikbaar in het foutopsporingsprogramma vanaf versie 1.2410.11001.0.

EXDI kan worden gebruikt om een verbinding tot stand te brengen met de virtuele QEMU-omgeving. Zie QEMU instellen Kernel-Mode Foutopsporing met behulp van EXDI voor meer informatie.

Opmerking

EXDI is een geavanceerde, gespecialiseerde vorm van foutopsporing voor specifieke omgevingen. Het gebruik van een standaard KDNET-verbinding is eenvoudiger te configureren en wordt aanbevolen. Als u automatisch netwerkfoutopsporing wilt instellen, raadpleegt u Instellen van KDNET-netwerk kernelfoutopsporing automatisch.

Overzicht van EXDI COM-server

EXDI is een interface die WinDbg uitbreidt door ondersteuning toe te voegen voor hardwaredebuggers (bijvoorbeeld op basis van JTAG of GdbServer). In het onderstaande diagram ziet u de rol van EXDI-GdbServer.

Stackdiagram met de rol van EXDI-GdbServer met WinDbg-DbgEng bovenaan, een EXDI-interface en een EXDI COM-server die communiceert met een GDB-server.

Een COM-server verwijst naar een binair onderdeel dat een COM-interface implementeert. In dit geval is exdi3.idl geïmplementeerd door ExdiGdbSrv.dll voor de Windows-foutopsporingsprotocolclient.

De ExdiGdbsrv.dll zelf implementeert de clientzijde van het GDB-RSP-protocol, terwijl de GDB-serverzijde (of soms genaamd GDB-serverstub) wordt geïmplementeerd door de QEMU GDB-server (of Trace32/OpenOCD/UEFI GDB-serverstub, enzovoort).

Omdat de EXDI-verbinding geen afhankelijkheid heeft van Windows of het Windows-foutopsporingsprotocol dat op de doel-pc wordt geladen. Omdat deze onderdelen van het softwareopsporingsprogramma niet vereist zijn, kan EXDI nuttig zijn in het begin van het apparaat en bij het opsporen van problemen met het opstarten van het besturingssysteem.

Belangrijk

Omdat EXDI geen gebruik maakt van het KDNET-protocol, heeft het verbonden foutopsporingsprogramma aanzienlijk minder informatie over wat op de pc wordt uitgevoerd en werken veel opdrachten anders of werkt het helemaal niet. Toegang tot persoonlijke symbolen voor de code die wordt opgespoord, kan het foutopsporingsprogramma helpen beter inzicht te krijgen in de uitvoering van de doelsystemencode. Zie openbare en persoonlijke symbolenvoor meer informatie.

Vereisten voor EXDI-Kernel-Mode-apparaten

De computer waarop het foutopsporingsprogramma wordt uitgevoerd, wordt de hostcomputergenoemd en de computer die wordt opgespoord, wordt de doelcomputergenoemd.

Het volgende is vereist:

  • Op zowel de doel- als de hostcomputer is een netwerkkaart nodig die wordt ondersteund door de gewenste omgeving, zoals QEMU.

  • Een netwerkverbinding tussen het doel en de host met behulp van TCP/IP.

  • Windows 10 of Windows 11 versie 22000 of hoger.

Beperkingen

Zoals hierboven beschreven, omdat EXDI geen gebruik maakt van het KDNET-protocol, heeft het verbonden foutopsporingsprogramma minder informatie over het doelsysteem en is het gebruik van het foutopsporingsprogramma anders. Zonder toegang tot privésymbolen voor de doelcode werken veel opdrachten die symbolen gebruiken om de status van het doelsysteem te begrijpen, niet. In dit geval is het mogelijk om geheugen weer te geven en inhoud te registreren en code te demonteren. Het bepalen van de locatie van actieve code of het uitvoeren van andere veelvoorkomende foutopsporingsprogrammataken kan erg moeilijk en tijdrovend zijn zonder persoonlijke symbolen.

Gelijktijdige EXDI- en KDNET-foutopsporing

In sommige complexe scenario's, bijvoorbeeld bij de vroege opstartfase van apparaten, kan het nuttig zijn om twee verbindingen met het doelapparaat te hebben. Eén EXDI en één KDNET. Als het doel een Windows-besturingssysteem is, wordt de foutopsporing van KDNET-software geconfigureerd zoals normaal gesproken, bijvoorbeeld om verbinding te maken met een virtuele machine. In deze installatie kan een van de twee gelijktijdige foutopsporingsprogramma's inbreken om foutopsporingscode op de doelcomputer op te sporen.

WinDbg in processerver

Het binaire EXDI-onderdeel kan uit het Windbg-proces of binnen het Windbg-proces worden uitgevoerd. Het gebruik van de EXDI-gebruikersinterface of de Inproc=<EXDI COM server binary> verbetert de betrouwbaarheid aanzienlijk door COM-opstartfouten te verminderen. Daarom wordt altijd aanbevolen om de EXDI-sessie uit te voeren met de parameter Inproc, die altijd is ingeschakeld wanneer u de gebruikersinterface gebruikt.

Voor het opstarten van de opdrachtregel is de standaardoptie buiten het proces, maar in-proces moet worden ingeschakeld met behulp van de InProc=ExdiGdbDrv.dll parameter.

COM GDB Server Client

In dit onderwerp wordt het gebruik van de EXDI COM GDB Server-client (ExdiGdbSrv.dll) beschreven waarmee de INTERFACE van het EXDI COM-foutopsporingsprogramma wordt geïmplementeerd. Het is mogelijk om dezelfde COM-interface te gebruiken om andere interfaces te implementeren, zoals een EXDI COM-server voor JTAG-DCI.

Samenvatting van het proces voor het gebruik van een EXDI-verbinding

Gebruik dit proces om een EXDI-verbinding met WinDbg te gebruiken.

  1. Download en installeer de Windows-foutopsporingsprogramma's op het hostsysteem.
  2. Start WinDbg met behulp van de gebruikersinterface of de -kx optie om verbinding te maken met de EXDI-server.
  3. Gebruik WinDbg om fouten in het doelsysteem op te sporen met behulp van een subset met beschikbare opdrachten voor foutopsporingsprogramma's.

Zie QEMU instellen Kernel-Mode Foutopsporing met behulp van EXDI voor een voorbeeld van een EXDI-gebruiksscenario.

De Windows-hulpprogramma's voor foutopsporing downloaden en installeren

Installeer de Windows-foutopsporingsprogramma's op het hostsysteem. Zie Hulpprogramma's voor foutopsporing voor Windowsvoor meer informatie over het downloaden en installeren van de hulpprogramma's voor foutopsporing.

Start WinDbg en maak verbinding met de EXDI-server

De volgende opties kunnen worden geconfigureerd in de gebruikersinterface van de EXDI-kernelverbinding.

Ui van Windbg EXDI-kernelverbinding, met verbindingsopties weergegeven, inclusief IP- en poortadres.

  • Doeltype[Trace32|BMC-OpenOCD|QEMU|VMware|UEFI] Selecteer op basis van het doeltype dat u wilt opsporen. De volgende doeltypen zijn beschikbaar.

    • Trace32 : Lauterbach Trace32 HW-foutopsporingsprogramma GDB-serverconfiguratie
    • BMC-OpenOCD: BMC-OpenOCD HW-foutopsporingsprogramma GDB-serverconfiguratie
    • QEMU: QEMU SW-simulator GDB-server configuratie
    • VMware: VMware GDB-serverconfiguratie
    • UEFI: Foutopsporing voor UEFI-firmware
  • Doelarchitectuur[x86 | ARM64 | x64] - Doelprocessorarchitectuur. Houd er rekening mee dat alle doeltypen mogelijk niet alle doelarchitecturen ondersteunen.

  • Doelbesturingssysteem[Windows|Linux] - Selecteer op basis van het doelbesturingssysteem dat u wilt debuggen.

  • Afbeelding scannen heuristiek formaat[None | 0xFE - PreNT |0xFFE - NT] - Selecteer een van de drie opties om de heuristische grootte voor het scannen van afbeeldingen te bepalen. Deze waarde bepaalt hoe de debugger het geheugen doorzoekt naar de PE-DOS-handtekening, die wordt gebruikt om de status van code-uitvoering te verzamelen. Als de kenmerkwaarde niet is opgegeven (of '0'), gebruikt de engine voor foutopsporing niet de snelle heuristiek en valt deze terug op de verouderde heuristiek die het volledige geheugen scant op zoek naar de PE DOS-handtekening. De standaardwaarde wordt geselecteerd voor elk doeltype en wordt aanbevolen.

  • Gdb-server en poortTargetIPAddress:TargetPortAddress - Stel in op een tekenreeks die het IPTargetAddress, een dubbele punt en het Target PortAddress bevat. Bijvoorbeeld: LocalHost:1234 of 168.82.1.5:5555.

  • Onderbreking van verbindingen[on|off] Schakel het selectievakje in om het doel in te breken nadat de verbinding tot stand is gebracht.

  • Geavanceerde opties

    Communicatiepakketlogboek weergeven[on|off] - Schakel het selectievakje in om in hexwaarden het onbewerkte GDBServer-communicatiepakketlogboek weer te geven voor foutopsporing en probleemoplossing.

Nadat de gewenste opties zijn geselecteerd, selecteert u OK om verbinding te maken.

Geavanceerde opties configureren met behulp van de XML-bestanden van de EXDI-configuratie

De meest benodigde opties zijn beschikbaar in de gebruikersinterface die in dit onderwerp wordt beschreven. Zie EXDI XML-configuratiebestanden voor meer informatie over het configureren van geavanceerde opties met behulp van de XML-configuratiebestanden van EXDI.

Voorbeeld van WinDbg-opdrachtregel EXDI

Als u de windbg-sessie wilt starten die gebruikmaakt van de EXDI-interface bij de opdrachtprompt, gebruikt u deze opties.

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

Om aanvullende uitvoer weer te geven die nuttig voor diagnostische doeleinden is, kunt u de -v: uitgebreide sessie gebruiken. Zie WinDbg Command-Line Optionsvoor algemene informatie over de WinDbg-opties. Zie de onderstaande EXDI WinDbg Load Parameters voor meer informatie.

In de console voor foutopsporingsprogramma's wordt de initialisatie van het EXDI-transport weergegeven.

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

Hoofd-WinDbg-sessie met EXDI CLSID in de venstertitel.

Het consolevenster EXDIGdbServer kan ook informatie weergeven over de status van de EXDI-verbinding. Zie Probleemoplossing voor meer informatie over de console.

EXDI WinDbg Load Parameters

De volgende parameters worden gebruikt met WinDbg om een EXDI-kernelsessie te starten.

-kx EXDI:Opties

De volgende EXDI-opties zijn beschikbaar met de optie -kx. Elke optie moet worden gescheiden met een komma.

Kenmerk Beschrijving
CLSID Klasse-id die is toegewezen aan de LiveExdiGdbSrvServer (zoals gedefinieerd in het bestandExdiGdbSrv.idl).
Kd=Guess -or- NtBaseAddr De engine voor foutopsporing maakt gebruik van een algemeen heuristisch mechanisme, of zoekt naar het NT-basisadres.
ForceX86 Dwingt de foutopsporingsprogramma-engine om de IeXdiX86Context3-interface te gebruiken voor het ophalen/instellen van de CPU-context.
DataBreaks=Exdi Toestaan dat gegevensonderbrekingspunten worden gebruikt.
Inproc Toestaan dat een inproc Exdi-Server wordt gebruikt. Deze optie wordt aanbevolen - InProc=ExdiGdbDrv.dll
PathToSrvCfgFiles Het pad naar de XML-configuratiebestanden voor EXDI.

Het beheren van de heuristische zoekmethoden en de omvang van heuristieken.

Zoals eerder beschreven, gebruikt het foutopsporingsprogramma een heuristisch algoritme om het NT-basisadres te vinden. Als u de heuristische zoekopdracht wilt annuleren, voert u de volgende stappen uit wanneer u WinDbg via de opdrachtregel start.

  • Stel de heuristicScanSize in op 0 in het exdiconfigdata.xml-bestand voor de doelserver waarop u gaat verbinden.
  • Gebruik het kd=NtBaseAddr heuristische type op de Windbg-opdrachtregel.

Zie EXDI XML-configuratiebestanden voor meer informatie over het werken met XML-configuratiebestanden.

WinDbg gebruiken om fouten op te sporen in het doelsysteem - onderbrekingspunten

De dbgeng.dll gebruikt een heuristisch algoritme om de locatie van het NT-basistaakadres te vinden op het moment dat de onderbrekingsopdracht heeft plaatsgevonden. Als er geen privésymbolen beschikbaar zijn, mislukt dit proces.

Dit betekent dat de onderbreking onder veel verbindingsreeksen niet werkt zoals verwacht. Als u handmatig in de code breekt, zal dit een willekeurige locatie zijn waar Windows op dat moment mee bezig was. Omdat symbolen voor de doelcode mogelijk niet beschikbaar zijn, kan het lastig zijn om onderbrekingspunten in te stellen met behulp van symbolen.

Opdrachten voor foutopsporingsprogramma

Opdrachten zoals het volgende die rechtstreeks toegang krijgen tot geheugen, werken.

k, kb, kc, kd, kp, kP, kv (Display Stack Backtrace)

r (registers)

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

u (unassemble)

En u kunt code stapsgewijs doorlopen met behulp van p (stap).

Er zijn ook commando's die kunnen worden gebruikt om code te lokaliseren die u wilt debuggen.

(zoekgeheugen)

.imgscan (Afbeeldingskopteksten zoeken)

Imgscan kan handig zijn met EDXI-foutopsporing, omdat in tegenstelling tot traditionele kernelfoutopsporing op basis van KDNET, het instellen van onderbrekingspunten op basis van symbolen mogelijk niet beschikbaar is. Het vinden van een gewenste doelafbeelding kan het gebruik van de locatie vergemakkelijken om een onderbrekingspunt voor geheugentoegang in te stellen.

.exdicmd (EXDI-opdracht)

De .exdicmd verzendt een EXDI-opdracht naar het doelsysteem met behulp van de actieve EXDI-foutopsporingsverbinding. Zie .exdicmd (EXDI Command)voor meer informatie.

Probleemoplossingsproces

Gebruik de uitvoer van het venster ExdiGdbServer om de verbindingsreeks te bewaken.

ExdiGdbServer-tekstvenster met lange hexadecimale getallen.

Probleem: Fout: kan geen verbinding tot stand brengen met de GbDServer. De verbindingsreeks controleren <hostname/ip>:portnumber

Dit probleem kan worden veroorzaakt door:

  • De ExdiGdbSrv.dll kan geen verbinding maken met de GDB-doelserver.
  • De GDB-server draait nog niet op het doelapparaat.
  • Firewallproblemen, zorg ervoor dat beide IP-adressen bereikbaar zijn met behulp van ping, tracert of een ander hulpprogramma om te controleren of het GDB-verkeer via de firewall kan gaan.

Probleem: Foutscenario met het doelsysteem is niet beschikbaar - DbgCoInitialize heeft geretourneerd 0x00000001

De volgende uitvoer kan worden geretourneerd als het doelsysteem niet is geladen of anderszins niet beschikbaar is.

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

EXDI: DbgCoInitialize returned 0x00000001

Dit is een veelvoorkomende fout wanneer de ExdiGdbSrv.dll COM-server geen verbinding kan maken met de QEMU GDServer, zodat deze kan mislukken vanwege:

  • De vorige sessie van de ExdiGdbSrv.dll wordt nog steeds gehost door een dllhost.exe proces, dus u moet het dllhost.exe proces beëindigen. Gebruik TaskList bij een opdrachtprompt om de PID te vinden van dllhost.exe die als host fungeert voor de ExdiGdbSrv.dll. Gebruik TaskKill /PID <PID ID> /f en dood de bijbehorende PID. Zie De proces-id zoeken voor meer informatie over het werken met PID's.

  • De QEMU gdbserver is nog niet gestart of het exdiconfigdata.xml bestand bevat een ongeldige IP:Poort-waarden. Als de WinDbg-sessie wordt gestart op dezelfde host-pc als de QEMU Windows-VM, dan het IP=LocalHost.

  • Fout bij het starten van de EXDI COM-server (ExdiGDbSrv.dll) via het dllhost.exe proces (COM-gerelateerd). U kunt dit oplossen door de pc voor het foutopsporingsprogramma van de host opnieuw op te starten of Windows af te melden en u opnieuw aan te melden. Als dat niet werkt, moet u de EXDI COM-server opnieuw registreren nadat u de EXDI COM-server opnieuw hebt opgestart/zich opnieuw hebt aangemeld.

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

Probleem: De foutopsporingssessie kan niet worden gestart: FAILURE HR=0x80004005:Failed to AttachKernel.

Dit probleem kan worden veroorzaakt door:

  • Zoals hierboven beschreven, is het mogelijk dat de vorige sessie van de ExdiGdbSrv.dll nog actief is. Zoek en beëindig de bijbehorende DLL-host zoals hierboven beschreven.

Dialoogvenster WinDbg geeft foutmelding met HR 0x80004005 weer.

Probleem: kan kernelfoutopsporing niet starten met behulp van EXDI.

Dit probleem kan worden veroorzaakt door:

  • Er is een ander exemplaar van de ExdiGdbSrv.dll (gehost door dllhost.exe) dat wordt uitgevoerd op de debuggercomputer van de host.
  • Beëindig het extra exemplaar van de COM-service die als host fungeert voor de ExdiGdbSrv.dll.
    • Vermeld eerst de processen, met behulp van hulpprogramma's zoals TList op de host-pc. De DLLHost die als host fungeert voor de ExdiGdbSrv.dll toont ExdiGdbServer.

      tlist 261928 dllhost.exe ExdiGdbServer

    • Gebruik kill -f XXXXX bij de opdrachtprompt voor foutopsporing om het proces te beëindigen met behulp van het procesnummer.

Probleem: Fout: kan de GdbServer-sessie niet configureren.

Dit probleem kan worden veroorzaakt door:

  • Er is een fout opgetreden bij het vinden van de sessiegegevens, zoals het pad naar de XML-configuratiebestanden.

Probleem: Fout: de omgevingsvariabele EXDI_GDBSRV_XML_CONFIG_FILE is niet gedefinieerd.

Dit probleem kan worden veroorzaakt door:

  • ExdiGdbSrv.dll omgevingsvariabelen zijn niet ingesteld of anderszins niet beschikbaar in de omgeving.

Probleem: Fout: de omgevingsvariabele EXDI_GDBSRV_XML_CONFIG_FILE is niet gedefinieerd. Het Exdi-GdbServer voorbeeld wordt op dit moment niet voortgezet. Stel het volledige pad in op het Exdi XML-configuratiebestand.

Dit probleem kan worden veroorzaakt door:

  • De omgevingsvariabele EXDI_GDBSRV_XML_CONFIG_FILE is niet ingesteld. In sommige situaties blijft ExdiGDbSrv.dll werken als u op de knop OK drukt, maar windbg.exe mislukt het uitvoeren van query's op systeemregisters (bijvoorbeeld via rdmsr/wrmsr-functies).

Zie ook

QEMU instellen Kernel-Mode Foutopsporing met behulp van EXDI

.exdicmd (EXDI-opdracht)

EXDI XML-configuratiebestanden

Automatisch KDNET-netwerk kerneldebugging instellen

KDNET-netwerkkern-debugging handmatig configureren

Debuggen handmatig instellen Kernel-Mode