Dela via


EXDI XML-konfigurationsfiler

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).

  1. 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.

  2. 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

Konfigurera QEMU-Kernel-Mode felsökning med EXDI

.exdicmd (EXDI-kommando)

Konfigurera KDNET-nätverkskärnfelsökning automatiskt