Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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).
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.
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