Archivos de configuración XML de EXDI
En este tema se describe cómo configurar opciones avanzadas mediante los archivos de configuración XML exDI. Para obtener información general sobre el uso de la interfaz de usuario de WinDbg para configurar EXDI, consulte Configuración del transporte del depurador exDI. La configuración más común está disponible en la interfaz de usuario, que es un enfoque más sencillo y luego edita manualmente los archivos de configuración XML exDI, que se describen aquí.
La interfaz de depuración extendida (EXDI) es una capa de adaptación entre un depurador de software y un destino de depuración. Las herramientas de depuración para Windows admiten la depuración de kernel mediante EXDI a partir de la versión 22000 de Windows.
Nota:
EXDI es una forma avanzada y especializada de depuración para entornos específicos. El uso de una conexión KDNET estándar es más fácil de configurar y se recomienda. Para configurar la depuración de red automáticamente, consulte Configuración automática de la depuración del kernel de red KDNET.
Configuración de opciones avanzadas mediante los archivos XML de configuración de EXDI
Hay dos archivos XML necesarios que consume el servidor COM GDB de EXDI (ExdiGdbSrv.dll).
exdiConfigData.xml: este archivo contiene los datos de configuración principales que requiere el cliente servidor GDB para establecer una sesión de GDB correctamente con el destino del servidor GDB del depurador de hardware, por lo que el cliente servidor GDB no se ejecutará si la variable de entorno EXDI_GDBSRV_XML_CONFIG_FILE no ha establecido la ubicación del archivo. Cada etiqueta xml permite configurar un conjunto específico de la funcionalidad del servidor GDB. Consulte a continuación para obtener una lista de los atributos que puede modificar en el XML y XML de ejemplo.
Systemregister.xml: este archivo contiene una asignación entre los registros del sistema y el código usado para acceder a los registros. Esto es necesario porque el servidor GDB no proporciona el código de acceso en el archivo xml y el depurador accede a cada registro del sistema a través del código de acceso. Si el archivo no se establece a través de la variable de entorno
EXDI_SYSTEM_REGISTERS_MAP_XML_FILE
, ExdiGdbSrv.dll seguirá funcionando, pero el depurador no podrá acceder a ningún registro del sistema a través de comandos rdmsr o wrmsr. La lista de estos registros debe ser compatible con el depurador de hardware del servidor GDB (el nombre de registro del sistema específico debe estar presente en la lista de registros que se envían en el archivo xml del sistema).
INTERFAZ de usuario de EXDI y los archivos de configuración XML
La interfaz de usuario EXDI de WinDbg usa los parámetros de archivo XML y combina en los parámetros necesarios de la interfaz de usuario, como el valor IP:Port. Si es necesario modificar los parámetros de archivo XML predeterminados, inicie la aplicación WinDbgNext desde la línea de comandos con el parámetro PathToSrvCfgFiles=<path to the modified exdiconfigdata.xml file>
.
Arquitectura de destino
El valor del campo de la arquitectura de destino de la interfaz de usuario exDI debe coincidir con el sistema operativo Windows que se ejecuta en el destino solo para códigos auxiliares del servidor GDB que no implementan el archivo XML de descripción de destino que describe la arquitectura de destino del sistema operativo Windows. Este target.xml información del archivo se envía mediante el código auxiliar del servidor GDB durante el protocolo de enlace del protocolo GDB-RSP entre el cliente GDB y el código auxiliar del servidor GDB.
Windbg-ExdiGdbSrv todavía puede establecer la arquitectura correcta del sistema operativo de destino incluso si el usuario establece un valor de entrada de campo de arquitectura de destino incorrecto en la interfaz de usuario de EXDI. La arquitectura del sistema operativo de destino se tomará y configurará desde el archivo de descripción de target.xml proporcionado por los servidores GDB que incluyen el archivo target.xml en el protocolo de enlace del servidor GDB. Para comprobar la arquitectura de destino, use el comando eficaz del depurador .effmach de la máquina.
Etiquetas y atributos de GDBServer
En la tabla siguiente se describen las etiquetas y los atributos de GDBServer definidos en el archivo exdiConfigData.xml
.
Parámetro | Descripción |
---|---|
ExdiTargets | Especifica qué configuración de destino de servidor GDB específica usará ExdiGgbSrv.dll para establecer la conexión de GDB con el destino del servidor GDB, ya que el archivo exdiConfigData.xml incluye todos los servidores GDB admitidos actualmente por ExdiGdbSrv.dll (este archivo debe rellenarse antes de usar ExdiGdbSrv.dll con un servidor GDB determinado). |
CurrentTarget | Especifica el nombre del destino del servidor GDB (por ejemplo, este valor de atributo debe coincidir con el valor de nombre de una de las etiquetas <ExdiTarget Name= incluidas en el archivo exdiConfigData.xml. |
ExdiTarget | esta es la etiqueta de inicio de todos los datos de configuración que incluye cada componente de destino del servidor GDB. |
Nombre | Especifica el nombre del servidor GDB (por ejemplo, QEMU, BMC-OpenOCD, Trace32, VMWare). |
agentNamePacket | Este es el nombre del cliente GDB tal como lo reconoce el depurador de HW del servidor de GDB. El depurador HW del servidor GDB puede usarlo para configurarse para clientes GDB específicos (por ejemplo, el servidor trace32 GDB requiere el ExdiGdbSrv.dll enviar el nombre "QMS.windbg" para identificar el cliente windbg-GDB y, a continuación, habilitar paquetes de memoria GDB personalizados solo compatibles con el cliente del servidor MS GDB (exdiGdbSrv.dll). |
ExdiGdbServerConfigData | Especifica los parámetros de configuración relacionados con el componente ExdiGdbSrv.dll. |
uuid | especifica el UUI del componente de ExdiGdbSrv.dll. |
displayCommPackets | Si se marca como "sí", se mostrarán los caracteres de comunicación del protocolo RSP en la ventana de registro de comandos. Si se marca como "no", solo se muestra el texto del par solicitud-respuesta. |
enableThrowExceptionOnMemoryErrors | El cliente del servidor GDB comprobará este atributo cuando haya un paquete de respuesta de error de GDB (E0x) para determinar si el cliente debe producir una excepción y dejar de leer la memoria. |
qSupportedPacket | Esto permite configurar el cliente GDB para solicitar qué archivo de arquitectura de registro xml debe enviar el depurador HW del servidor GDB después del archivo de descripción de destino xml (básicamente, el cliente informará al servidor GDB qué arquitecturas son compatibles con el cliente, actualmente, el cliente admite la arquitectura x64). |
ExdiGdbServerTargetData | Especifica los parámetros relacionados con el destino de hardware que depura la sesión de GdbServer. |
targetArchitecture | Cadena que contiene la arquitectura de hardware de destino. Valores posibles: X86, X64, ARM, ARM64. Actualmente, exdiGdbSrv.dll solo admite X86 y ARM. |
targetFamily | Cadena que contiene la familia de hardware de destino. Valores posibles: ProcessorFamilyX86, ProcessorFamilyX64, ProcessorFamilyARM, ProcessorFamilyARM64. |
numberOfCores | Número de núcleos de procesador que admite el destino. Este parámetro se validará cuando se use una sesión multi-Gdbserver (sesión T32-GdbServer). El atributo "MultiCoreGdbServerSessions" siguiente debe establecerse en "sí". |
EnableSseContext | Si se marca como "sí", el paquete RSP de contexto "g" incluirá valores de registro de punto flotante. Este parámetro solo tiene sentido para los destinos de la familia Intel. |
heuristicScanSize | esto configura el algoritmo heurístico rápido del motor del depurador para reducir el sondeo de memoria escaneado por el tamaño especificado, si no se especifica el valor del atributo (o "0"), el motor del depurador no usará la heurística rápida y revertirá a la heurística heredada que examina toda la memoria que busca la firma PE DOS. Los valores de tamaño de examen comunes son 0xfffe (lo mejor para NT) o 0xffe (para aplicaciones anteriores a NT). |
targetDescriptionFile | especifica si el servidor GDB envía un archivo de encabezado de descripción de destino antes de enviar cada archivo xml independiente. Este campo está en blanco y el cliente servidor GDB no solicitará el registro del sistema de arquitectura xml (por ejemplo, el servidor de GDB Trace32 que no admite el envío de registros de arquitectura en un archivo XML independiente). |
GdbServerConnectionParameters | Especifica los parámetros de sesión de GdbServer. Estos parámetros se usan para controlar la sesión de GdbServer de RSP entre el componente de ExdiGdbSrv.dll y GdbServer. |
MultiCoreGdbServerSessions | Si se marca como "sí", tendremos una sesión GdbServer de varios núcleos (la que usa T32-GdbServer Back-End). Si se marca como "no", solo se comunicará con una instancia del GdbServer. |
MaximumGdbServerPacketLength | Esta es la longitud máxima admitida de GdbServer para un paquete. |
MaximumConnectAttempts | Este es el número máximo de intentos de conexión. ExdiGdbSrv.dll lo usa cuando intenta establecer la conexión de RSP con GdbServer. |
SendPacketTimeout | Este es el tiempo de espera de envío de RSP. |
ReceivePacketTimeout | Este es el tiempo de espera de recepción de RSP. |
HostNameAndPort | Esta es la cadena de conexión con el formato <hostname/ip address:Port number> . Puede haber más de un cadena de conexión GdbServer (como la sesión de GdbServer de varios núcleos T32). El número de cadenas de conexión debe coincidir con los números de núcleos. |
ExdiGdbServerMemoryCommands | Especifica varias formas de emitir los comandos de memoria GDB, para obtener valores del sistema o memoria de acceso de lectura y escritura en diferentes niveles de CPU de excepción (por ejemplo, BMC-OpenOCD proporciona acceso al registro CP15 a través del comando personalizado "aarch64 mrs nsec/sec <access code> "). |
GdbSpecialMemoryCommand | si es "sí", el servidor GDB admite comandos de memoria personalizados (por ejemplo, el registro del sistema, debe establecerse para el servidor de GDB trace32). |
PhysicalMemory | si es "sí", el servidor GDB admite comandos personalizados para leer la memoria física (se establece para el servidor de GDB trace32). |
SupervisorMemory | si es "sí", el servidor GDB admite comandos personalizados para leer la memoria de supervisión (se establece para el servidor de GDB trace32). |
SpecialMemoryRegister | si es "sí", el servidor GDB admite comandos personalizados para leer los registros del sistema física (se establece para el servidor de GDB trace32) |
SystemRegistersGdbMonitor | si es "sí", el servidor GDB admite comandos personalizados a través del comando de supervisión de GDB (se establece para BMC Open-OCD). |
SystemRegisterDecoding | si es "sí", el cliente de GDB acepta descodificar el código de acceso antes de enviar el comando del monitor de GDB. |
ExdiGdbServerRegisters | Especifica el conjunto de núcleos de registro de arquitectura específico. |
Arquitectura | Arquitectura de CPU del conjunto de registros definidos. |
FeatureNameSupported | Este es el nombre del grupo de registros del sistema tal como lo proporciona el archivo de descripción del registro del sistema xml. Es necesario identificar el grupo xml de registro del sistema que forma parte del archivo xml tal como lo envía el servidor GDB. |
SystemRegistersStart | Esto es para identificar el primer registro del sistema (número de registro/orden bajo) que se notifica como parte del conjunto de registros principales (por ejemplo, en X64, QEMU no notifica el registro del sistema x64 establecido como un archivo de descripción de destino xml separado, por lo que los registros del sistema forman parte de los registros principales). |
SystemRegistersEnd | Esto es para identificar el último registro del sistema (número o orden de registro alto) que se notifica como parte del conjunto de registros principales. |
Nombre | Nombre del registro. |
compra | Se trata de un número que identifica el índice en la matriz de registros. El cliente de GDB usará este número y los paquetes de registro del conjunto o consulta del servidor (p<number>”/”q<number> ). |
Size | Este es el tamaño del registro en bytes. |
Archivo de exdiConfigData.xml de ejemplo
<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>
Ejemplo de script de PowerShell de EXDI
Este script de PowerShell de ejemplo instala EXDI y, a continuación, inicia el depurador. El script Start-ExdiDebugger.ps1 instalará ExdiGdbSrv.dll si es necesario, configurará los archivos de configuración xml, comprobará la ejecución de procesos de dllhost.exe e iniciará el depurador para conectarse a un destino de depuración de hardware de servidor gdb que ya se está ejecutando.
Cuando se usa la interfaz de usuario validable con WinDBg, el ExdiGdbSrv.dll ya está instalado y este script no es relevante. Para obtener más información sobre el uso de la interfaz de usuario integrada, consulte Configuración del transporte del depurador EXDI.
Este es un ejemplo de llamada al script de inicio.
PS>.\Start-ExdiDebugger.ps1 -ExdiTarget "QEMU" -GdbPort 1234 -Architecture x64
También puede especificar los archivos creados si es necesario.
PS>.\Start-ExdiDebugger.ps1 -ExdiTarget "QEMU" -GdbPort 1234 -Architecture x64 -ExdiDropPath "C:\path\to\built\exdi\files"
Start-ExdiDebugger.ps1 tiene las siguientes opciones de configuración.
Parámetro | Descripción |
---|---|
ExdiTarget | El tipo de destino al que se va a conectar. Esto corresponde a una sección específica del archivo xml de configuración. |
HostName | La dirección IP o el nombre de host del equipo que hospeda la sesión del servidor gdb (el valor predeterminado es "LocalHost") |
GdbPort | El puerto en el que el servidor gdb está escuchando. |
Arquitectura | Arquitectura del destino de depuración de hardware (este parámetro también implica el parámetro ArchitectureFamily en el archivo de configuración xml) |
ExdiDropPath | Ubicación de los archivos ExdiGdbSrv.dll, exdiConfigData.xml y systemregisters.xml. Solo se copiarán si ExdiGdbSrv.dll no está instalado o se instala incorrectamente. |
ExtraDebuggerArgs | Argumentos adicionales para pasar en la línea de comandos del depurador |
PreNTAppDebugging | Cambia el valor de heuristicScanSize de 0xfffe (mejor para NT) a 0xffe (para aplicaciones pre-NT) |
DontTryDllHostCleanup | La comprobación de las instancias en ejecución existentes de ExdiGdbSrv.dll en dllhost.exe requiere elevación. Si se proporciona este modificador, el script se ejecutará sin elevación (aunque es posible que el depurador no funcione correctamente). |
Para permitir que se muestren paquetes, establezca el valor de displayCommPackets en sí.
[pscustomobject]@{ Path = 'displayCommPackets' ; value = "yes" }
.\Start-ExdiDebugger.ps1 -ExdiTarget "QEMU" -GdbPort 1234 -Architecture x64 -ExdiDropPath "C:\path\to\built\exdi\files"
Consulte los comentarios de código para obtener más opciones de configuración.
<#
.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
Consulte también
Configuración del transporte del depurador EXDI
Configuración de la depuración en modo kernel de QEMU mediante EXDI
Configuración automática de la depuración del kernel de red KDNET