Arquivos de configuração XML da EXDI
Este tópico descreve como configurar opções avançadas usando os arquivos de configuração XML EXDI. Para obter informações gerais sobre como usar a interface do usuário do WinDbg para configurar o EXDI, consulte Configurando o transporte do depurador EXDI. As configurações mais comuns estão disponíveis na interface do usuário, que é uma abordagem mais fácil do que editar manualmente os arquivos de configuração XML EXDI, descritos aqui.
A Extended Debugging Interface (EXDI) é uma camada de adaptação entre um depurador de software e um destino de depuração. As Ferramentas de Depuração do Windows oferecem suporte à depuração do kernel usando EXDI a partir do Windows versão 22000.
Observação
EXDI é uma forma avançada e especializada de depuração para ambientes específicos. Uma conexão KDNET padrão é mais fácil de configurar e é recomendada. Para configurar a depuração de rede automaticamente, confira Configurar a depuração automática do kernel de rede KDNET.
Configurar opções avançadas usando os arquivos XML de configuração EXDI
Há dois arquivos xml necessários que são consumidos pelo servidor EXDI GDB COM (ExdiGdbSrv.dll).
exdiConfigData.xml - Esse arquivo contém os dados de configuração principais que são requeridos pelo cliente do servidor GDB para estabelecer uma sessão GDB com êxito com o destino do servidor GDB do depurador HW, portanto, o cliente do servidor GDB não será executado se o local do arquivo não for definido pela variável de ambiente EXDI_GDBSRV_XML_CONFIG_FILE. Cada marcação xml permite configurar um conjunto específico da funcionalidade do servidor GDB. Confira abaixo para obter uma lista dos atributos que você pode modificar no XML e no XML de exemplo.
Systemregister.xml - Este arquivo contém um mapeamento entre os registros do sistema e o código usado para acessar os registros. Isso é necessário porque o código de acesso não é fornecido pelo servidor GDB no arquivo xml, e o depurador acessa cada registro do sistema por meio do código de acesso. Se o arquivo não estiver definido por meio da variável de ambiente
EXDI_SYSTEM_REGISTERS_MAP_XML_FILE
, o ExdiGdbSrv.dll continuará funcionando, mas o depurador não poderá acessar nenhum registro do sistema por meio dos comandos rdmsr ou wrmsr. A lista desses registros deve ser compatível com o depurador de hardware do servidor GDB (o nome específico do registro do sistema deve estar presente na lista de registros enviada no arquivo xml do sistema).
EXDI UI e os arquivos de configuração XML
A interface do usuário EXDI no WinDbg usa os parâmetros do arquivo XML e mescla os parâmetros necessários da interface do usuário, como o valor IP:Port. Se houver necessidade de modificar os parâmetros do arquivo XML padrão, inicie o aplicativo WinDbgNext na linha de comando com o parâmetro PathToSrvCfgFiles=<path to the modified exdiconfigdata.xml file>
.
Arquitetura de destino
O valor do campo de arquitetura de destino da interface do usuário EXDI precisa corresponder ao sistema operacional Windows em execução no destino somente para stubs de servidor GDB que não implementam o arquivo XML de descrição de destino que descreve a arquitetura de destino do sistema operacional Windows. Essas informações de arquivo target.xml são enviadas pelo stub do servidor GDB durante o handshake do protocolo GDB-RSP entre o cliente GDB e o stub do servidor GDB.
Windbg-ExdiGdbSrv ainda pode definir a arquitetura correta do sistema operacional de destino, mesmo que o usuário defina um valor de entrada de campo de arquitetura de destino incorreto na interface do usuário EXDI. A arquitetura do sistema operacional de destino será obtida e configurada a partir do arquivo de descrição target.xml fornecido pelos servidores GDB que incluem o arquivo target.xml no handshake do servidor GDB. Para verificar a arquitetura de destino, use o comando de depurador machine .effmach eficaz.
Tags e atributos do GDBServer
A tabela a seguir descreve as marcações e os atributos GDBServer definidos no arquivo exdiConfigData.xml
.
Parâmetro | Descrição |
---|---|
ExdiTargets | Especifica qual configuração de destino do servidor GDB será usada pelo ExdiGgbSrv.dll para estabelecer a conexão GDB com o destino do servidor GDB, já que o arquivo exdiConfigData.xml inclui todos os servidores GDB compatíveis atualmente com ExdiGdbSrv.dll (esse arquivo PRECISA ser preenchido antes de usar o ExdiGdbSrv.dll com um determinado servidor GDB). |
CurrentTarget | Especifica o nome do destino do servidor GDB (por exemplo, esse valor de atributo deve corresponder ao valor de nome de uma das marcações <ExdiTarget Name= incluídas pelo arquivo exdiConfigData.xml. |
ExdiTarget | essa é a marcação inicial de todos os dados de configuração incluídos por componente de destino do servidor GDB. |
Nome | Especifica o nome do servidor GDB (por exemplo, QEMU, BMC-OpenOCD, Trace32, VMWare). |
agentNamePacket | Esse é o nome do cliente GDB, pois ele é reconhecido pelo depurador HW do servidor GDB. Isso pode ser usado pelo depurador HW do servidor GDB para se autoconfigurar para clientes GDB específicos (por exemplo, o servidor GDB Trace32 requer que o ExdiGdbSrv.dll envie o nome "QMS.windbg" para identificar o cliente windbg-GDB e, em seguida, habilite pacotes de memória GDB personalizados com suporte apenas para o cliente do servidor MS GDB (exdiGdbSrv.dll). |
ExdiGdbServerConfigData | Especifica os parâmetros de configuração relacionados ao componente ExdiGdbSrv.dll. |
uuid | especifica a UUI do componente ExdiGdbSrv.dll. |
displayCommPackets | Se sinalizado como 'yes', exibiremos os caracteres de comunicação do protocolo RSP na janela de log de comando. Se 'no', então exibiremos apenas o texto do par solicitação-resposta. |
enableThrowExceptionOnMemoryErrors | Esse atributo será verificado pelo cliente do servidor GDB quando houver um pacote de resposta de erro GDB (E0x) para determinar se o cliente deve lançar uma exceção e parar de ler a memória. |
qSupportedPacket | Isso permite configurar o cliente GDB para solicitar qual arquivo de arquitetura de registro xml deve ser enviado pelo depurador HW do servidor GDB após o arquivo de descrição de destino xml (basicamente, o cliente informará ao servidor GDB quais arquiteturas são compatíveis com o cliente; atualmente, o cliente é compatível com a arquitetura x64). |
ExdiGdbServerTargetData | Especifica os parâmetros relacionados ao destino de hardware que é depurado pela sessão GdbServer. |
targetArchitecture | Cadeia de caracteres que contém a arquitetura de hardware de destino. Possíveis valores: X86, X64, ARM, ARM64. Atualmente, o exdiGdbSrv.dll é compatível apenas com X86 e ARM. |
targetFamily | Cadeia de caracteres que contém a família de hardware de destino. Possíveis valores: ProcessorFamilyX86, ProcessorFamilyX64, ProcessorFamilyARM, ProcessorFamilyARM64. |
numberOfCores | Número de núcleos de processadores compatíveis com o destino. Esse parâmetro será validado quando usarmos uma sessão multi-Gdbserver (sessão T32-GdbServer). O atributo 'MultiCoreGdbServerSessions' abaixo deve ser definido como 'yes'. |
EnableSseContext | Se sinalizado como 'yes', o pacote RSP de contexto 'g' incluirá valores de registros de ponto flutuante. Esse parâmetro vale apenas para destinos da família Intel. |
heuristicScanSize | isso configura o algoritmo heurístico rápido do mecanismo do depurador para diminuir o teste de memória verificado pelo tamanho especificado, se o valor do atributo não especificado (ou "0"), o mecanismo do depurador não usará a heurística rápida e retornará à heurística herdada que examina toda a memória procurando a assinatura do PE DOS. Os valores comuns de tamanho de varredura são 0xfffe (melhor para NT) ou 0xffe (para aplicativos pré-NT). |
targetDescriptionFile | especifica se o servidor GDB envia um arquivo de cabeçalho de descrição de destino antes de enviar cada arquivo xml separado. Esse campo está em branco, então o cliente do servidor GDB não solicitará o registro do sistema de arquitetura xml (por exemplo, servidor Trace32 GDBs que não oferece suporte ao envio de registros de arquitetura em um arquivo xml separado). |
GdbServerConnectionParameters | Especifica parâmetros de sessão GdbServer. Esses parâmetros são usados para controlar a sessão RSP GdbServer entre o componente ExdiGdbSrv.dll e GdbServer. |
MultiCoreGdbServerSessions | Se sinalizado como 'yes', teremos uma sessão GdbServer de vários núcleos (aquela usada pelo T32-GdbServer Back-End). Se 'no', nos comunicaremos apenas com uma instância do GdbServer. |
MaximumGdbServerPacketLength | Esse é o comprimento máximo compatível com o GdbServer para um pacote. |
MaximumConnectAttempts | Esse é o máximo de tentativas de conexão. Ele é usado pelo ExdiGdbSrv.dll quando ele tenta estabelecer a conexão RSP com o GdbServer. |
SendPacketTimeout | Esse é o tempo limite de envio de RSP. |
ReceivePacketTimeout | Esse é o tempo limite de recebimento de RSP. |
HostNameAndPort | Essa é a cadeia de caracteres de conexão no formato <hostname/ip address:Port number> . Pode haver mais de uma cadeia de caracteres de conexão GdbServer (como a sessão GdbServer T32 de vários núcleos). O número de cadeias de caracteres de conexão deve corresponder ao número de núcleos. |
ExdiGdbServerMemoryCommands | Especifica várias maneiras de emitir os comandos de memória GDB para obter valores de registros do sistema ou memória de acesso de leitura/gravação em diferentes níveis de CPU de exceção (por exemplo, BMC-OpenOCD fornece acesso ao registro CP15 por meio do comando personalizado "aarch64 mrs nsec/sec <access code> "). |
GdbSpecialMemoryCommand | se "yes", o servidor GDB é compatível com comandos de memória personalizados (por exemplo, registro do sistema, deve ser definido para o servidor GDB Trace32). |
PhysicalMemory | se "yes", o servidor GDB é compatível com comandos personalizados para leitura de memória física (é definido para o servidor GDB Trace32). |
SupervisorMemory | se "yes", o servidor GDB é compatível com comandos personalizados para leitura de memória de supervisor (é definido para o servidor GDB Trace32). |
SpecialMemoryRegister | se "yes", o servidor GDB é compatível com comandos personalizados para leitura de registros do sistema (é definido para o servidor GDB Trace32). |
SystemRegistersGdbMonitor | se "yes", o servidor GDB é compatível com comandos personalizados por meio do comando monitor GDB (é definido para BMC Open-OCD). |
SystemRegisterDecoding | se "yes", o cliente GDB aceita decodificar o código de acesso antes de enviar o comando monitor GDB. |
ExdiGdbServerRegisters | Especifica o conjunto principal de registro de arquitetura específico. |
Arquitetura | Arquitetura de CPU do conjunto de registros definido. |
FeatureNameSupported | Esse é o nome do grupo de registro do sistema, pois é fornecido pelo arquivo de descrição do registro do sistema xml. É necessário identificar o grupo xml de registro do sistema que faz parte do arquivo xml à medida que é enviado pelo servidor GDB. |
SystemRegistersStart | Isso é para identificar o primeiro registro do sistema (número de registro baixo/ordem) que é relatado como parte do conjunto de registros principais (por exemplo, em X64, o QEMU não relata o registro do sistema x64 definido como um arquivo de descrição de destino xml separado, portanto, os registros do sistema fazem parte dos registros principais). |
SystemRegistersEnd | Isso é para identificar o último registro do sistema (número de registro alto/pedido) que é relatado como parte do conjunto de registros principais. |
Nome | Nome do registro. |
Pedido | É um número que identifica o índice na matriz de registros. Esse número será usado pelos pacotes de registro de conjunto/consulta (p<number>”/”q<number> ) do cliente e do servidor GDB. |
Tamanho | Esse é o tamanho do registro em bytes. |
Exemplo de arquivo exdiConfigData.xml
<ExdiTargets CurrentTarget = "QEMU">
<!-- QEMU SW simulator GDB server configuration -->
<ExdiTargets CurrentTarget="QEMU">
<!-- QEMU SW simulator GDB server configuration -->
<ExdiTarget Name="QEMU">
<ExdiGdbServerConfigData agentNamePacket="" uuid="72d4aeda-9723-4972-b89a-679ac79810ef" displayCommPackets="yes" debuggerSessionByCore="no" enableThrowExceptionOnMemoryErrors="yes" qSupportedPacket="qSupported:xmlRegisters=aarch64,i386">
<ExdiGdbServerTargetData targetArchitecture="ARM64" targetFamily="ProcessorFamilyARM64" numberOfCores="1" EnableSseContext="no" heuristicScanSize="0xfffe" targetDescriptionFile="target.xml"/>
<GdbServerConnectionParameters MultiCoreGdbServerSessions="no" MaximumGdbServerPacketLength="1024" MaximumConnectAttempts="3" SendPacketTimeout="100" ReceivePacketTimeout="3000">
<Value HostNameAndPort="LocalHost:1234"/>
</GdbServerConnectionParameters>
<ExdiGdbServerMemoryCommands GdbSpecialMemoryCommand="no" PhysicalMemory="no" SupervisorMemory="no" HypervisorMemory="no" SpecialMemoryRegister="no" SystemRegistersGdbMonitor="no" SystemRegisterDecoding="no"> </ExdiGdbServerMemoryCommands>
<ExdiGdbServerRegisters Architecture = "ARM64" FeatureNameSupported = "sys">
<Entry Name ="X0" Order = "0" Size = "8" />
<Entry Name ="X1" Order = "1" Size = "8" />
<Entry Name ="X2" Order = "2" Size = "8" />
<Entry Name ="X3" Order = "3" Size = "8" />
<Entry Name ="X4" Order = "4" Size = "8" />
<Entry Name ="X5" Order = "5" Size = "8" />
<Entry Name ="X6" Order = "6" Size = "8" />
<Entry Name ="X7" Order = "7" Size = "8" />
<Entry Name ="X8" Order = "8" Size = "8" />
<Entry Name ="X9" Order = "9" Size = "8" />
<Entry Name ="X10" Order = "a" Size = "8" />
<Entry Name ="X11" Order = "b" Size = "8" />
<Entry Name ="X12" Order = "c" Size = "8" />
<Entry Name ="X13" Order = "d" Size = "8" />
<Entry Name ="X14" Order = "e" Size = "8" />
<Entry Name ="X15" Order = "f" Size = "8" />
<Entry Name ="X16" Order = "10" Size = "8" />
<Entry Name ="X17" Order = "11" Size = "8" />
<Entry Name ="X18" Order = "12" Size = "8" />
<Entry Name ="X19" Order = "13" Size = "8" />
<Entry Name ="X20" Order = "14" Size = "8" />
<Entry Name ="X21" Order = "15" Size = "8" />
<Entry Name ="X22" Order = "16" Size = "8" />
<Entry Name ="X23" Order = "17" Size = "8" />
<Entry Name ="X24" Order = "18" Size = "8" />
<Entry Name ="X25" Order = "19" Size = "8" />
<Entry Name ="X26" Order = "1a" Size = "8" />
<Entry Name ="X27" Order = "1b" Size = "8" />
<Entry Name ="X28" Order = "1c" Size = "8" />
<Entry Name ="fp" Order = "1d" Size = "8" />
<Entry Name ="lr" Order = "1e" Size = "8" />
<Entry Name ="sp" Order = "1f" Size = "8" />
<Entry Name ="pc" Order = "20" Size = "8" />
<Entry Name ="cpsr" Order = "21" Size = "8" />
<Entry Name ="V0" Order = "22" Size = "16" />
<Entry Name ="V1" Order = "23" Size = "16" />
<Entry Name ="V2" Order = "24" Size = "16" />
<Entry Name ="V3" Order = "25" Size = "16" />
<Entry Name ="V4" Order = "26" Size = "16" />
<Entry Name ="V5" Order = "27" Size = "16" />
<Entry Name ="V6" Order = "28" Size = "16" />
<Entry Name ="V7" Order = "29" Size = "16" />
<Entry Name ="V8" Order = "2a" Size = "16" />
<Entry Name ="V9" Order = "2b" Size = "16" />
<Entry Name ="V10" Order = "2c" Size = "16" />
<Entry Name ="V11" Order = "2d" Size = "16" />
<Entry Name ="V12" Order = "2e" Size = "16" />
<Entry Name ="V13" Order = "2f" Size = "16" />
<Entry Name ="V14" Order = "30" Size = "16" />
<Entry Name ="V15" Order = "31" Size = "16" />
<Entry Name ="V16" Order = "32" Size = "16" />
<Entry Name ="V17" Order = "33" Size = "16" />
<Entry Name ="V18" Order = "34" Size = "16" />
<Entry Name ="V19" Order = "35" Size = "16" />
<Entry Name ="V20" Order = "36" Size = "16" />
<Entry Name ="V21" Order = "37" Size = "16" />
<Entry Name ="V22" Order = "38" Size = "16" />
<Entry Name ="V23" Order = "39" Size = "16" />
<Entry Name ="V24" Order = "3a" Size = "16" />
<Entry Name ="V25" Order = "3b" Size = "16" />
<Entry Name ="V26" Order = "3c" Size = "16" />
<Entry Name ="V27" Order = "3d" Size = "16" />
<Entry Name ="V28" Order = "3e" Size = "16" />
<Entry Name ="V29" Order = "3f" Size = "16" />
<Entry Name ="V30" Order = "3f" Size = "16" />
<Entry Name ="V31" Order = "3f" Size = "16" />
<Entry Name ="fpsr" Order = "40" Size = "4" />
<Entry Name ="fpcr" Order = "41" Size = "4" />
</ExdiGdbServerRegisters>
<!-- x64 GDB server core resgisters -->
<ExdiGdbServerRegisters Architecture = "X64" FeatureNameSupported = "sys" SystemRegistersStart = "18" SystemRegistersEnd = "20" >
<Entry Name ="rax" Order = "0" Size ="8" />
<Entry Name ="rbx" Order = "1" Size ="8" />
<Entry Name ="rcx" Order = "2" Size ="8" />
<Entry Name ="rdx" Order = "3" Size ="8" />
<Entry Name ="rsi" Order = "4" Size ="8" />
<Entry Name ="rdi" Order = "5" Size ="8" />
<Entry Name ="rbp" Order = "6" Size ="8" />
<Entry Name ="rsp" Order = "7" Size ="8" />
<Entry Name ="r8" Order = "8" Size ="8" />
<Entry Name ="r9" Order = "9" Size ="8" />
<Entry Name ="r10" Order = "a" Size ="8" />
<Entry Name ="r11" Order = "b" Size ="8" />
<Entry Name ="r12" Order = "c" Size ="8" />
<Entry Name ="r13" Order = "d" Size ="8" />
<Entry Name ="r14" Order = "e" Size ="8" />
<Entry Name ="r15" Order = "f" Size ="8" />
<Entry Name ="rip" Order = "10" Size ="8" />
<!-- <flags id="x64_eflags" size="4">
<field name="" start="22" end="31"/>
<field name="ID" start="21" end="21"/>
<field name="VIP" start="20" end="20"/>
<field name="VIF" start="19" end="19"/>
<field name="AC" start="18" end="18"/>
<field name="VM" start="17" end="17"/>
<field name="RF" start="16" end="16"/>
<field name="" start="15" end="15"/>
<field name="NT" start="14" end="14"/>
<field name="IOPL" start="12" end="13"/>
<field name="OF" start="11" end="11"/>
<field name="DF" start="10" end="10"/>
<field name="IF" start="9" end="9"/>
<field name="TF" start="8" end="8"/>
<field name="SF" start="7" end="7"/>
<field name="ZF" start="6" end="6"/>
<field name="" start="5" end="5"/>
<field name="AF" start="4" end="4"/>
<field name="" start="3" end="3"/>
<field name="PF" start="2" end="2"/>
<field name="" start="1" end="1"/>
<field name="CF" start="0" end="0"/>
</flags> -->
<Entry Name ="eflags" Order = "11" Size ="4" />
<!-- Segment registers -->
<Entry Name ="cs" Order = "12" Size ="4" />
<Entry Name ="ss" Order = "13" Size ="4" />
<Entry Name ="ds" Order = "14" Size ="4" />
<Entry Name ="es" Order = "15" Size ="4" />
<Entry Name ="fs" Order = "16" Size ="4" />
<Entry Name ="gs" Order = "17" Size ="4" />
<!-- Segment descriptor caches and TLS base MSRs -->
<!--Entry Name ="cs_base" Order = "18" Size="8"/
<Entry Name ="ss_base" Order = "18" Size ="8" />
<Entry Name ="ds_base" Order = "19" Size ="8" />
<Entry Name ="es_base" Order = "1a" Size ="8" /> -->
<Entry Name ="fs_base" Order = "18" Size ="8" />
<Entry Name ="gs_base" Order = "19" Size ="8" />
<Entry Name ="k_gs_base" Order = "1a" Size ="8" />
<!-- Control registers -->
<!-- the cr0 register format fields:
<flags id="x64_cr0" size="8">
<field name="PG" start="31" end="31"/>
<field name="CD" start="30" end="30"/>
<field name="NW" start="29" end="29"/>
<field name="AM" start="18" end="18"/>
<field name="WP" start="16" end="16"/>
<field name="NE" start="5" end="5"/>
<field name="ET" start="4" end="4"/>
<field name="TS" start="3" end="3"/>
<field name="EM" start="2" end="2"/>
<field name="MP" start="1" end="1"/>
<field name="PE" start="0" end="0"/>
</flags> -->
<Entry Name ="cr0" Order = "1b" Size ="8" />
<Entry Name ="cr2" Order = "1c" Size ="8" />
<!-- the cr3 register format fields:
<flags id="x64_cr3" size="8">
<field name="PDBR" start="12" end="63"/>
<field name="PCID" start="0" end="11"/>
</flags> -->
<Entry Name ="cr3" Order = "1d" Size ="8" />
<!-- the cr4 register format fields:
<flags id="x64_cr4" size="8">
<field name="PKE" start="22" end="22"/>
<field name="SMAP" start="21" end="21"/>
<field name="SMEP" start="20" end="20"/>
<field name="OSXSAVE" start="18" end="18"/>
<field name="PCIDE" start="17" end="17"/>
<field name="FSGSBASE" start="16" end="16"/>
<field name="SMXE" start="14" end="14"/>
<field name="VMXE" start="13" end="13"/>
<field name="LA57" start="12" end="12"/>
<field name="UMIP" start="11" end="11"/>
<field name="OSXMMEXCPT" start="10" end="10"/>
<field name="OSFXSR" start="9" end="9"/>
<field name="PCE" start="8" end="8"/>
<field name="PGE" start="7" end="7"/>
<field name="MCE" start="6" end="6"/>
<field name="PAE" start="5" end="5"/>
<field name="PSE" start="4" end="4"/>
<field name="DE" start="3" end="3"/>
<field name="TSD" start="2" end="2"/>
<field name="PVI" start="1" end="1"/>
<field name="VME" start="0" end="0"/>
</flags> -->
<Entry Name ="cr4" Order = "1e" Size ="8" />
<Entry Name ="cr8" Order = "1f" Size ="8" />
<!-- the efer register format fields:
<flags id="x64_efer" size="8">
<field name="TCE" start="15" end="15"/>
<field name="FFXSR" start="14" end="14"/>
<field name="LMSLE" start="13" end="13"/>
<field name="SVME" start="12" end="12"/>
<field name="NXE" start="11" end="11"/>
<field name="LMA" start="10" end="10"/>
<field name="LME" start="8" end="8"/>
<field name="SCE" start="0" end="0"/>
</flags> -->
<Entry Name ="efer" Order = "20" Size ="8"/>
<!-- x87 FPU -->
<Entry Name ="st0" Order = "21" Size ="10" />
<Entry Name ="st1" Order = "22" Size ="10" />
<Entry Name ="st2" Order = "23" Size ="10" />
<Entry Name ="st3" Order = "24" Size ="10" />
<Entry Name ="st4" Order = "25" Size ="10" />
<Entry Name ="st5" Order = "26" Size ="10" />
<Entry Name ="st6" Order = "27" Size ="10" />
<Entry Name ="st7" Order = "28" Size ="10" />
<Entry Name ="fctrl" Order = "29" Size ="4" />
<Entry Name ="fstat" Order = "2a" Size ="4" />
<Entry Name ="ftag" Order = "2b" Size ="4" />
<Entry Name ="fiseg" Order = "2c" Size ="4" />
<Entry Name ="fioff" Order = "2d" Size ="4" />
<Entry Name ="foseg" Order = "2e" Size ="4" />
<Entry Name ="fooff" Order = "2f" Size ="4" />
<Entry Name ="fop" Order = "30" Size ="4" />
<Entry Name ="xmm0" Order = "31" Size ="16" />
<Entry Name ="xmm1" Order = "32" Size ="16" />
<Entry Name ="xmm2" Order = "33" Size ="16" />
<Entry Name ="xmm3" Order = "34" Size ="16" />
<Entry Name ="xmm4" Order = "35" Size ="16" />
<Entry Name ="xmm5" Order = "36" Size ="16" />
<Entry Name ="xmm6" Order = "37" Size ="16" />
<Entry Name ="xmm7" Order = "38" Size ="16" />
<Entry Name ="xmm8" Order = "39" Size ="16" />
<Entry Name ="xmm9" Order = "3a" Size ="16" />
<Entry Name ="xmm10" Order = "3b" Size ="16" />
<Entry Name ="xmm11" Order = "3c" Size ="16" />
<Entry Name ="xmm12" Order = "3d" Size ="16" />
<Entry Name ="xmm13" Order = "3e" Size ="16" />
<Entry Name ="xmm14" Order = "3f" Size ="16" />
<Entry Name ="xmm15" Order = "40" Size ="16" />
<!-- the mxcsr register format fields:
<flags id="x64_mxcsr" size="4">
<field name="IE" start="0" end="0"/>
<field name="DE" start="1" end="1"/>
<field name="ZE" start="2" end="2"/>
<field name="OE" start="3" end="3"/>
<field name="UE" start="4" end="4"/>
<field name="PE" start="5" end="5"/>
<field name="DAZ" start="6" end="6"/>
<field name="IM" start="7" end="7"/>
<field name="DM" start="8" end="8"/>
<field name="ZM" start="9" end="9"/>
<field name="OM" start="10" end="10"/>
<field name="UM" start="11" end="11"/>
<field name="PM" start="12" end="12"/>
<field name="FZ" start="15" end="15"/>
</flags> -->
<Entry Name ="mxcsr" Order = "41" Size ="4" />
</ExdiGdbServerRegisters>
</ExdiGdbServerConfigData>
</ExdiTarget>
</ExdiTargets>
</ExdiTargets>
Exemplo de script EXDI PowerShell
Esse exemplo de script do PowerShell instala a EXDI e inicia o depurador. O script Start-ExdiDebugger.ps1 instalará ExdiGdbSrv.dll, se necessário, definirá os arquivos de configurações xml, verificará se há processos de dllhost.exe em execução e iniciará o depurador para se conectar a um destino de depuração de hardware do servidor GDB já em execução.
Ao usar a interface do usuário disponível com WinDBg, o ExdiGdbSrv.dll já está instalado e esse script não é relevante. Para obter mais informações sobre como usar a interface do usuário integrada, consulte Configurando o transporte do depurador EXDI.
Esse é um exemplo de chamada do script de inicialização.
PS>.\Start-ExdiDebugger.ps1 -ExdiTarget "QEMU" -GdbPort 1234 -Architecture x64
Você também pode especificar os arquivos criados, se necessário.
PS>.\Start-ExdiDebugger.ps1 -ExdiTarget "QEMU" -GdbPort 1234 -Architecture x64 -ExdiDropPath "C:\path\to\built\exdi\files"
O Start-ExdiDebugger.ps1 tem as seguintes opções de configurações.
Parâmetro | Descrição |
---|---|
ExdiTarget | O tipo de destino ao qual se conectar. Isso corresponde a uma seção específica no arquivo xml de configurações |
HostName | O endereço IP ou nome do host do computador que hospeda a sessão do servidor GDB (o padrão é "LocalHost") |
GdbPort | A porta na qual o servidor GDB está escutando. |
Arquitetura | Arquitetura do destino de depuração de hardware (esse parâmetro também implica o parâmetro ArchitectureFamily no arquivo de configurações xml) |
ExdiDropPath | Local dos arquivos ExdiGdbSrv.dll, exdiConfigData.xml e systemregisters.xml. Eles só serão copiados se ExdiGdbSrv.dll não estiver instalado ou estiver instalado incorretamente. |
ExtraDebuggerArgs | Argumentos extras para passar na linha de comando do depurador |
PreNTAppDebugging | Altera o valor do heuristicScanSize de 0xfffe (melhor para NT) para 0xffe (para aplicativos pré-NT) |
DontTryDllHostCleanup | A verificação de instâncias em execução existentes de ExdiGdbSrv.dll em dllhost.exe requer elevação. Fornecer essa opção permitirá que o script seja executado sem elevação (embora o depurador possa não funcionar corretamente). |
Para permitir que os pacotes sejam exibidos, defina o valor de displayCommPackets como yes.
[pscustomobject]@{ Path = 'displayCommPackets' ; value = "yes" }
.\Start-ExdiDebugger.ps1 -ExdiTarget "QEMU" -GdbPort 1234 -Architecture x64 -ExdiDropPath "C:\path\to\built\exdi\files"
Consulte os comentários de código para obter mais opções de configurações.
<#
.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
Confira também
Configurar o transporte do depurador EXDI
Configurando a depuração do modo kernel QEMU usando EXDI
Como configurar a depuração automática do kernel de rede KDNET