Condividi tramite


File di configurazione XML DI EXDI

In questo argomento viene descritto come configurare le opzioni avanzate usando i file di configurazione XML DI EXDI. Per informazioni generali sull'uso dell'interfaccia utente winDbg per configurare EXDI, vedere Configuring the EXDI Debugger Transport. Le impostazioni più comuni sono disponibili nell'interfaccia utente, che è un approccio più semplice e quindi modificare manualmente i file di configurazione XML DI EXDI, descritti qui.

L'interfaccia di debug esteso (EXDI) è un livello di adattamento tra un debugger software e una destinazione di debug. Gli strumenti di debug per Windows supportano il debug del kernel usando EXDI a partire da Windows versione 22000.

Nota

EXDI è una forma avanzata e specializzata di debug per ambienti specifici. L'uso di una connessione KDNET standard è più semplice da configurare ed è consigliabile. Per configurare automaticamente il debug di rete, vedere Configurazione automatica del debug del kernel di rete KDNET.

Configurare le opzioni avanzate usando i file XML di configurazione EXDI

Esistono due file XML necessari utilizzati dal server COM EXDI GDB (ExdiGdbSrv.dll).

  1. exdiConfigData.xml: questo file contiene i dati di configurazione principali richiesti dal client del server GDB per stabilire una sessione GDB con la destinazione del server GDB del debugger HW, quindi il client del server GDB non verrà eseguito se il percorso del file non è impostato dalla variabile di ambiente EXDI_GDBSRV_XML_CONFIG_FILE. Ogni tag XML consente di configurare un set specifico di funzionalità del server GDB. Vedere di seguito per un elenco degli attributi che è possibile modificare nel codice XML e nel codice XML di esempio.

  2. Systemregister.xml: questo file contiene un mapping tra i registri di sistema e il codice usato per accedere ai registri. Ciò è necessario perché il codice di accesso non viene fornito dal server GDB nel file xml e il debugger accede a ogni registro di sistema tramite il codice di accesso. Se il file non è impostato tramite la variabile EXDI_SYSTEM_REGISTERS_MAP_XML_FILEdi ambiente , il ExdiGdbSrv.dll continuerà a funzionare, ma il debugger non sarà in grado di accedere a alcun registro di sistema tramite comandi rdmsr o wrmsr. L'elenco di questi registri deve essere supportato dal debugger hardware del server GDB (il nome del registro di sistema specifico deve essere presente nell'elenco dei registri inviati nel file XML di sistema).

Interfaccia utente DI EXDI e file di configurazione XML

L'interfaccia utente di EXDI in WinDbg usa i parametri del file XML e unisce i parametri obbligatori dell'interfaccia utente, ad esempio il valore IP:Port. Se è necessario modificare i parametri di file XML predefiniti, avviare l'applicazione WinDbgNext dalla riga di comando con il parametro PathToSrvCfgFiles=<path to the modified exdiconfigdata.xml file>.

Architettura di destinazione

Il valore del campo architettura di destinazione dell'interfaccia utente EXDI deve corrispondere al sistema operativo Windows in esecuzione nella destinazione solo per gli stub del server GDB che non implementano il file XML della descrizione di destinazione che descrive l'architettura di destinazione del sistema operativo Windows. Questa target.xml informazioni sui file viene inviata dallo stub del server GDB durante l'handshaking del protocollo GDB-RSP tra il client GDB e lo stub del server GDB.

Windbg-ExdiGdbSrv può comunque impostare l'architettura corretta del sistema operativo di destinazione anche se l'utente imposta un valore di input del campo dell'architettura di destinazione non corretto nell'interfaccia utente di EXDI. L'architettura del sistema operativo di destinazione verrà acquisita e configurata dal file di descrizione target.xml fornito dai server GDB che includono il file target.xml nell'handshaking del server GDB. Per controllare l'architettura di destinazione, usare il comando del debugger con estensione effmach del computer effettivo.

Tag e attributi GDBServer

Nella tabella seguente vengono descritti i tag e gli attributi GDBServer definiti nel exdiConfigData.xml file.

