Sdílet prostřednictvím


Konfigurační soubory EXDI XML

Toto téma popisuje, jak nakonfigurovat pokročilé možnosti pomocí konfiguračních souborů EXDI XML. Obecné informace o použití uživatelského rozhraní WinDbg ke konfiguraci EXDI naleznete v tématu Konfigurace přenosu ladicího programu EXDI. Nejběžnější nastavení jsou k dispozici v uživatelském rozhraní, což je jednodušší přístup a pak ručně upravit konfigurační soubory EXDI XML, jak je popsáno zde.

Rozšířené rozhraní ladění (EXDI) je adaptační vrstva mezi ladicím programem softwaru a cílem ladění. Nástroje ladění pro Windows podporují ladění jádra pomocí EXDI počínaje systémem Windows verze 22000.

Poznámka:

EXDI je pokročilá, specializovaná forma ladění pro specifická prostředí. Použití standardního připojení KDNET je snazší nakonfigurovat a doporučuje se. Pokud chcete nastavit ladění sítě automaticky, přečtěte si téma Automatické nastavení ladění jádra sítě KDNET.

Konfigurace rozšířených možností pomocí konfiguračních souborů XML EXDI

Existují dva požadované soubory XML, které jsou využívány serverem COM EXDI GDB (ExdiGdbSrv.dll).

  1. exdiConfigData.xml – Tento soubor obsahuje hlavní konfigurační data vyžadovaná klientem GDB serveru k úspěšnému navázání relace GDB s cílem HW debuggeru GDB serveru, takže klient GDB serveru se nespustí, pokud umístění souboru nenastaví proměnná prostředí EXDI_GDBSRV_XML_CONFIG_FILE. Každá značka XML umožňuje konfigurovat konkrétní sadu funkcí serveru GDB. Níže najdete seznam atributů, které můžete upravit v jazyce XML, a ukázkový kód XML.

  2. Systemregister.xml – Tento soubor obsahuje mapování mezi registry systému a kódem použitým pro přístup k registrům. To je potřeba, protože server GDB v souboru XML neposkytuje přístupový kód a ladicí program přistupuje ke každému systémovému registru prostřednictvím přístupového kódu. Pokud soubor není nastaven prostřednictvím proměnné prostředí EXDI_SYSTEM_REGISTERS_MAP_XML_FILE, bude ExdiGdbSrv.dll nadále funkční, ale ladicí program nebude mít přístup k žádnému systémovému registru prostřednictvím příkazů rdmsr nebo wrmsr. Seznam těchto registrů by měl podporovat ladicí program hardwaru serveru GDB (konkrétní název registru systému by měl být v seznamu registrů odesílaných v systémovém souboru XML).

Uživatelské rozhraní EXDI a konfigurační soubory XML

Uživatelské rozhraní EXDI ve WinDbg používá parametry ze souboru XML a propojuje je s požadovanými parametry uživatelského rozhraní, jako je hodnota IP:Port. Pokud je potřeba upravit výchozí parametry souboru XML, spusťte aplikaci WinDbgNext z příkazového řádku s parametrem PathToSrvCfgFiles=<path to the modified exdiconfigdata.xml file>.

Cílová architektura

Hodnota pole cílové architektury uživatelského rozhraní EXDI musí odpovídat operačnímu systému Windows běžícímu na cíli pouze pro zástupné procedury serveru GDB, které neimplementují cílový popis souboru XML popisující cílovou architekturu operačního systému Windows. Tato target.xml informace o souboru se odesílá stub serveru GDB během GDB-RSP protokolu handshakování mezi klientem GDB a stub serveru GDB.

Windbg-ExdiGdbSrv může i nadále nastavit správnou cílovou architekturu operačního systému, i když uživatel nastaví nesprávnou vstupní hodnotu pole cílové architektury v uživatelském rozhraní EXDI. Cílová architektura operačního systému bude převzata a nakonfigurována ze souboru popisu target.xml, který je poskytován servery GDB a zahrnuje soubor target.xml při komunikaci serveru GDB. Pokud chcete zkontrolovat cílovou architekturu, použijte efektivní příkaz ladicího programu .effmach .

