Visão geral do modelo de dados do depurador C++

Este tópico fornece uma visão geral de como usar interfaces C++ do Modelo de Dados do Depurador para estender e personalizar os recursos do depurador.

Este tópico faz parte de uma série que descreve as interfaces acessíveis do C++, como usá-las para criar uma extensão de depurador baseada em C++ e como usar outras construções de modelo de dados (por exemplo: JavaScript ou NatVis) de uma extensão de modelo de dados C++.

Visão geral do modelo de dados do depurador C++

Interfaces C++ do modelo de dados do depurador

Objetos C++ do modelo de dados do depurador

Interfaces adicionais do modelo de dados do depurador C++

Conceitos de C++ do modelo de dados do depurador

Script C++ do modelo de dados do depurador


Visão geral da interface C++ do modelo de dados do depurador

O modelo de dados do depurador é um modelo de objeto extensível que é central para a maneira como as novas extensões de depurador (incluindo as do JavaScript, NatVis e C++) consomem informações do depurador e produzem informações que podem ser acessadas do depurador, bem como de outras extensões. Os constructos gravados nas APIs do modelo de dados estão disponíveis no avaliador de expressão dx (mais recente) do depurador, bem como em extensões JavaScript ou extensões C++.

Para ilustrar as metas do modelo de dados do depurador, considere esse comando tradicional de depurador.

0: kd> !process 0 0 
PROCESS ffffe0007e6a7780
    SessionId: 1  Cid: 0f68    Peb: 7ff7cfe7a000  ParentCid: 0f34
    DirBase: 1f7fb9000  ObjectTable: ffffc001cec82780  HandleCount:  34.
    Image: echoapp.exe
...

O comando de depurador está usando uma máscara binária e fornece saída somente de texto de maneiras não padrão. A saída de texto é difícil de consumir, formatar ou estender e o layout é específico para esse comando.

Contraste isso com o comando dx do modelo de dados do depurador (Expressão do Modelo de Objeto do Depurador de Exibição).

dx @$cursession.Processes.Where(p => p.Threads.Count() > 5)

Esse comando usa um modelo de dados padrão que é detectável, extensível e composível de maneiras uniformes.

O espaçamento de nomes logicamente e a extensão em objetos específicos permitem a descoberta da funcionalidade de extensão do depurador.

Dica

Como as interfaces de objeto C++ do Modelo de Dados podem ser muito detalhadas para implementar uma biblioteca auxiliar C++ completa para o modelo de dados que usa uma exceção C++ completa e um paradigma de programação de modelo é recomendado. Para obter mais informações, consulte Usando a biblioteca DbgModelClientEx mais adiante neste tópico.

O modelo de dados é a maneira como o WinDbg mostra a maioria das coisas. Muitos elementos na nova interface do usuário podem ser consultados, estendidos ou com script, pois são alimentados pelo modelo de dados. Para obter mais informações, consulte WinDbg – Modelo de dados.

Captura de tela do modelo de dados explorar janela exibindo processos e threads.

Exibição arquitetônica do modelo de dados

O diagrama a seguir resume os principais elementos da arquitetura do modelo de dados do depurador.

  • No lado esquerdo, são mostrados elementos de interface do usuário que fornecem acesso aos objetos e dão suporte a funcionalidades como consultas LINQ.
  • No lado direito do diagrama estão componentes que fornecem dados para depurar o modelo de dados. Isso inclui extensões personalizadas do modelo de dados do depurador NatVis, JavaScript e C++.

Diagrama que mostra a arquitetura do modelo de dados com o modelo de objeto comum no centro e provedores à direita.

Modelo de Objeto

No centro do Modelo de Dados do Depurador há uma representação de objeto uniforme na qual tudo é uma instância da interface IModelObject. Embora esse objeto possa representar um intrínseco (por exemplo: um valor inteiro) ou outra interface de modelo de dados, ele geralmente representa um objeto dinâmico – um dicionário de tuplas de chave/valor/metadados e um conjunto de conceitos que descrevem comportamentos abstratos.

Este diagrama mostra como o IModelObject usa repositórios de chaves para conter valores que um provedor pode criar, registrar e manipular.

  • Ele mostra um provedor, que fornece informações para o modelo de objeto
  • À esquerda, ele mostra o IModelObject, que é o modelo de objeto comum usado para manipular objetos.
  • No centro está o Repositório de Chaves usado para armazenar e acessar valores.
  • Na parte inferior, ele mostra Conceitos que dão suporte a objetos com funcionalidade, como a capacidade de converter em uma cadeia de caracteres exibivel ou ser indexada.