Parametro Descrizione
ExdiTargets Specifica quale specifica configurazione di destinazione del server GDB verrà usata dal ExdiGgbSrv.dll per stabilire la connessione GDB con la destinazione del server GDB, poiché il file exdiConfigData.xml include tutti i server GDB attualmente supportati dal ExdiGdbSrv.dll (questo file deve essere compilato prima di usare il ExdiGdbSrv.dll con un server GDB specifico).
CurrentTarget Specifica il nome della destinazione del server GDB, ad esempio questo valore dell'attributo deve corrispondere al valore del nome di uno dei <ExdiTarget Name= tag inclusi nel file exdiConfigData.xml.
ExdiTarget si tratta del tag iniziale per tutti i dati di configurazione inclusi in ogni componente di destinazione del server GDB.
Nome Specifica il nome del server GDB, ad esempio QEMU, BMC-OpenOCD, Trace32, VMWare.
agentNamePacket Si tratta del nome del client GDB così come viene riconosciuto dal debugger HW del server GDB. Può essere usato dal debugger HW del server GDB per configurare se stesso per client GDB specifici( ad esempio, il server GDB Trace32 richiede l'ExdiGdbSrv.dll di inviare il nome "QMS.windbg" per identificare il client windbg-GDB e quindi abilitare pacchetti di memoria GDB personalizzati supportati solo per il client server MS GDB (exdiGdbSrv.dll).
ExdiGdbServerConfigData Specifica i parametri di configurazione correlati al componente ExdiGdbSrv.dll.
uuid specifica l'interfaccia utente del componente ExdiGdbSrv.dll.
displayCommPackets Contrassegna se 'sì', nella finestra del log dei comandi verranno visualizzati i caratteri di comunicazione del protocollo RSP. Se 'no', viene visualizzato solo il testo della coppia request-response.
enableThrowExceptionOnMemoryErrors Questo attributo verrà controllato dal client del server GDB quando è presente un pacchetto di risposta di errore GDB (E0x) per determinare se il client deve generare un'eccezione e interrompere la lettura della memoria.
qSupportedPacket In questo modo è possibile configurare il client GDB per richiedere il file di architettura del registro XML da inviare dal debugger HW del server GDB seguendo il file di descrizione della destinazione xml (fondamentalmente, il client informerà il server GDB quali architetture sono supportate dal client, attualmente, il client supporta l'architettura x64).
ExdiGdbServerTargetData Specifica i parametri correlati alla destinazione hardware di cui viene eseguito il debug dalla sessione GdbServer.
targetArchitecture Stringa contenente l'architettura hardware di destinazione. Valori possibili: X86, X64, ARM, ARM64. Attualmente, il exdiGdbSrv.dll supporta solo X86 e ARM.
targetFamily Stringa contenente la famiglia hardware di destinazione. Valori possibili: ProcessorFamilyX86, ProcessorFamilyX64, ProcessorFamilyARM, ProcessorFamilyARM64.
numberOfCores Numero di core del processore supportati dalla destinazione. Questo parametro verrà convalidato quando si usa una sessione multi-Gdbserver (sessione T32-GdbServer). L'attributo "MultiCoreGdbServerSessions" seguente deve essere impostato su "sì".
EnableSseContext Contrassegna se 'sì', il pacchetto RSP di contesto 'g' includerà i valori dei registri a virgola mobile. Questo parametro ha senso solo per le destinazioni della famiglia Intel.
euristicScanSize In questo modo viene configurato l'algoritmo euristico rapido del motore del debugger per ridurre il probe di memoria analizzato in base alle dimensioni specificate, se il valore dell'attributo non è specificato (o "0"), il motore del debugger non userà l'euristica veloce ed eseguirà il fallback all'euristica legacy che analizza l'intera memoria cercando la firma PE DOS. I valori comuni delle dimensioni dell'analisi sono 0xfffe (meglio per NT) o 0xffe (per le app pre-NT).
targetDescriptionFile specifica se il server GDB invia un file di intestazione della descrizione di destinazione prima di inviare ogni file XML separato. Questo campo è vuoto, quindi il client del server GDB non richiederà il registro del sistema di architettura xml (ad esempio, il server GDB Trace32 che non supporta l'invio di registri dell'architettura in un file XML separato).
GdbServerConnectionParameters Specifica i parametri di sessione GdbServer. Questi parametri vengono usati per controllare la sessione RSP GdbServer tra il componente ExdiGdbSrv.dll e GdbServer.
MultiCoreGdbServerSessions Contrassegna Se "sì", si avrà una sessione GdbServer multi-core (quella usata dal back-end T32-GdbServer). Se 'no', comunicheremo solo con un'istanza di GdbServer.
MaximumGdbServerPacketLength Si tratta della lunghezza massima supportata da GdbServer per un pacchetto.
MaximumConnectAttempts Questo è il numero massimo di tentativi di connessione. Viene usato dal ExdiGdbSrv.dll quando tenta di stabilire la connessione RSP al GdbServer.
SendPacketTimeout Questo è il timeout di invio RSP.
ReceivePacketTimeout Si tratta del timeout di ricezione RSP.
HostNameAndPort Si tratta del stringa di connessione nel formato <hostname/ip address:Port number>. Possono essere presenti più di un GdbServer stringa di connessione (ad esempio, una sessione GdbServer multi-core T32). Il numero di stringa di connessione deve corrispondere al numero di core.
ExdiGdbServerMemoryCommands Specifica vari modi per eseguire i comandi di memoria GDB, per ottenere i valori di registrazione del sistema o la memoria di accesso in lettura/scrittura a livelli di CPU di eccezione diversi ( ad esempio BMC-OpenOCD fornisce l'accesso al registro CP15 tramite "aarch64 mrs nsec/sec <access code>" comando personalizzato).
GdbSpecialMemoryCommand se "sì", il server GDB supporta comandi di memoria personalizzati (ad esempio, registro di sistema, deve essere impostato per il server Trace32 GDB).
PhysicalMemory se "sì", il server GDB supporta i comandi personalizzati per la lettura della memoria fisica (è impostato per il server GDB Trace32).
SupervisorMemory se "sì", il server GDB supporta comandi personalizzati per la lettura della memoria supervisore (è impostato per il server GDB Trace32).
SpecialMemoryRegister se "sì", il server GDB supporta comandi personalizzati per la lettura dei registri di sistema (è impostato per il server Trace32 GDB)
SystemRegistersGdbMonitor se "sì", il server GDB supporta i comandi personalizzati tramite il comando di monitoraggio GDB (è impostato per BMC Open-OCD).
SystemRegisterDecoding se "sì", il client GDB accetta la decodifica del codice di accesso prima di inviare il comando di monitoraggio GDB.
ExdiGdbServerRegisters Specifica il set di core di registrazione dell'architettura specifico.
Architettura Architettura della CPU del set di registri definiti.
FeatureNameSupported Si tratta del nome del gruppo di registri di sistema fornito dal file di descrizione del registro di sistema xml. È necessario identificare il gruppo xml del registro di sistema che fa parte del file xml man mano che viene inviato dal server GDB.
SystemRegistersStart Ciò consiste nell'identificare il primo registro di sistema (numero/ordine di registrazione basso) segnalato come parte del set di registri principali (ad esempio in X64, QEMU non segnala il set di registri di sistema x64 come file di descrizione di destinazione XML separato, quindi i reg di sistema fanno parte dei registri principali).
SystemRegistersEnd Si tratta di identificare l'ultimo registro di sistema (numero/ordine di registrazione elevato) segnalato come parte del set di registri principali.
Nome Nome del registro.
Ordinamento Numero che identifica l'indice nella matrice di registri. Questo numero verrà usato dal client GDB e dal set/query del server (p<number>”/”q<number>) per registrare i pacchetti.
Dimensione Si tratta delle dimensioni del registro in byte.

File di exdiConfigData.xml di esempio

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

Script di PowerShell EXDI di esempio

Questo script di PowerShell di esempio installa EXDI e quindi avvia il debugger. Lo script Start-ExdiDebugger.ps1 installerà ExdiGdbSrv.dll, se necessario, configurerà i file di impostazioni xml, verificherà l'esecuzione di processi dllhost.exe e avvierà il debugger per connettersi a una destinazione di debug hardware del server gdb già in esecuzione.

Quando si usa l'interfaccia utente avalible con WinDBg, il ExdiGdbSrv.dll è già installato e questo script non è pertinente. Per altre informazioni sull'uso dell'interfaccia utente predefinita, vedere Configuring the EXDI Debugger Transport.For more information on using the built in user interface, see Configuring the EXDI Debugger Transport.

Questo è un esempio di chiamata allo script di avvio.

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

Se necessario, è anche possibile specificare i file compilati.

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

Start-ExdiDebugger.ps1 include le opzioni di impostazioni seguenti.

Parametro Descrizione
ExdiTarget Tipo di destinazione a cui connettersi. Corrisponde a una sezione specifica nel file xml delle impostazioni
HostName L'indirizzo IP o il nome host del computer che ospita la sessione del server gdb (l'impostazione predefinita è "LocalHost")
GdbPort Porta su cui è in ascolto il server gdb.
Architettura Architettura della destinazione di debug hardware (questo parametro implica anche il parametro ArchitectureFamily nel file di impostazioni xml)
ExdiDropPath Percorso dei file ExdiGdbSrv.dll, exdiConfigData.xml e systemregisters.xml. Questi verranno copiati solo se ExdiGdbSrv.dll non è installato o è installato in modo non corretto.
ExtraDebuggerArgs Argomenti aggiuntivi da passare alla riga di comando del debugger
PreNTAppDebugging Modifica il valore di euristicScanSize da 0xfffe (migliore per NT) a 0xffe (per le app pre-NT)
DontTryDllHostCleanup Il controllo delle istanze in esecuzione esistenti di ExdiGdbSrv.dll in dllhost.exe richiede l'elevazione dei privilegi. Se si specifica questa opzione, lo script potrà essere eseguito senza elevazione dei privilegi (anche se il debugger potrebbe non funzionare correttamente).

Per abilitare la visualizzazione dei pacchetti, impostare il valore di displayCommPackets su sì.

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

Per altre opzioni di impostazioni, vedere i commenti sul codice.

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

Vedi anche

Configurazione del trasporto del debugger EXDI

Configurazione del debug in modalità kernel QEMU con EXDI

.exdicmd (comando EXDI)

Configurazione automatica del debug del kernel di rete KDNET