Značky a atributy GDBServer

Následující tabulka popisuje značky A atributy GDBServer definované v exdiConfigData.xml souboru.

Parameter Popis
ExdiTargets Určuje, jakou konkrétní konfiguraci cíle serveru GDB bude používat ExdiGgbSrv.dll k navázání připojení GDB k cíli serveru GDB, protože exdiConfigData.xml soubor obsahuje všechny servery GDB podporované aktuálně ExdiGdbSrv.dll (tento soubor musí být vyplněn před použitím ExdiGdbSrv.dll s konkrétním serverem GDB).
AktuálníCíl Určuje název cíle serveru GDB (např. tato hodnota atributu by se měla shodovat s názvem jedné ze <ExdiTarget Name= značek zahrnutých v souboru exdiConfigData.xml.
ExdiTarget toto je počáteční značka pro všechna konfigurační data, která jsou zahrnuta každou cílovou komponentou serveru GDB.
Název Určuje název serveru GDB (např. QEMU, BMC-OpenOCD, Trace32, VMware).
agentNamePacket Jedná se o název klienta GDB, protože ho rozpozná ladicí program HW serveru GDB. Tento nástroj může použít ladicí program hw serveru GDB ke konfiguraci pro konkrétní klienty GDB (např. Server Trace32 GDB vyžaduje, aby ExdiGdbSrv.dll odeslal název QMS.windbg, aby identifikoval klienta windbg-GDB a potom povolil přizpůsobené pakety paměti GDB podporované pouze pro klienta serveru MS GDB (exdiGdbSrv.dll).
ExdiGdbServerConfigData Určuje parametry konfigurace související s komponentou ExdiGdbSrv.dll.
Univerzální jednoznačný identifikátor (UUID) určuje UUI komponenty ExdiGdbSrv.dll.
zobrazeníKomunikačníchBalíčků Označte příznakem "ano", pak v okně protokolu příkazů zobrazíme komunikační znaky protokolu RSP. Pokud ne, zobrazíme jenom text páru požadavků a odpovědí.
enableThrowExceptionOnMemoryErrors Tento atribut bude zkontrolován klientem serveru GDB, pokud je k dispozici paket odpovědi na chybu GDB (E0x), aby se zjistilo, jestli má klient vyvolat výjimku a zastavit čtení paměti.
qSupportedPacket To umožňuje nastavení klienta GDB pro vyžádání, který soubor architektury registru ve formátu XML by měl být odeslán HW debuggerem serveru GDB podle XML souboru popisu cíle. V podstatě klient informuje server GDB, které architektury jsou klientem podporovány, konkrétně klient v současné době podporuje architekturu x64.
ExdiGdbServerTargetData Určuje parametry související s cílovým hardwarem, který je laděný relací GdbServer.
cílová architektura Řetězec obsahující cílovou hardwarovou architekturu. Možné hodnoty: X86, X64, ARM, ARM64. V současné době exdiGdbSrv.dll podporuje pouze X86 a ARM.
CílováRodina Řetězec obsahující cílovou hardwarovou řadu Možné hodnoty: ProcessorFamilyX86, ProcessorFamilyX64, ProcessorFamilyARM, ProcessorFamilyARM, ProcessorFamilyARM64.
numberOfCores Počet jader procesoru, které podporuje cílový systém. Tento parametr se ověří, když použijeme relaci multi-Gdbserver (T32-GdbServer relaci). Níže uvedený atribut MultiCoreGdbServerSessions by měl být nastaven na ano.
EnableSseContext Nastavte příznak 'ano', a pak paket kontextu RSP 'g' bude obsahovat hodnoty registrů pro pohyblivou řádovou čárku. Tento parametr dává smysl pouze pro cíle rodiny Intel.
heuristicScanSize (velikost heuristického skenování) tím se konfiguruje algoritmus rychlého heuristického modulu ladicího programu tak, aby snížil sondu skenované paměti o zadanou velikost, pokud není zadána hodnota atributu (nebo "0"), modul ladicího programu nebude používat rychlý heuristický algoritmus a vrátit se ke starší heuristice, která prohledává celou paměť, která hledá podpis PE DOS. Běžné hodnoty velikosti skenování jsou 0xfffe (nejvhodnější pro NT) nebo 0xffe (pro aplikace před NT).
targetDescriptionFile určuje, zda server GDB odešle cílový soubor hlaviček popisu před odesláním každého samostatného souboru XML. Toto pole je prázdné, klient GDB serveru nebude vyžadovat XML architekturální systémový registr (např. server Trace32 GDB, který nepodporuje odesílání architekturálních registrů v samostatném XML souboru).
GdbServerConnectionParameters Určuje parametry relace GdbServer. Tyto parametry slouží k řízení relace RSP GdbServer mezi komponentou ExdiGdbSrv.dll a GdbServer.
MultiCoreGdbServerSessions Příznak Pokud ano, pak budeme mít relaci GdbServer s více jádry (ta, kterou používá T32-GdbServer Back-End). Pokud ne, budeme komunikovat pouze s jednou instancí GdbServer.
MaximálníDélkaBalíčkuProGdbServer Toto je maximální podporovaná délka GdbServer pro jeden paket.
MaximálníPokusyOPřipojení Toto je maximální počet pokusů o připojení. Jednotka ExdiGdbSrv.dll používá, když se snaží navázat RSP připojení ke GdbServeru.
SendPacketTimeout Toto je časový limit odeslání APLIKACE RSP.
ČasovýLimitPřijetíPaketů Toto je časový limit příjmu RSP.
HostNameAndPort Toto je připojovací řetězec ve formátu <hostname/ip address:Port number>. Může existovat více než jeden připojovací řetězec GdbServer (například relace GdbServer s více jádry T32). Počet připojovacích řetězců by se měl shodovat s čísly jader.
ExdiGdbServerMemoryCommands Určuje různé způsoby zadávání příkazů paměti GDB, aby mohl získat hodnoty systémových registrů nebo přístup k paměti pro čtení a zápis na různých úrovních výjimek CPU (např. BMC-OpenOCD poskytuje přístup k registru CP15 prostřednictvím přizpůsobeného příkazu „aarch64 mrs nsec/sec <access code>“).
GdbSpecialMemoryCommand pokud ano, pak server GDB podporuje přizpůsobené příkazy paměti (např. systémový registr, měl by být nastaven pro server Trace32 GDB).
Fyzická paměť pokud ano, server GDB podporuje přizpůsobené příkazy pro čtení fyzické paměti (je nastaveno pro server Trace32 GDB).
SupervisorMemory pokud ano, server GDB podporuje přizpůsobené příkazy pro paměť správce čtení (je nastaveno pro server Trace32 GDB).
Speciální paměťový registr pokud je „ano“, server GDB podporuje přizpůsobené příkazy pro čtení systémových registrů (je nastaven pro server Trace32 GDB).
SystemRegistersGdbMonitor pokud ano, pak server GDB podporuje přizpůsobené příkazy prostřednictvím příkazu GDB monitor (je nastaven pro BMC Open-OCD).
DecodováníSystémovéhoRegistru pokud ano, klient GDB přijímá dekódování přístupového kódu před odesláním příkazu monitorování GDB.
ExdiGdbServerRegisters Určuje sadu registrů jádra architektury.
Architektura Architektura procesoru definované sady registrů
FeatureNameSupported Toto je název skupiny registrů systému, kterou poskytuje soubor popisu registru systému XML. Je potřeba identifikovat skupinu XML registru systému, která je součástí souboru XML, protože je odesílána serverem GDB.
SystemRegistersStart Jedná se o identifikaci prvního systémového registru (nízké číslo registru nebo objednávky), který je hlášen jako součást základní sady registru (např. V X64 QEMU neohlásí sadu registrů systému x64 jako samostatný soubor popisu cíle XML, takže systémové regy jsou součástí základních registrů).
SystemRegistersEnd Toto má za cíl identifikovat poslední systémový registr (s vysokým číslem/pořadím), který je hlášen jako součást hlavní sady registrů.
Název Název registru.
Objednávka Toto je číslo, které identifikuje index v poli registrů. Toto číslo bude používat klient a server GDB pro nastavovací/dotazovací (p<number>”/”q<number>) registrační pakety.
Velikost Toto je velikost registru v bajtech.

Ukázkový soubor 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>

Ukázkový skript POWERShellu EXDI

Tento ukázkový skript PowerShellu nainstaluje EXDI a pak spustí ladicí program. Skript Start-ExdiDebugger.ps1 nainstaluje v případě potřeby ExdiGdbSrv.dll, nakonfiguruje nastavení souborů XML, zkontroluje běžící procesy dllhost.exe a spustí ladicí program pro připojení ke stávajícímu cíli hardwarového ladění serveru gdb.

Při použití uživatelského rozhraní dostupného s WinDBg je ExdiGdbSrv.dll již nainstalován, a proto tento skript není zapotřebí. Další informace o použití integrovaného uživatelského rozhraní naleznete v tématu Konfigurace přenosu ladicího programu EXDI.

Toto je příklad volání spouštěcího skriptu.

PS>.\Start-ExdiDebugger.ps1 -ExdiTarget "QEMU" -GdbPort 1234 -Architecture x64

V případě potřeby můžete také zadat sestavené soubory.

PS>.\Start-ExdiDebugger.ps1 -ExdiTarget "QEMU" -GdbPort 1234 -Architecture x64 -ExdiDropPath "C:\path\to\built\exdi\files"

Start-ExdiDebugger.ps1 má následující možnosti nastavení.

Parameter Popis
ExdiTarget Typ cíle, ke kterému se chcete připojit. To odpovídá určitému oddílu v souboru XML nastavení.
Název hostitele IP adresa nebo název hostitele počítače, který je hostitelem relace serveru gdb (výchozí hodnota je LocalHost).
GdbPort Port, na který server gdb naslouchá.
Architektura Architektura cíle ladění hardwaru (tento parametr také naznačuje parametr ArchitectureFamily v souboru nastavení XML)
ExdiDropPath Umístění souborů ExdiGdbSrv.dll, exdiConfigData.xmla systemregisters.xml Tyto soubory se zkopírují jenom v případě, že ExdiGdbSrv.dll není nainstalována nebo je nainstalována nesprávně.
ExtraDebuggerArgs Další argumenty pro předání na příkazovém řádku ladicího programu
Ladění PreNTApp Změní hodnotu heuristicScanSize z 0xfffe (nejlepší pro NT) na 0xffe (pro aplikace pre-NT).
DontTryDllHostCleanup Kontrola stávajících spuštěných instancí ExdiGdbSrv.dll v dllhost.exe vyžaduje zvýšení úrovně oprávnění. Poskytnutí tohoto přepínače umožní spuštění skriptu bez zvýšení oprávnění (i když ladicí program nemusí správně fungovat).

Pokud chcete povolit zobrazování paketů, nastavte hodnotu displayCommPackets na ano.

    [pscustomobject]@{ Path = 'displayCommPackets'                                  ; value = "yes" } 
.\Start-ExdiDebugger.ps1 -ExdiTarget "QEMU" -GdbPort 1234 -Architecture x64 -ExdiDropPath "C:\path\to\built\exdi\files"

Další možnosti nastavení najdete v komentářích ke kódu.

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

Viz také

Konfigurace transportního mechanismu ladicího programu EXDI

Nastavení ladění QEMU Kernel-Mode pomocí EXDI

.exdicmd (příkaz EXDI)

Nastavení ladění síťového jádra KDNET automaticky