Compartilhar via


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

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

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

.exdicmd (Comando EXDI)

Como configurar a depuração automática do kernel de rede KDNET