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.
Det här avsnittet beskriver hur du konfigurerar avancerade alternativ med hjälp av EXDI XML-konfigurationsfilerna. Allmän information om hur du använder WinDbg-användargränssnittet för att konfigurera EXDI finns i Konfigurera EXDI-felsökningsprogrammets transport. De vanligaste inställningarna är tillgängliga i användargränssnittet, vilket är en enklare metod än att manuellt redigera EXDI XML-konfigurationsfilerna, som beskrivs här.
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.
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.
Konfigurera avancerade alternativ med HJÄLP av XML-filerna för EXDI-konfiguration
Det finns två nödvändiga XML-filer som används av EXDI GDB COM-servern (ExdiGdbSrv.dll).
exdiConfigData.xml – Den här filen innehåller de viktigaste konfigurationsdata som krävs av GDB-serverklienten för att upprätta en GDB-session med GDB-servermålet för HW-felsökningsprogrammet, så GDB-serverklienten körs inte om filplatsen inte anges av EXDI_GDBSRV_XML_CONFIG_FILE miljövariabeln. Varje XML-tagg gör det möjligt att konfigurera en specifik uppsättning GDB-serverfunktioner. Se nedan för en lista över de attribut som du kan ändra i XML och XML-exempel.
Systemregister.xml – Den här filen innehåller en mappning mellan systemregister och den kod som används för att komma åt registren. Detta krävs eftersom åtkomstkoden inte tillhandahålls av GDB-servern i XML-filen, och felsökningsprogrammet kommer åt varje systemregister via åtkomstkoden. Om filen inte anges via miljövariabeln
EXDI_SYSTEM_REGISTERS_MAP_XML_FILEfortsätter ExdiGdbSrv.dll att fungera, men felsökaren kommer inte att kunna komma åt något systemregister via rdmsr- eller wrmsr-kommandon. Listan över dessa register bör stödjas av GDB-serverns maskinvarufelsökare (det specifika systemregisternamnet bör finnas i listan över register som skickas i system-XML-filen).
EXDI-användargränssnittet och XML-konfigurationsfilerna
EXDI-användargränssnittet i WinDbg använder XML-filparametrarna och sammanfogar de obligatoriska parametrarna för användargränssnittet, till exempel IP:Port-värdet. Om du behöver ändra xml-standardfilparametrarna startar du WinDbgNext-programmet från kommandoraden med parametern PathToSrvCfgFiles=<path to the modified exdiconfigdata.xml file>.
Målarkitektur
Fältvärdet för målenhetens EXDI UI-arkitektur måste matcha Windows-operativsystemet som körs på målenheten, och detta gäller endast för GDB-serverstubbar som inte implementerar en XML-fil för att beskriva Windows-operativsystemets målarkitektur. Den här target.xml filinformationen skickas av GDB-serverns stub under GDB-RSP protokollhandskakning mellan GDB-klienten och GDB-serverns stub.
Windbg-ExdiGdbSrv kan fortfarande ange rätt måloperativsystemarkitektur även om användaren anger ett felaktigt indatavärde för målarkitekturfältet i EXDI-användargränssnittet. Målarkitekturen för operativsystemet konfigureras utifrån beskrivningsfilen för target.xml som tillhandahålls av GDB-servrar som inkluderar target.xml-filen i handshaken med GDB-servern. Om du vill kontrollera målarkitekturen använder du det effektiva felsökningskommandot .effmach för datorn.
GDBServer-taggar och attribut
I följande tabell beskrivs TAGGAR och attribut för GDBServer som definierats i exdiConfigData.xml filen.
| Parameter | Beskrivning |
|---|---|
| ExdiTargets | Anger vilken specifik GDB-servermålkonfiguration som ska användas av ExdiGgbSrv.dll för att upprätta GDB-anslutningen med GDB-servermålet, eftersom den exdiConfigData.xml filen innehåller alla GDB-servrar som stöds för närvarande av ExdiGdbSrv.dll (den här filen måste fyllas i innan du använder ExdiGdbSrv.dll med en viss GDB-server). |
| CurrentTarget | Anger namnet på GDB-servermålet (t.ex. det här attributvärdet ska matcha med namnvärdet för en av taggarna <ExdiTarget Name= som ingår i exdiConfigData.xml-filen. |
| ExdiTarget | det här är starttaggen för alla konfigurationsdata som ingår i varje GDB-servermålkomponent. |
| Namn | Anger namnet på GDB-servern (t.ex. QEMU, BMC-OpenOCD, Trace32, VMware). |
| agentNamnPaket | Det här är namnet på GDB-klienten eftersom den identifieras av GDB-serverns HW-felsökare. Detta kan användas av GDB-serverns HW-felsökare för att konfigurera sig själv för specifika GDB-klienter (t.ex. Trace32 GDB-servern kräver att ExdiGdbSrv.dll skickar namnet "QMS.windbg" för att identifiera windbg-GDB-klienten och sedan aktivera anpassade GDB-minnespaket som endast stöds för MS GDB-serverklienten (exdiGdbSrv.dll). |
| ExdiGdbServerConfigData | Ange de ExdiGdbSrv.dll-komponentrelaterade konfigurationsparametrarna. |
| Universellt unik identifierare (UUID) | anger UUI för komponenten ExdiGdbSrv.dll. |
| displayCommPackets | Flagga om ja, då visar vi RSP-protokollkommunikationstecken i kommandologgfönstret. Om nej visar vi bara partexten request-response. |
| enableThrowExceptionOnMemoryErrors | Det här attributet kontrolleras av GDB-serverklienten när det finns ett GDB-felsvarspaket (E0x) för att avgöra om klienten ska generera ett undantag och sluta läsa minne. |
| qSupportedPacket | Detta gör det möjligt att konfigurera GDB-klienten för att begära vilken xml-registerarkitekturfil som ska skickas av GDB-serverns HW-felsökare efter xml-målbeskrivningsfilen (i princip informerar klienten GDB-servern om vilka arkitekturer som stöds av klienten, för närvarande stöder klienten x64-arkitekturen). |
| ExdiGdbServerTargetData | Anger de parametrar som är relaterade till maskinvarumålet som debuggas av GdbServer-sessionen. |
| targetArchitecture | Sträng som innehåller målmaskinvaruarkitekturen. Möjliga värden: X86, X64, ARM, ARM64. För närvarande stöder exdiGdbSrv.dll endast X86 och ARM. |
| målgruppsfamilj | Sträng som innehåller målhårdvarans familj. Möjliga värden: ProcessorFamilyX86, ProcessorFamilyX64, ProcessorFamilyARM, ProcessorFamilyARM64. |
| numberOfCores | Antal processorkärnor som målet stöder. Den här parametern verifieras när vi använder en multi-Gdbserver-session (T32-GdbServer session). Attributet "MultiCoreGdbServerSessions" nedan ska vara inställt på "ja". |
| EnableSseContext | Flagga om "ja" och sedan innehåller RSP-paketet för G-kontexten flyttalsvärden. Den här parametern är endast lämplig för Intel-familjemål. |
| heuristicSkanningsstorlek | Detta konfigurerar den snabba heuristiska algoritmen för felsökningsmotorn för att minska den skannade minnesavsökningen med den angivna storleken, om attributvärdet inte har angetts (eller "0"), kommer felsökningsmotorn inte att använda den snabba heuristiken och återgå till den äldre heuristik som söker igenom hela minnet och letar efter PE DOS-signaturen. Vanliga genomsökningsstorleksvärden är 0xfffe (bäst för NT) eller 0xffe (för pre-NT-appar). |
| targetDescriptionFile | anger om GDB-servern skickar en rubrikfil för målbeskrivning innan varje separat XML-fil skickas. Det här fältet är tomt och GDB-serverklienten begär inte xml-arkitektursystemregistret (t.ex. Trace32 GDBs-servern som inte stöder sändning av arkitekturregister i en separat XML-fil). |
| GdbServerConnectionParameters | Anger parametrar för GdbServer-session. Dessa parametrar används för att styra RSP GdbServer-sessionen mellan ExdiGdbSrv.dll-komponenten och GdbServer. |
| MultiCoreGdbServerSessions | Flagga om ja, då kommer vi att ha en GdbServer-session med flera kärnor (den som används av T32-GdbServer Back-End). Om nej kommunicerar vi bara med en instans av GdbServer. |
| MaximumGdbServerPacketLength | Det här är den maximala GdbServer-längd som stöds för ett paket. |
| MaximalaAnslutningsförsök | Det här är de maximala anslutningsförsöken. Den används av ExdiGdbSrv.dll när den försöker upprätta RSP-anslutningen till GdbServer. |
| SendPacketTimeout | Det här är tidsgränsen för RSP-sändning. |
| MottagnaPaketTidsgräns | Det här är tidsgränsen för RSP-mottagning. |
| HostNameAndPort | Det här är anslutningssträngen i formatet <hostname/ip address:Port number>. Det kan finnas mer än en GdbServer-anslutningssträng (till exempel T32 GdbServer-session med flera kärnor). Antalet anslutningssträngar ska matcha med antalet kärnor. |
| ExdiGdbServerMemoryCommands | Anger olika sätt att utfärda GDB-minneskommandon för att hämta systemregistervärden eller läs-/skrivåtkomstminne på olika undantags-CPU-nivåer (t.ex. BMC-OpenOCD ger åtkomst till CP15-registret via "aarch64 mrs nsec/sek <access code>" anpassat kommando). |
| GdbSpecialMemoryCommand | om "ja" stöder GDB-servern anpassade minneskommandon (t.ex. systemregister bör detta anges för Trace32 GDB-server). |
| Fysiskt minne | om "ja" stöder GDB-servern anpassade kommandon för att läsa fysiskt minne (det är inställt för Trace32 GDB-server). |
| SupervisorMemory | om "ja" stöder GDB-servern anpassade kommandon för att läsa övervakarminne (den är inställd för Trace32 GDB-server). |
| Specialminnesregister | om "ja" stöder GDB-servern anpassade kommandon för att läsa systemregister (den är inställd för Trace32 GDB-server) |
| SystemRegistersGdbMonitor | om "ja" stöder GDB-servern anpassade kommandon via GDB-övervakningskommandot (det är inställt för BMC Open-OCD). |
| Systemregisteravkodning | om "ja" accepterar GDB-klienten avkodning av åtkomstkoden innan gdb-övervakningskommandot skickas. |
| ExdiGdbServerRegisters | Anger den specifika kärnuppsättningen för arkitekturregister. |
| Arkitektur | CPU-arkitektur för den definierade registeruppsättningen. |
| FeatureNameSupported | Det här är namnet på systemregistergruppen eftersom den tillhandahålls av xml-systemregistrets beskrivningsfil. Det behövs för att identifiera den xml-grupp för systemregister som ingår i XML-filen när den skickas av GDB-servern. |
| SystemRegistersStart | Detta är för att identifiera det första systemregistret (med lågt nummer eller ordning) som rapporteras som en del av kärnregisteruppsättningen (t.ex. på X64 rapporterar QEMU inte x64-systemregisteruppsättningen som en separerad XML-målbeskrivningsfil, så systemregister är en del av kärnregistren). |
| SystemRegistersEnd | Detta är för att identifiera det sista systemregistret (högt registernummer/ordning) som rapporteras som en del av kärnregisteruppsättningen. |
| Namn | Namnet på registret. |
| Beställning | Det här är ett tal som identifierar indexet i matrisen med register. Det här numret kommer att användas av GDB-klienten och server för att ställa/hämta (p<number>”/”q<number>) registerfrågor. |
| Storlek | Det här är registerstorleken i byte. |
Exempel på exdiConfigData.xml fil
<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>
Exempel på EXDI PowerShell-skript
Det här PowerShell-exempelskriptet installerar EXDI och startar sedan felsökningsprogrammet. Skriptet Start-ExdiDebugger.ps1 installerar ExdiGdbSrv.dll om det behövs, konfigurerar xml-inställningsfilerna, söker efter dllhost.exe processer och startar felsökningsprogrammet för att ansluta till ett mål för felsökning av gdb-servermaskinvara som redan körs.
När du använder användargränssnittet avalible med WinDBg är ExdiGdbSrv.dll redan installerat och det här skriptet är inte relevant. Mer information om hur du använder det inbyggda användargränssnittet finns i Konfigurera EXDI-felsökningsprogrammets transport.
Det här är ett exempel på hur du anropar startskriptet.
PS>.\Start-ExdiDebugger.ps1 -ExdiTarget "QEMU" -GdbPort 1234 -Architecture x64
Du kan också ange de skapade filerna om det behövs.
PS>.\Start-ExdiDebugger.ps1 -ExdiTarget "QEMU" -GdbPort 1234 -Architecture x64 -ExdiDropPath "C:\path\to\built\exdi\files"
Start-ExdiDebugger.ps1 har följande inställningsalternativ.
| Parameter | Beskrivning |
|---|---|
| ExdiTarget | Vilken typ av mål som ska anslutas till. Detta motsvarar ett specifikt avsnitt i xml-filen för inställningar |
| värdnamn | IP-adressen eller värdnamnet för den dator som är värd för gdb-serversessionen (standardvärdet är "LocalHost") |
| GdbPort | Porten som gdb-servern lyssnar på. |
| Arkitektur | Arkitektur för maskinvarufelsökningsmålet (den här parametern innebär också parametern ArchitectureFamily i xml-inställningsfilen) |
| ExdiDropPath | Plats för filerna ExdiGdbSrv.dll, exdiConfigData.xmloch systemregisters.xml. Dessa kopieras endast om ExdiGdbSrv.dll inte har installerats eller har installerats felaktigt. |
| ExtraDebuggerArgs | Extra argument att vidarebefordra på kommandoraden för felsökningsprogrammet |
| PreNTAppDebugging | Ändrar värdet för heuristicScanSize från 0xfffe (bäst för NT) till 0xffe (för pre-NT Apps) |
| DontTryDllHostCleanup | För att söka efter befintliga instanser av ExdiGdbSrv.dll som körs i dllhost.exe krävs utökade privilegier. Om du anger den här växeln kan skriptet köras utan utökade privilegier (även om felsökningsprogrammet kanske inte fungerar korrekt). |
Om du vill aktivera paket som ska visas anger du värdet för displayCommPackets till ja.
[pscustomobject]@{ Path = 'displayCommPackets' ; value = "yes" }
.\Start-ExdiDebugger.ps1 -ExdiTarget "QEMU" -GdbPort 1234 -Architecture x64 -ExdiDropPath "C:\path\to\built\exdi\files"
Se kodkommentarna för fler inställningsalternativ.
<#
.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
Se även
Konfigurera EXDI-felsökningsprogrammets transport