Partilhar via


Anatomia de uma DLL de extensão DbgEng

Uma DLL de extensão DbgEng exporta várias funções de retorno de chamada, algumas das quais podem ser implementações de comandos de extensão.

Essas DLLs de extensão são carregadas pelo mecanismo de depurador e podem fornecer funcionalidade extra ou automação de tarefas ao executar a depuração do modo de usuário ou do modo kernel no Microsoft Windows.

Se você executou uma instalação completa das Ferramentas de Depuração para Windows, uma extensão DbgEng de exemplo chamada "exts" poderá ser encontrada no subdk\samples\exts subdiretório do diretório de instalação.

Comandos de extensão

Uma DLL de extensão pode exportar qualquer número de funções usadas para executar comandos de extensão. Cada função é declarada explicitamente como uma exportação no arquivo .def e seu nome deve consistir inteiramente em letras minúsculas.

As funções usadas para implementar comandos de extensão devem corresponder ao protótipo PDEBUG_EXTENSION_CALL.

Essas funções são nomeadas de acordo com a convenção padrão do C++, exceto que letras maiúsculas não são permitidas. O nome da função exportada e o nome do comando de extensão são idênticos, exceto que o comando de extensão começa com um ponto de exclamação (!). Por exemplo, quando você carrega myextension.dll no depurador e digita !stack na janela Comando do Depurador, o depurador procura uma função exportada chamada stack no myextension.dll.

Se myextension.dll ainda não estiver carregado ou se houver outros comandos de extensão com o mesmo nome em outras DLLs de extensão, você poderá digitar !myextension.stack na janela Comando do Depurador para indicar a DLL de extensão e o comando de extensão nessa DLL.

Outras funções exportadas

Uma DLL de extensão DbgEng deve exportar DebugExtensionInitialize. Isso será chamado quando a DLL for carregada para inicializar a DLL. Ele pode ser usado pela DLL para inicializar variáveis globais.

Uma DLL de extensão pode exportar DebugExtensionUninitialize. Se isso for exportado, ele será chamado antes que a DLL de extensão seja descarregada. Ele pode ser usado pela DLL para limpo antes de ser descarregado.

Uma DLL de extensão pode exportar DebugExtensionNotify. Se isso for exportado, ele será chamado quando uma sessão começar ou terminar e quando um destino for iniciado ou interrompido a execução. Essas notificações também são fornecidas aos objetos IDebugEventCallbacks registrados com um cliente.

Uma DLL de extensão pode exportar KnownStructOutput. Se isso for exportado, ele será chamado quando a DLL for carregada. Essa função retorna uma lista de estruturas que a DLL sabe imprimir em uma única linha. Ele pode ser chamado posteriormente para formatar instâncias dessas estruturas para impressão.

Procedimento do mecanismo para carregar uma DLL de extensão DbgEng

Quando uma DLL de extensão é carregada, as funções de retorno de chamada são chamadas pelo mecanismo na seguinte ordem:

  1. DebugExtensionInitialize é chamado para que a DLL de extensão possa ser inicializada.

  2. Se exportado, DebugExtensionNotify será chamado se o mecanismo tiver uma sessão ativa e chamado novamente se a sessão estiver suspensa e acessível.

  3. Se exportado, KnownStructOutput é chamado para solicitar uma lista de estruturas que a DLL sabe imprimir em uma única linha.

Consulte Carregando DLLs de extensão do depurador para obter informações sobre como usar o depurador para carregar e descarregar uma DLL de extensão e consulte Usando comandos de extensão do depurador para obter informações sobre como executar um comando de extensão.

O mecanismo de depurador fará uma tentativa/exceto bloqueará uma chamada para uma DLL de extensão. Isso protege o mecanismo contra alguns tipos de bugs no código de extensão; mas, como as chamadas de extensão são executadas no mesmo thread que o mecanismo, elas ainda podem causar uma falha.