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.
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++.
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.
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.
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.
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.
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
Interfaces principais
IModelKeyReference / IModelKeyReference2
Interfaces de conceito
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
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)
IDebugHostMemory / IDebugHostMemory2
IDebugHostEvaluator / IDebugHostEvaluator2
Interfaces do sistema de tipo host (depurador)
IDebugHostSymbol / IDebugHostSymbol2
IDebugHostType / IDebugHostType2
IDebugHostBaseClassIDebugHostPublic
Suporte ao host (depurador) para scripts
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
IDataModelScriptTemplateEnumerator
Interfaces do depurador de script
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++