Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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.
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.
- Download en installeer de Windows-foutopsporingsprogramma's op het hostsysteem.
- Start WinDbg met behulp van de gebruikersinterface of de -kx optie om verbinding te maken met de EXDI-server.
- 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.
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 poort
TargetIPAddress:TargetPortAddress- Stel in op een tekenreeks die het IPTargetAddress, een dubbele punt en het Target PortAddress bevat. Bijvoorbeeld:LocalHost:1234of168.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
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=NtBaseAddrheuristische 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)
d, da, db, dc, dd, dD, df, dp, dq, du, dw (Display Memory)
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.
.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.
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
TaskListbij een opdrachtprompt om de PID te vinden van dllhost.exe die als host fungeert voor de ExdiGdbSrv.dll. GebruikTaskKill /PID <PID ID> /fen 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.
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 XXXXXbij de opdrachtprompt voor foutopsporing om het proces te beëindigen met behulp van het procesnummer.
- 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.
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
EXDI XML-configuratiebestanden
Automatisch KDNET-netwerk kerneldebugging instellen