Diagrama que mostra a arquitetura do modelo de dados com IModelObject como entrada e um repositório de chaves de tuplas.

O modelo de dados: uma exibição de consumidor

O próximo diagrama mostra uma exibição do consumidor do modelo de dados. No exemplo, o comando dx (Exibir Expressão de Modelo de Objeto do Depurador) está sendo usado para consultar informações.

  • O comando Dx se comunica por meio de um serializador para a interface de enumeração de objeto.
  • Os objetos IDebugHost* são usados para coletar informações do mecanismo do depurador.
  • Os avaliadores de expressão e semântica são usados para enviar a solicitação para o mecanismo do depurador.

Diagrama que mostra a arquitetura do modelo de dados com a alimentação da interface do usuário em avaliadores que se conectam ao IDebugHost.

O modelo de dados: uma exibição de produtor

Este diagrama mostra uma exibição de produtor do modelo de dados.

  • Um provedor NatVis é mostrado à esquerda que consome XML que define funcionalidade adicional.
  • Um provedor JavaScript pode aproveitar os Conceitos do Provedor Dinâmico para manipular informações em tempo real.
  • A parte inferior mostra um provedor de código nativo que também pode definir funcionalidade adicional.

Diagrama que mostra a arquitetura do modelo de dados com IModelObject conectado aos consumidores de código NatVis, JavaScript e Native.

Gerenciador de Modelos de Dados

Este diagrama mostra a função central que o gerenciador de modelos de dados desempenha no gerenciamento de objetos.

  • O Gerenciador de Modelos de Dados atua como um registrador central para todos os objetos.
  • À esquerda, ele mostra como os elementos padrão do depurador, como sessões e processo, são registrados.
  • O bloco de namespace mostra a lista de registro central.
  • O lado direito do diagrama mostra dois provedores, um para NatVis na parte superior e uma extensão C/C++ na parte inferior.

Diagrama que mostra a arquitetura do modelo de dados com nomes registrados sendo acessados pelo gerenciador de modelos de dados.

Resumo das interfaces de modelo de dados do depurador

Há uma infinidade de interfaces C++ que compõem diferentes partes do modelo de dados. Para abordar essas interfaces de maneira consistente e fácil, elas são divididas por categoria geral. As áreas main aqui:

O modelo de objeto geral

