EXDI XML Konfigurationsdateien
In diesem Thema wird beschrieben, wie Erweiterte Optionen mithilfe der EXDI XML-Konfigurationsdateien konfiguriert werden. Allgemeine Informationen zur Verwendung der WinDbg-Benutzeroberfläche zum Konfigurieren von EXDI finden Sie unter Configuring the EXDI Debugger Transport. Die häufigsten Einstellungen sind auf der Benutzeroberfläche verfügbar. Dies ist ein einfacherer Ansatz, um dann die hier beschriebenen EXDI XML-Konfigurationsdateien manuell zu bearbeiten.
Die Extended Debugging Interface (EXDI) ist eine Anpassungsebene zwischen einem Softwaredebugger und einem Debuggingziel. Die Debuggingtools für Windows unterstützen das Kerneldebugging mit EXDI ab Windows Version 22000.
Hinweis
EXDI ist eine fortschrittliche, spezielle Form des Debuggings für bestimmte Umgebungen. Die Verwendung einer Standard-KDNET-Verbindung ist einfacher zu konfigurieren und wird empfohlen. Informationen zum automatischen Einrichten des Netzwerk-Debuggings finden Sie unter Automatisches Einrichten des KDNET-Netzwerk-Kernel-Debuggings.
Konfigurieren erweiterter Optionen mithilfe der EXDI-Konfigurations-XML-Dateien
Es gibt zwei erforderliche xml-Dateien, die vom EXDI GDB COM-Server (ExdiGdbSrv.dll) genutzt werden.
exdiConfigData.xml – Diese Datei enthält die wichtigsten Konfigurationsdaten, die der GDB-Server-Client benötigt, um eine erfolgreiche GDB-Sitzung mit dem HW-Debugger GDB-Server-Ziel aufzubauen. Der GDB-Server-Client wird also nicht ausgeführt, wenn der Ort der Datei nicht durch die Umgebungsvariable EXDI_GDBSRV_XML_CONFIG_FILE festgelegt ist. Jedes XML-Tag bietet die Möglichkeit, bestimmte Funktionen des GDB-Servers festzulegen. Im Folgenden finden Sie eine Liste der Attribute, die Sie in der XML-Datei ändern können, sowie ein XML-Beispiel.
Systemregister.xml – Diese Datei enthält eine Zuordnung zwischen Systemregistern und dem Code, der für den Zugriff auf die Register verwendet wird. Dies ist erforderlich, da der Zugriffscode nicht vom GDB-Server in der XML-Datei bereitgestellt wird und der Debugger über den Zugriffscode auf jedes Systemregister zugreift. Wenn die Datei nicht über die Umgebungsvariable
EXDI_SYSTEM_REGISTERS_MAP_XML_FILE
festgelegt wird, funktioniert die ExdiGdbSrv.dll weiterhin, der Debugger kann jedoch nicht über rdmsr- oder wrmsr-Befehle auf ein Systemregister zugreifen. Die Liste dieser Register sollte vom GDB-Serverhardwaredebugger unterstützt werden (der spezifische Systemregistername sollte in der Liste der Register vorhanden sein, die in der XML-Datei des Systems gesendet werden).
EXDI UI und die XML-Konfigurationsdateien
Die EXDI-Benutzeroberfläche in WinDbg verwendet die XML-Dateiparameter und führt in den erforderlichen Ui-Parametern zusammen, z. B. den IP:Port-Wert. Wenn die Standard-XML-Dateiparameter geändert werden müssen, starten Sie die WinDbgNext-Anwendung über die Befehlszeile mit dem Parameter PathToSrvCfgFiles=<path to the modified exdiconfigdata.xml file>
.
Zielarchitektur
Der Feldwert der EXDI-UI-Zielarchitektur muss mit dem Windows-Betriebssystem übereinstimmen, das auf dem Ziel ausgeführt wird, nur für GDB-Server-Stubs, die die XML-Zielbeschreibungsdatei nicht implementieren, die die Windows OS-Zielarchitektur beschreibt. Diese target.xml Dateiinformationen werden vom GDB-Server-Stub während des GDB-RSP-Protokoll-Handshakings zwischen dem GDB-Client und dem GDB-Server-Stub gesendet.
Windbg-ExdiGdbSrv kann weiterhin die richtige Zielbetriebssystemarchitektur festlegen, auch wenn der Benutzer einen falschen Eingabewert für das Zielarchitekturfeld in der EXDI-Benutzeroberfläche festlegt. Die Zielbetriebssystemarchitektur wird aus der von GDB-Servern bereitgestellten target.xml Beschreibungsdatei übernommen und konfiguriert, die die target.xml-Datei in die GDB-Server handshaking enthält. Um die Zielarchitektur zu überprüfen, verwenden Sie den effektiven Befehl ".effmach debugger" des Computers.
GDBServer-Tags und -Attribute
In der folgenden Tabelle werden die in der exdiConfigData.xml
Datei definierten GDBServer-Tags und -Attribute beschrieben.
Parameter | Beschreibung |
---|---|
ExdiTargets | Gibt an, welche spezifische GDB-Serverzielkonfiguration von ExdiGgbSrv.dll verwendet wird, um die GDB-Verbindung mit dem GDB-Serverziel herzustellen, da die Datei exdiConfigData.xml alle GDB-Server enthält, die derzeit von ExdiGdbSrv.dll unterstützt werden (diese Datei MUSS ausgefüllt werden, bevor ExdiGdbSrv.dll mit einem bestimmten GDB-Server verwendet wird). |
CurrentTarget | Gibt den Namen des GDB-Serverziels an (z. B. dieser Attributwert sollte mit dem Namenswert eines der <ExdiTarget Name= Tags übereinstimmen, die in der Datei exdiConfigData.xml enthalten sind. |
ExdiTarget | Dies ist das Starttag für alle Konfigurationsdaten, die von jeder GDB-Serverzielkomponente enthalten sind. |
Name | Gibt den Namen des GDB-Servers an (z. B. QEMU, BMC-OpenOCD, Trace32, VMWare). |
agentNamePacket | Dies ist der Name des GDB-Clients, wie er vom GDB-Server-HW-Debugger erkannt wird. Dies kann vom HW-Debugger des GDB-Servers verwendet werden, um sich selbst für bestimmte GDB-Clients zu konfigurieren (z. B. erfordert der Trace32-GDB-Server, dass ExdiGdbSrv.dll den Namen „QMS.windbg“ sendet, um den windbg-GDB-Client zu identifizieren und dann benutzerdefinierte GDB-Speicherpakete zu aktivieren, die nur für den MS GDB-Server-Client (exdiGdbSrv.dll) unterstützt werden). |
ExdiGdbServerConfigData | Gibt die ExdiGdbSrv.dll komponentenbezogenen Konfigurationsparameter an. |
uuid | Gibt die UUI der ExdiGdbSrv.dll Komponente an. |
displayCommPackets | Wenn die Markierung „Ja“ ist, werden die Kommunikationszeichen des RSP-Protokolls im Befehlsprotokollfenster angezeigt. Wenn "Nein" angezeigt wird, wird nur der Text des Anforderungsantwortpaars angezeigt. |
enableThrowExceptionOnMemoryErrors | Dieses Attribut wird vom GDB-Serverclient überprüft, wenn ein GDB-Fehlerantwortpaket (E0x) vorhanden ist, um festzustellen, ob der Client eine Ausnahme auslösen und den Lesespeicher beenden soll. |
qSupportedPacket | Dies ermöglicht das Konfigurieren des GDB-Clients, um anzufordern, welche XML-Registerarchitekturdatei vom GDB-Server-HW-Debugger nach der XML-Zielbeschreibungsdatei gesendet werden soll (im Grunde informiert der Client den GDB-Server, welche Architekturen vom Client unterstützt werden, derzeit unterstützt der Client die x64-Architektur). |
ExdiGdbServerTargetData | Gibt die Parameter im Zusammenhang mit dem Hardwareziel an, das von der GdbServer-Sitzung gedebuggt wird. |
targetArchitecture | Zeichenfolge, die die Zielhardwarearchitektur enthält. Mögliche Werte: X86, X64, ARM, ARM64. Derzeit unterstützt die exdiGdbSrv.dll nur X86 und ARM. |
targetFamily | Zeichenfolge, die die Zielhardwarefamilie enthält. Mögliche Werte: ProcessorFamilyX86, ProcessorFamilyX64, ProcessorFamilyARM, ProcessorFamilyARM64. |
numberOfCores | Die Anzahl der Prozessorkerne, die vom Ziel unterstützt werden. Dieser Parameter wird überprüft, wenn wir eine Multi-Gdbserver-Sitzung (T32-GdbServer-Sitzung) verwenden. Das folgende Attribut "MultiCoreGdbServerSessions" sollte auf "Ja" festgelegt werden. |
EnableSseContext | Wenn die Markierung „Ja“ ist, enthält das RSP-Paket im Kontext „g“ Gleitkommaregisterwerte. Dieser Parameter ist nur für Intel Family-Ziele sinnvoll. |
heuristicScanSize | Dies konfiguriert den schnellen heuristischen Algorithmus der Debugger-Engine so, dass die gescannte Speicherprobe um die angegebene Größe verringert wird. Wenn der Attributwertnicht angegeben ist (oder „0“), verwendet die Debugger-Engine die schnelle Heuristik nicht und greift auf die alte Heuristik zurück, die den gesamten Speicher nach der PE-DOS-Signatur durchsucht. Allgemeine Scangrößenwerte sind 0xfffe (am besten für NT) oder 0xffe (für Pre-NT-Apps). |
targetDescriptionFile | Gibt an, ob der GDB-Server eine Zielbeschreibungsheaderdatei sendet, bevor jede separate XML-Datei gesendet wird. Dieses Feld ist leer, dann fordert der GDB-Serverclient das XML-Architektursystemregister nicht an (z. B. Trace32 GDBs-Server, der das Senden von Architekturregistern in einer separaten XML-Datei nicht unterstützt). |
GdbServerConnectionParameters | Gibt GdbServer-Sitzungsparameter an. Diese Parameter werden verwendet, um die RSP GdbServer-Sitzung zwischen der ExdiGdbSrv.dll Komponente und GdbServer zu steuern. |
MultiCoreGdbServerSessions | Markieren: Wenn „Ja“, dann verfügen wir über eine Multi-Core-GdbServer-Sitzung (die vom T32-GdbServer-Back-End verwendet wird). Wenn "Nein", kommunizieren wir nur mit einer Instanz des GdbServer. |
MaximumGdbServerPacketLength | Dies ist die maximale GdbServer-unterstützte Länge für ein Paket. |
MaximumConnectAttempts | Dies ist die maximale Verbindungsversuche. Sie wird vom ExdiGdbSrv.dll verwendet, wenn versucht wird, die RSP-Verbindung mit dem GdbServer herzustellen. |
SendPacketTimeout | Dies ist das RSP-Sendetimeout. |
ReceivePacketTimeout | Dies ist das RSP-Empfangstimeout. |
HostNameAndPort | Dies ist der Verbindungsstring im Format <hostname/ip address:Port number> . Es kann mehrere GdbServer-Verbindungszeichenfolge (z. B. T32 Multi-Core GdbServer-Sitzung) geben. Die Anzahl der Verbindungszeichenfolge sollte mit der Anzahl der Kerne übereinstimmen. |
ExdiGdbServerMemoryCommands | Gibt verschiedene Möglichkeiten zum Ausgeben der GDB-Speicherbefehle an, um Systemwerte zu registrieren oder Lese-/Schreibzugriffsspeicher auf unterschiedlichen Ausnahme-CPU-Ebenen zu erhalten (z. B. BMC-OpenOCD bietet Zugriff auf CP15-Register über "aarch64 mrs nsec/sec <access code> " angepassten Befehl). |
GdbSpecialMemoryCommand | wenn "Ja", unterstützt der GDB-Server angepasste Speicherbefehle (z. B. Systemregister, dies sollte für den Trace32 GDB-Server festgelegt werden). |
PhysicalMemory | wenn "ja", unterstützt der GDB-Server angepasste Befehle zum Lesen des physischen Arbeitsspeichers (er ist für Trace32 GDB-Server festgelegt). |
SupervisorMemory | wenn "ja", dann unterstützt der GDB-Server benutzerdefinierte Befehle zum Lesen des Supervisor-Speichers (es ist für den Trace32-GDB-Server eingestellt). |
SpecialMemoryRegister | wenn "ja", dann unterstützt der GDB-Server benutzerdefinierte Befehle zum Lesen von Systemregistern (ist für den Trace32-GDB-Server eingestellt) |
SystemRegistersGdbMonitor | wenn "ja", unterstützt der GDB-Server angepasste Befehle über den GDB-Monitorbefehl (er ist für BMC Open-OCD festgelegt). |
SystemRegisterDecoding | wenn "ja", akzeptiert der GDB-Client die Decodierung des Zugriffscodes, bevor der GDB-Monitorbefehl gesendet wird. |
ExdiGdbServerRegisters | Gibt den spezifischen Architekturregisterkernsatz an. |
Aufbau | CPU-Architektur der definierten Registersätze. |
FeatureNameSupported | Dies ist der Name der Systemregistergruppe, wie sie von der XML-Systemregisterbeschreibungsdatei bereitgestellt wird. Es ist erforderlich, die XML-Registergruppe des Systems zu identifizieren, die Teil der XML-Datei ist, wie sie vom GDB-Server gesendet wird. |
SystemRegistersStart | Dies dient der Identifizierung des ersten Systemregisters (niedrigste Registernummer/-reihenfolge), das als Teil des Kernregistersatzes gemeldet wird (beispielsweise meldet QEMU unter X64 den x64-Systemregistersatz nicht als separate XML-Zielbeschreibungsdatei, sodass Systemregister Teil der Kernregister sind). |
SystemRegistersEnd | Dies ist die Identifizierung des letzten Systemregisters (hohe Registernummer/Reihenfolge), das als Teil des Kernregistersatzes gemeldet wird. |
Name | Name des Registers. |
Auftrag | Dies ist eine Zahl, die den Index im Array von Registern identifiziert. Diese Nummer wird vom GDB-Client und vom Server zum Setzen/Abfragen (p<number>”/”q<number> ) von Registerpaketen verwendet. |
Größe | Dies ist die Registergröße in Byte. |
Beispieldatei für exdiConfigData.xml
<ExdiTargets CurrentTarget = "QEMU">
<!-- QEMU SW simulator GDB server configuration -->
<ExdiTargets CurrentTarget="QEMU">
<!-- QEMU SW simulator GDB server configuration -->
<ExdiTarget Name="QEMU">
<ExdiGdbServerConfigData agentNamePacket="" uuid="72d4aeda-9723-4972-b89a-679ac79810ef" displayCommPackets="yes" debuggerSessionByCore="no" enableThrowExceptionOnMemoryErrors="yes" qSupportedPacket="qSupported:xmlRegisters=aarch64,i386">
<ExdiGdbServerTargetData targetArchitecture="ARM64" targetFamily="ProcessorFamilyARM64" numberOfCores="1" EnableSseContext="no" heuristicScanSize="0xfffe" targetDescriptionFile="target.xml"/>
<GdbServerConnectionParameters MultiCoreGdbServerSessions="no" MaximumGdbServerPacketLength="1024" MaximumConnectAttempts="3" SendPacketTimeout="100" ReceivePacketTimeout="3000">
<Value HostNameAndPort="LocalHost:1234"/>
</GdbServerConnectionParameters>
<ExdiGdbServerMemoryCommands GdbSpecialMemoryCommand="no" PhysicalMemory="no" SupervisorMemory="no" HypervisorMemory="no" SpecialMemoryRegister="no" SystemRegistersGdbMonitor="no" SystemRegisterDecoding="no"> </ExdiGdbServerMemoryCommands>
<ExdiGdbServerRegisters Architecture = "ARM64" FeatureNameSupported = "sys">
<Entry Name ="X0" Order = "0" Size = "8" />
<Entry Name ="X1" Order = "1" Size = "8" />
<Entry Name ="X2" Order = "2" Size = "8" />
<Entry Name ="X3" Order = "3" Size = "8" />
<Entry Name ="X4" Order = "4" Size = "8" />
<Entry Name ="X5" Order = "5" Size = "8" />
<Entry Name ="X6" Order = "6" Size = "8" />
<Entry Name ="X7" Order = "7" Size = "8" />
<Entry Name ="X8" Order = "8" Size = "8" />
<Entry Name ="X9" Order = "9" Size = "8" />
<Entry Name ="X10" Order = "a" Size = "8" />
<Entry Name ="X11" Order = "b" Size = "8" />
<Entry Name ="X12" Order = "c" Size = "8" />
<Entry Name ="X13" Order = "d" Size = "8" />
<Entry Name ="X14" Order = "e" Size = "8" />
<Entry Name ="X15" Order = "f" Size = "8" />
<Entry Name ="X16" Order = "10" Size = "8" />
<Entry Name ="X17" Order = "11" Size = "8" />
<Entry Name ="X18" Order = "12" Size = "8" />
<Entry Name ="X19" Order = "13" Size = "8" />
<Entry Name ="X20" Order = "14" Size = "8" />
<Entry Name ="X21" Order = "15" Size = "8" />
<Entry Name ="X22" Order = "16" Size = "8" />
<Entry Name ="X23" Order = "17" Size = "8" />
<Entry Name ="X24" Order = "18" Size = "8" />
<Entry Name ="X25" Order = "19" Size = "8" />
<Entry Name ="X26" Order = "1a" Size = "8" />
<Entry Name ="X27" Order = "1b" Size = "8" />
<Entry Name ="X28" Order = "1c" Size = "8" />
<Entry Name ="fp" Order = "1d" Size = "8" />
<Entry Name ="lr" Order = "1e" Size = "8" />
<Entry Name ="sp" Order = "1f" Size = "8" />
<Entry Name ="pc" Order = "20" Size = "8" />
<Entry Name ="cpsr" Order = "21" Size = "8" />
<Entry Name ="V0" Order = "22" Size = "16" />
<Entry Name ="V1" Order = "23" Size = "16" />
<Entry Name ="V2" Order = "24" Size = "16" />
<Entry Name ="V3" Order = "25" Size = "16" />
<Entry Name ="V4" Order = "26" Size = "16" />
<Entry Name ="V5" Order = "27" Size = "16" />
<Entry Name ="V6" Order = "28" Size = "16" />
<Entry Name ="V7" Order = "29" Size = "16" />
<Entry Name ="V8" Order = "2a" Size = "16" />
<Entry Name ="V9" Order = "2b" Size = "16" />
<Entry Name ="V10" Order = "2c" Size = "16" />
<Entry Name ="V11" Order = "2d" Size = "16" />
<Entry Name ="V12" Order = "2e" Size = "16" />
<Entry Name ="V13" Order = "2f" Size = "16" />
<Entry Name ="V14" Order = "30" Size = "16" />
<Entry Name ="V15" Order = "31" Size = "16" />
<Entry Name ="V16" Order = "32" Size = "16" />
<Entry Name ="V17" Order = "33" Size = "16" />
<Entry Name ="V18" Order = "34" Size = "16" />
<Entry Name ="V19" Order = "35" Size = "16" />
<Entry Name ="V20" Order = "36" Size = "16" />
<Entry Name ="V21" Order = "37" Size = "16" />
<Entry Name ="V22" Order = "38" Size = "16" />
<Entry Name ="V23" Order = "39" Size = "16" />
<Entry Name ="V24" Order = "3a" Size = "16" />
<Entry Name ="V25" Order = "3b" Size = "16" />
<Entry Name ="V26" Order = "3c" Size = "16" />
<Entry Name ="V27" Order = "3d" Size = "16" />
<Entry Name ="V28" Order = "3e" Size = "16" />
<Entry Name ="V29" Order = "3f" Size = "16" />
<Entry Name ="V30" Order = "3f" Size = "16" />
<Entry Name ="V31" Order = "3f" Size = "16" />
<Entry Name ="fpsr" Order = "40" Size = "4" />
<Entry Name ="fpcr" Order = "41" Size = "4" />
</ExdiGdbServerRegisters>
<!-- x64 GDB server core resgisters -->
<ExdiGdbServerRegisters Architecture = "X64" FeatureNameSupported = "sys" SystemRegistersStart = "18" SystemRegistersEnd = "20" >
<Entry Name ="rax" Order = "0" Size ="8" />
<Entry Name ="rbx" Order = "1" Size ="8" />
<Entry Name ="rcx" Order = "2" Size ="8" />
<Entry Name ="rdx" Order = "3" Size ="8" />
<Entry Name ="rsi" Order = "4" Size ="8" />
<Entry Name ="rdi" Order = "5" Size ="8" />
<Entry Name ="rbp" Order = "6" Size ="8" />
<Entry Name ="rsp" Order = "7" Size ="8" />
<Entry Name ="r8" Order = "8" Size ="8" />
<Entry Name ="r9" Order = "9" Size ="8" />
<Entry Name ="r10" Order = "a" Size ="8" />
<Entry Name ="r11" Order = "b" Size ="8" />
<Entry Name ="r12" Order = "c" Size ="8" />
<Entry Name ="r13" Order = "d" Size ="8" />
<Entry Name ="r14" Order = "e" Size ="8" />
<Entry Name ="r15" Order = "f" Size ="8" />
<Entry Name ="rip" Order = "10" Size ="8" />
<!-- <flags id="x64_eflags" size="4">
<field name="" start="22" end="31"/>
<field name="ID" start="21" end="21"/>
<field name="VIP" start="20" end="20"/>
<field name="VIF" start="19" end="19"/>
<field name="AC" start="18" end="18"/>
<field name="VM" start="17" end="17"/>
<field name="RF" start="16" end="16"/>
<field name="" start="15" end="15"/>
<field name="NT" start="14" end="14"/>
<field name="IOPL" start="12" end="13"/>
<field name="OF" start="11" end="11"/>
<field name="DF" start="10" end="10"/>
<field name="IF" start="9" end="9"/>
<field name="TF" start="8" end="8"/>
<field name="SF" start="7" end="7"/>
<field name="ZF" start="6" end="6"/>
<field name="" start="5" end="5"/>
<field name="AF" start="4" end="4"/>
<field name="" start="3" end="3"/>
<field name="PF" start="2" end="2"/>
<field name="" start="1" end="1"/>
<field name="CF" start="0" end="0"/>
</flags> -->
<Entry Name ="eflags" Order = "11" Size ="4" />
<!-- Segment registers -->
<Entry Name ="cs" Order = "12" Size ="4" />
<Entry Name ="ss" Order = "13" Size ="4" />
<Entry Name ="ds" Order = "14" Size ="4" />
<Entry Name ="es" Order = "15" Size ="4" />
<Entry Name ="fs" Order = "16" Size ="4" />
<Entry Name ="gs" Order = "17" Size ="4" />
<!-- Segment descriptor caches and TLS base MSRs -->
<!--Entry Name ="cs_base" Order = "18" Size="8"/
<Entry Name ="ss_base" Order = "18" Size ="8" />
<Entry Name ="ds_base" Order = "19" Size ="8" />
<Entry Name ="es_base" Order = "1a" Size ="8" /> -->
<Entry Name ="fs_base" Order = "18" Size ="8" />
<Entry Name ="gs_base" Order = "19" Size ="8" />
<Entry Name ="k_gs_base" Order = "1a" Size ="8" />
<!-- Control registers -->
<!-- the cr0 register format fields:
<flags id="x64_cr0" size="8">
<field name="PG" start="31" end="31"/>
<field name="CD" start="30" end="30"/>
<field name="NW" start="29" end="29"/>
<field name="AM" start="18" end="18"/>
<field name="WP" start="16" end="16"/>
<field name="NE" start="5" end="5"/>
<field name="ET" start="4" end="4"/>
<field name="TS" start="3" end="3"/>
<field name="EM" start="2" end="2"/>
<field name="MP" start="1" end="1"/>
<field name="PE" start="0" end="0"/>
</flags> -->
<Entry Name ="cr0" Order = "1b" Size ="8" />
<Entry Name ="cr2" Order = "1c" Size ="8" />
<!-- the cr3 register format fields:
<flags id="x64_cr3" size="8">
<field name="PDBR" start="12" end="63"/>
<field name="PCID" start="0" end="11"/>
</flags> -->
<Entry Name ="cr3" Order = "1d" Size ="8" />
<!-- the cr4 register format fields:
<flags id="x64_cr4" size="8">
<field name="PKE" start="22" end="22"/>
<field name="SMAP" start="21" end="21"/>
<field name="SMEP" start="20" end="20"/>
<field name="OSXSAVE" start="18" end="18"/>
<field name="PCIDE" start="17" end="17"/>
<field name="FSGSBASE" start="16" end="16"/>
<field name="SMXE" start="14" end="14"/>
<field name="VMXE" start="13" end="13"/>
<field name="LA57" start="12" end="12"/>
<field name="UMIP" start="11" end="11"/>
<field name="OSXMMEXCPT" start="10" end="10"/>
<field name="OSFXSR" start="9" end="9"/>
<field name="PCE" start="8" end="8"/>
<field name="PGE" start="7" end="7"/>
<field name="MCE" start="6" end="6"/>
<field name="PAE" start="5" end="5"/>
<field name="PSE" start="4" end="4"/>
<field name="DE" start="3" end="3"/>
<field name="TSD" start="2" end="2"/>
<field name="PVI" start="1" end="1"/>
<field name="VME" start="0" end="0"/>
</flags> -->
<Entry Name ="cr4" Order = "1e" Size ="8" />
<Entry Name ="cr8" Order = "1f" Size ="8" />
<!-- the efer register format fields:
<flags id="x64_efer" size="8">
<field name="TCE" start="15" end="15"/>
<field name="FFXSR" start="14" end="14"/>
<field name="LMSLE" start="13" end="13"/>
<field name="SVME" start="12" end="12"/>
<field name="NXE" start="11" end="11"/>
<field name="LMA" start="10" end="10"/>
<field name="LME" start="8" end="8"/>
<field name="SCE" start="0" end="0"/>
</flags> -->
<Entry Name ="efer" Order = "20" Size ="8"/>
<!-- x87 FPU -->
<Entry Name ="st0" Order = "21" Size ="10" />
<Entry Name ="st1" Order = "22" Size ="10" />
<Entry Name ="st2" Order = "23" Size ="10" />
<Entry Name ="st3" Order = "24" Size ="10" />
<Entry Name ="st4" Order = "25" Size ="10" />
<Entry Name ="st5" Order = "26" Size ="10" />
<Entry Name ="st6" Order = "27" Size ="10" />
<Entry Name ="st7" Order = "28" Size ="10" />
<Entry Name ="fctrl" Order = "29" Size ="4" />
<Entry Name ="fstat" Order = "2a" Size ="4" />
<Entry Name ="ftag" Order = "2b" Size ="4" />
<Entry Name ="fiseg" Order = "2c" Size ="4" />
<Entry Name ="fioff" Order = "2d" Size ="4" />
<Entry Name ="foseg" Order = "2e" Size ="4" />
<Entry Name ="fooff" Order = "2f" Size ="4" />
<Entry Name ="fop" Order = "30" Size ="4" />
<Entry Name ="xmm0" Order = "31" Size ="16" />
<Entry Name ="xmm1" Order = "32" Size ="16" />
<Entry Name ="xmm2" Order = "33" Size ="16" />
<Entry Name ="xmm3" Order = "34" Size ="16" />
<Entry Name ="xmm4" Order = "35" Size ="16" />
<Entry Name ="xmm5" Order = "36" Size ="16" />
<Entry Name ="xmm6" Order = "37" Size ="16" />
<Entry Name ="xmm7" Order = "38" Size ="16" />
<Entry Name ="xmm8" Order = "39" Size ="16" />
<Entry Name ="xmm9" Order = "3a" Size ="16" />
<Entry Name ="xmm10" Order = "3b" Size ="16" />
<Entry Name ="xmm11" Order = "3c" Size ="16" />
<Entry Name ="xmm12" Order = "3d" Size ="16" />
<Entry Name ="xmm13" Order = "3e" Size ="16" />
<Entry Name ="xmm14" Order = "3f" Size ="16" />
<Entry Name ="xmm15" Order = "40" Size ="16" />
<!-- the mxcsr register format fields:
<flags id="x64_mxcsr" size="4">
<field name="IE" start="0" end="0"/>
<field name="DE" start="1" end="1"/>
<field name="ZE" start="2" end="2"/>
<field name="OE" start="3" end="3"/>
<field name="UE" start="4" end="4"/>
<field name="PE" start="5" end="5"/>
<field name="DAZ" start="6" end="6"/>
<field name="IM" start="7" end="7"/>
<field name="DM" start="8" end="8"/>
<field name="ZM" start="9" end="9"/>
<field name="OM" start="10" end="10"/>
<field name="UM" start="11" end="11"/>
<field name="PM" start="12" end="12"/>
<field name="FZ" start="15" end="15"/>
</flags> -->
<Entry Name ="mxcsr" Order = "41" Size ="4" />
</ExdiGdbServerRegisters>
</ExdiGdbServerConfigData>
</ExdiTarget>
</ExdiTargets>
</ExdiTargets>
EXDI PowerShell-Beispielskript:
Dieses PowerShell-Beispielskript installiert EXDI und startet dann den Debugger. Das Skript Start-ExdiDebugger.ps1 installiert bei Bedarf ExdiGdbSrv.dll, konfiguriert die XML-Einstellungsdateien, sucht nach laufenden dllhost.exe-Prozessen und startet den Debugger, um eine Verbindung mit einem bereits laufenden Hardware-Debuggingziel des GDB-Servers herzustellen.
Wenn Sie die Benutzeroberfläche mit WinDBg verwenden, ist die ExdiGdbSrv.dll bereits installiert, und dieses Skript ist nicht relevant. Weitere Informationen zur Verwendung der integrierten Benutzeroberfläche finden Sie unter Konfigurieren des EXDI-Debuggertransports.
Dies ist ein Beispiel für das Aufrufen des Startskripts.
PS>.\Start-ExdiDebugger.ps1 -ExdiTarget "QEMU" -GdbPort 1234 -Architecture x64
Sie können die integrierten Dateien auch bei Bedarf angeben.
PS>.\Start-ExdiDebugger.ps1 -ExdiTarget "QEMU" -GdbPort 1234 -Architecture x64 -ExdiDropPath "C:\path\to\built\exdi\files"
Die Start-ExdiDebugger.ps1 verfügt über die folgenden Einstellungsoptionen.
Parameter | Beschreibung |
---|---|
ExdiTarget | Der Typ des Ziels, mit dem eine Verbindung hergestellt werden soll. Dies entspricht einem bestimmten Abschnitt in der XML-Datei "Einstellungen" |
HostName | Die IP-Adresse oder der Hostname des Computers, auf dem die gdb-Serversitzung gehostet wird (standardmäßig "LocalHost") |
GdbPort | Der Port, auf dem der gdb-Server lauscht. |
Aufbau | Architektur des Hardwaredebuggingziels (dieser Parameter impliziert auch den ArchitectureFamily-Parameter in der XML-Einstellungsdatei) |
ExdiDropPath | Speicherort der Dateien ExdiGdbSrv.dll, exdiConfigData.xml und systemregisters.xml. Diese werden nur kopiert, wenn ExdiGdbSrv.dll nicht installiert oder falsch installiert ist. |
ExtraDebuggerArgs | Zusätzliche Argumente, die an die Befehlszeile des Debuggers übergeben werden sollen |
PreNTAppDebugging | Ändert den Wert des heuristicScanSize von 0xfffe (am besten für NT) in 0xffe (für Pre-NT-Apps) |
DontTryDllHostCleanup | Für die Überprüfung auf vorhandene ausgeführte Instanzen von ExdiGdbSrv.dll in dllhost.exe ist eine Erhöhung erforderlich. Wenn Sie diese Option angeben, kann das Skript ohne Erhöhung ausgeführt werden (obwohl der Debugger möglicherweise nicht ordnungsgemäß funktioniert). |
Um die Anzeige von Paketen zu ermöglichen, legen Sie den Wert von displayCommPackets auf "Ja" fest.
[pscustomobject]@{ Path = 'displayCommPackets' ; value = "yes" }
.\Start-ExdiDebugger.ps1 -ExdiTarget "QEMU" -GdbPort 1234 -Architecture x64 -ExdiDropPath "C:\path\to\built\exdi\files"
Weitere Einstellungsoptionen finden Sie in den Codekommentaren.
<#
.Synopsis
Installs and launches exdi debugger (automating xml file editing)
.Description
This script will install ExdiGdbSrv.dll if required, configure the xml settings
files, check for running dllhost.exe processes, and launch the debugger to connect to
an already running gdb server hardware debugging target.
.Parameter ExdiTarget
Type of target to connect to. This corresponds to a specific section in the settings xml file
.Parameter HostName
IP address or hostname of the computer hosting the gdb server session (defaults to "LocalHost")
.Parameter GdbPort
Port that the gdb server is listening on.
.Parameter Architecture
Architecture of the hardware debugging target (this parameter also implies the ArchitectureFamily
parameter in the xml settings file)
.Parameter ExdiDropPath
Location of the ExdiGdbSrv.dll, exdiConfigData.xml, and systemregisters.xml files. These will
only be copied if ExdiGdbSrv.dll is not installed or is installed incorrectly.
.Parameter ExtraDebuggerArgs
Extra arguments to pass on the debugger command line
.Parameter PreNTAppDebugging
Changes the value of the heuristicScanSize from 0xfffe (best for NT) to 0xffe (for pre-NT Apps)
.Parameter DontTryDllHostCleanup
Checking for existing running instances of ExdiGdbSrv.dll in dllhost.exe requires elevation.
Providing this switch will allow the script to run without elevation (although the debugger may not
function correctly).
.Example
>---------------- (first run) ------------<
.\Start-ExdiDebugger.ps1 -ExdiTarget "QEMU" -GdbPort 1234 -Architecture x64 -ExdiDropPath "C:\path\to\built\exdi\files"
.Example
PS>.\Start-ExdiDebugger.ps1 -ExdiTarget "QEMU" -GdbPort 1234 -Architecture x64
#>
[CmdletBinding()]
param
(
[ValidateSet("QEMU")]
[string]
$ExdiTarget = "QEMU",
[string]
$HostName = "LocalHost",
[Parameter(Mandatory=$true)]
[Int]
$GdbPort,
[Parameter(Mandatory=$true)]
[string]
[ValidateSet("x86", "x64", "arm64")]
$Architecture,
[string]
$ExdiDropPath,
[string]
$DebuggerPath,
[string[]]
$ExtraDebuggerArgs = @(),
[switch]
$PreNTAppDebugging,
[switch]
$DontTryDllHostCleanup
)
$ErrorActionPreference = "Stop"
#region Functions
Function Test-Admin
{
([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]"Administrator")
}
Function Find-PathToWindbgX
{
$InternalWindbgXPath = "$env:LOCALAPPDATA\DBG\UI\WindbgX.exe"
$ExternalWindbgXPath = "$env:LOCALAPPDATA\Microsoft\WindowsApps\WinDbgX.exe"
if (Test-Path $InternalWindbgXPath -PathType Leaf)
{
return $InternalWindbgXPath
}
elseif (Test-Path $ExternalWindbgXPath -PathType Leaf)
{
return $ExternalWindbgXPath
}
}
Function Test-ParameterValidation
{
$CommandName = $PSCmdlet.MyInvocation.InvocationName
$ParameterList = (Get-Command -Name $CommandName).Parameters
foreach ($Parameter in $ParameterList) {
Get-Variable -Name $Parameter.Values.Name -ErrorAction SilentlyContinue | Out-String | Write-Verbose
}
if (-not $DebuggerPath)
{
throw "WindbgX is not installed"
}
elseif (-not (Test-Path $DebuggerPath -PathType Leaf))
{
throw "DebuggerPath param ($DebuggerPath) does not point to a debugger."
}
# Searching for loaded instances of ExdiGdbSrv.dll in dllhost.exe requires elevation
if (-not $DontTryDllHostCleanup -and
-not $(Test-Admin))
{
throw "Searching for loaded instances of ExdiGdbSrv.dll in dllhost.exe requires elevation. Run with the -DontTryDllHostCleanup parameter to skip this check (debugger session init may fail)."
}
}
Function Get-ExdiInstallPath
{
Get-ItemPropertyValue -Path "Registry::HKEY_CLASSES_ROOT\CLSID\{29f9906e-9dbe-4d4b-b0fb-6acf7fb6d014}\InProcServer32" -Name "(default)" -ErrorAction SilentlyContinue
}
Function Test-ExdiServerInstalled
{
# Check registration of exdi server class
if ($(Get-ExdiInstallPath) -ne $null -and $(Test-Path "$(Get-ExdiInstallPath)"))
{
Write-Verbose "Exdi server is installed. Checking installation..."
$ExdiInstallDir = [System.IO.Path]::GetDirectoryName($(Get-ExdiInstallPath))
if (-not (Test-Path $ExdiInstallDir))
{
Write-Host "Currently Registered exdi server does not exist. Reinstalling..."
return $false
}
elseif (-not ((Test-Path "$ExdiInstallDir\exdiConfigData.xml") -and (Test-Path "$ExdiInstallDir\systemregisters.xml")))
{
Write-Host "Currently Registered exdi server does not have required xml settings files. Reinstalling..."
return $false
}
else
{
Write-Verbose "Exdi server is insalled correctly. Skipping installation..."
return $true
}
}
else
{
Write-Host "Exdi server is not installed. Installing..."
return $false
}
}
Function Install-ExdiServer
{
[CmdletBinding()]
param
(
[string] $InstallFrom,
[string] $InstallTo
)
if (-not $(Test-Admin))
{
throw "Script needs to be run as an Admin to install exdi software."
}
New-Item -ItemType Directory $InstallTo -ErrorAction SilentlyContinue | Write-Verbose
Copy-Item -Path "$InstallFrom\ExdiGdbSrv.dll" -Destination $InstallTo -ErrorAction stop | Write-Verbose
Copy-Item -Path "$InstallFrom\exdiConfigData.xml" -Destination $InstallTo -ErrorAction stop | Write-Verbose
Copy-Item -Path "$InstallFrom\systemregisters.xml" -Destination $InstallTo -ErrorAction stop | Write-Verbose
regsvr32 /s "$InstallTo\ExdiGdbSrv.dll"
if ($(Get-ExdiInstallPath) -eq $null)
{
throw "Unable to install exdi server"
}
}
Function Edit-ExdiConfigFile
{
[CmdletBinding()]
param
(
[string] $ExdiFilePath,
[string] $ExdiTargetType,
[PSCustomObject[]] $XmlSettingPathValueList
)
# Edit exdiConfigData.xml
[xml]$exdiConfigXml = Get-Content "$ExdiFilePath"
# Set current target
$exdiConfigXml.ExdiTargets.CurrentTarget = $ExdiTarget
# set HostNameAndPort
$ExdiTargetXmlNode = $exdiConfigXml.SelectSingleNode("//ExdiTargets/ExdiTarget[@Name='$ExdiTarget']/ExdiGdbServerConfigData")
foreach ($XmlSettingPathValue in $XmlSettingPathValueList)
{
Write-Verbose "Processing $XmlSettingPathValue"
if ($XmlSettingPathValue.Value -eq $null)
{
continue
}
$PathParts = $XmlSettingPathValue.Path.Split(".")
$curNode = $ExdiTargetXmlNode
if ($PathParts.Count -gt 1)
{
foreach ($PathPart in $PathParts[0..($PathParts.Count-2)])
{
Write-Verbose $PathPart
$curNode = $curNode.($PathPart)
}
}
$curNode.($PathParts[-1]) = $XmlSettingPathValue.Value
}
$exdiConfigXml.Save("$ExdiFilePath")
}
Function Stop-ExdiContainingDllHosts
{
$DllHostPids = Get-Process dllhost | ForEach-Object { $_.Id }
foreach ($DllHostPid in $DllHostPids)
{
$DllHostExdiDlls = Get-Process -Id $DllHostPid -Module | Where-Object { $_.FileName -like "*ExdiGdbSrv.dll" }
if ($DllHostExdiDlls.Count -ne 0)
{
Write-Verbose "Killing dllhost.exe with pid $DllHostPid (Contained instance of ExdiGdbSrv.dll)"
Stop-Process -Id $DllHostPid -Force
}
}
}
#endregion
#region Script
# Apply defaults for $DebuggerPath before Parameter validation
if (-not $DebuggerPath)
{
$DebuggerPath = Find-PathToWindbgX
}
Test-ParameterValidation
# look clean up dllhost.exe early since it can hold a lock on files which
# need to be overwritten
if (-not $DontTryDllHostCleanup)
{
Stop-ExdiContainingDllHosts
}
if (-not $(Test-ExdiServerInstalled))
{
if (-not $ExdiDropPath)
{
throw "ExdiServer is not installed and -ExdiDropPath is not valid"
}
$ExdiInstallDir = Join-Path -Path "$([System.IO.Path]::GetDirectoryName($DebuggerPath))" -ChildPath "exdi"
Install-ExdiServer -InstallFrom "$ExdiDropPath" -InstallTo "$ExdiInstallDir"
}
$SystemRegistersFilepath = Join-Path -Path "$([System.IO.Path]::GetDirectoryName($(Get-ExdiInstallPath)))" -ChildPath "systemregisters.xml"
$ExdiConfigFilepath = Join-Path -Path "$([System.IO.Path]::GetDirectoryName($(Get-ExdiInstallPath)))" -ChildPath "exdiConfigData.xml"
# Calculate implied parameters
$HeuristicScanSize = if ($PreNTAppDebugging) { "0xffe" } else { "0xfffe" }
$ArchitectureFamily = switch($Architecture)
{
x64 { "ProcessorFamilyx64" }
x86 { "ProcessorFamilyx86" }
arm64 { "ProcessorFamilyARM64" }
}
# Path is evaluated relative to the relevant ExdiTarget's ExdiGdbServerConfigData node in the xml schema
$SettingsToChange = @(
[pscustomobject]@{ Path = 'GdbServerConnectionParameters.Value.HostNameAndPort' ; Value = "${HostName}:$GdbPort" },
[pscustomobject]@{ Path = 'ExdiGdbServerTargetData.targetArchitecture' ; Value = "$Architecture" },
[pscustomobject]@{ Path = 'ExdiGdbServerTargetData.targetFamily' ; Value = "$ArchitectureFamily" },
[pscustomobject]@{ Path = 'ExdiGdbServerTargetData.heuristicScanSize' ; Value = "$HeuristicScanSize" },
[pscustomobject]@{ Path = 'displayCommPackets' ; value = "no" }
)
Edit-ExdiConfigFile -ExdiFilePath "$ExdiConfigFilepath" -ExdiTargetType "$ExdiTarget" -XmlSettingPathValueList $SettingsToChange
# Set env vars for debugger
[System.Environment]::SetEnvironmentVariable('EXDI_GDBSRV_XML_CONFIG_FILE',"$ExdiConfigFilepath")
[System.Environment]::SetEnvironmentVariable('EXDI_SYSTEM_REGISTERS_MAP_XML_FILE',"$SystemRegistersFilepath")
$DebuggerArgs = @("-v", "-kx exdi:CLSID={29f9906e-9dbe-4d4b-b0fb-6acf7fb6d014},Kd=Guess,DataBreaks=Exdi")
Write-Verbose "DebuggerPath = $DebuggerPath"
Start-Process -FilePath "$DebuggerPath" -ArgumentList ($DebuggerArgs + $ExtraDebuggerArgs)
#endregion
Siehe auch
EXDI-Debugger-Transport konfigurieren
Einrichten des QEMU-Kernelmodusdebuggings mit EXDI
Automatisches Einrichten des KDNET-Netzwerkkernel-Debuggings