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).
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.
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_FILE
di 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
Configurazione automatica del debug del kernel di rete KDNET