O primeiro e mais importante conjunto de interfaces define como obter acesso ao modelo de dados principal e como acessar e manipular objetos. IModelObject é a interface que representa todos os objetos no modelo de dados (assim como o objeto do C#). Essa é a interface de main de interesse para consumidores e produtores para o modelo de dados. As outras interfaces são mecanismos para acessar diferentes aspectos dos objetos. As seguintes interfaces são definidas para esta categoria:

Pontes entre dbgEng e o modelo de dados

IHostDataModelAccess

Interfaces principais

IModelObject

IKeyStore

IModelIterator

IModelPropertyAccessor

IModelMethod

IKeyEnumerator

IRawEnumerator

IModelKeyReference / IModelKeyReference2

Interfaces de conceito

IStringDisplayableConcept

IIterableConcept

IIndexableConcept

IPreferredRuntimeTypeConcept

IDataModelConcept

IDynamicKeyProviderConcept

IDynamicConceptProviderConcept

Gerenciamento de modelos de dados e extensibilidade

O Gerenciador de Modelos de Dados é o componente principal que gerencia como toda extensibilidade ocorre. É o repositório central de um conjunto de tabelas que mapeia ambos os tipos nativos para pontos de extensão, bem como constructos sintéticos para pontos de extensão. Além disso, é a entidade responsável pelo boxing de objetos (conversão de valores ordinais ou cadeias de caracteres em IModelObject).

As seguintes interfaces são definidas para esta categoria:

Acesso geral ao Gerenciador de Modelos de Dados

IDataModelManager / IDataModelManager2

Gerenciamento de scripts

IDataModelScriptManager

IDataModelScriptProviderEnumerator

Acesso ao Sistema de Tipos e Espaços de Memória do Depurador

Os espaços de memória e o sistema de tipos subjacentes do depurador são expostos em detalhes para extensões a serem usadas. As seguintes interfaces são definidas para esta categoria:

Interfaces de Host Geral (Depurador)

IDebugHost

IDebugHostStatus

IDebugHostContext

IDebugHostMemory / IDebugHostMemory2

IDebugHostErrorSink

IDebugHostEvaluator / IDebugHostEvaluator2

IDebugHostExtensibility

Interfaces do sistema de tipo host (depurador)

IDebugHostSymbols

IDebugHostSymbol / IDebugHostSymbol2

IDebugHostModule

IDebugHostType / IDebugHostType2

IDebugHostConstAnt

IDebugHostField

IDebugHostData

IDebugHostBaseClassIDebugHostPublic

IDebugHostModuleSignature

IDebugHostTypeSignature

Suporte ao host (depurador) para scripts

IDebugHostScriptHost

Criação e consumo de scripts

O Modelo de Dados também tem uma noção geral do que é um script e como depurar um. É totalmente possível que uma extensão de depurador venha e defina uma ponte geral entre o modelo de dados e outra linguagem dinâmica (geralmente um ambiente de script). Esse conjunto de interfaces é como isso é feito, bem como como uma interface do usuário do depurador pode usar esses scripts.

As seguintes interfaces são definidas para esta categoria:

Interfaces de Script Geral

IDataModelScriptProvider

IDataModelScript

IDataModelScriptClient

IDataModelScriptHostContext

IDataModelScriptTemplate

IDataModelScriptTemplateEnumerator

IDataModelNameBinder

Interfaces do depurador de script

IDataModelScriptDebug

IDataModelScriptDebugClient

IDataModelScriptDebugStack

IDataModelScriptDebugStackFrame

IDataModelScriptDebugVariableSetEnumerator

IDataModelScriptDebugBreakpoint

IDataModelScriptDebugBreakpointEnumerator

Usando a biblioteca DbgModelClientEx

Visão geral

As Interfaces de Objeto C++ do Modelo de Dados para o modelo de dados podem ser muito detalhadas para serem implementadas. Embora permitam a manipulação completa do modelo de dados, eles exigem a implementação de várias interfaces pequenas para estender o modelo de dados (por exemplo: uma implementação IModelPropertyAccessor para cada propriedade de busca dinâmica que é adicionada). Além disso, o modelo de programação baseado em HRESULT adiciona uma quantidade significativa de código de placa clichê que é usado para verificação de erros.

Para minimizar parte desse trabalho, há uma biblioteca auxiliar C++ completa para o modelo de dados que usa uma exceção C++ completa e um paradigma de programação de modelo. O uso dessa biblioteca permite um código mais conciso ao consumir ou estender o modelo de dados e é recomendado.

Há dois namespaces importantes na biblioteca auxiliar:

Depurador::D ataModel::ClientEx – auxiliares para consumo do modelo de dados

Debugger::D ataModel::P roviderEx – auxiliares para a extensão do modelo de dados

Para obter informações adicionais sobre como usar a biblioteca DbgModelClientEx, consulte o arquivo leiame neste site do github:

https://github.com/Microsoft/WinDbg-Libraries/tree/master/DbgModelCppLib

Exemplo de HelloWorld C++

Para ver como a biblioteca DbgModelClientEx pode ser usada, examine o exemplo HelloWorld C++ do modelo de dados aqui.

https://github.com/Microsoft/WinDbg-Samples/tree/master/DataModelHelloWorld

O exemplo inclui:

  • HelloProvider.cpp - Essa é uma implementação de uma classe de provedor que adiciona uma nova propriedade de exemplo "Hello" à noção de um processo do depurador.

  • SimpleIntroExtension.cpp - Essa é uma extensão de depurador simples que adiciona uma nova propriedade de exemplo "Hello" à noção do depurador de um processo. Essa extensão é gravada na Biblioteca auxiliar do Modelo de Dados C++17. É muito preferível gravar extensões nessa biblioteca em vez da ABI COM bruta devido ao volume (e à complexidade) do código de cola que é necessário.

Exemplos de JavaScript e COM

Para entender melhor as diferentes maneiras de gravar uma extensão de depurador com o modelo de dados, há três versões da extensão HelloWorld do modelo de dados disponíveis aqui:

https://github.com/Microsoft/WinDbg-Samples/tree/master/DataModelHelloWorld

  • JavaScript – uma versão escrita em JavaScript

  • C++17 – Uma versão gravada na Biblioteca de Clientes C++17 do Modelo de Dados

  • COM – uma versão gravada no COM ABI bruto (usando apenas WRL para auxiliares COM)


Confira também

Interfaces C++ do modelo de dados do depurador

Objetos C++ do modelo de dados do depurador

Interfaces adicionais do modelo de dados do depurador C++

Conceitos de C++ do modelo de dados do depurador

Script C++ do modelo de dados do depurador