Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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++.
interfaces C++ do modelo de dados do depurador de
Objetos C++ do modelo de dados do depurador
Interfaces adicionais do modelo de dados do depurador C++
conceitos do C++ do modelo de dados do depurador
de 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 mais recente (dx) 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 de depurador tradicional.
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 do depurador está usando uma máscara binária e fornece saída somente de texto de maneiras não padronizadas. 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 do modelo de dados do depurador dx (Expressão do Modelo de Objeto do Depurador).
dx @$cursession.Processes.Where(p => p.Threads.Count() > 5)
Esse comando usa um modelo de dados padrão que é detectável, extensível e redigido de maneiras uniformes.
O espaçamento de nomes lógicos 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, é recomendado implementar uma biblioteca auxiliar completa em C++ para o modelo de dados que utiliza um paradigma completo de programação com exceções e templates em C++. 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 de arquitetura 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 o modelo de dados do depurador. Isso inclui extensões personalizadas de NatVis, JavaScript e do modelo de dados do depurador C++.
Modelo de objeto
No centro do Modelo de Dados do Depurador está 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 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 exibível ou ser indexado.
O modelo de dados: uma visão do consumidor
O próximo diagrama mostra a perspectiva do consumidor do modelo de dados. No exemplo, o comando dx (Expressão do Modelo de Objeto do Depurador de Exibição) 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.
- 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 de depurador.
O modelo de dados: uma visão do produtor
Este diagrama mostra uma visão do 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 de depurador padrão, 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 compreendem diferentes partes do modelo de dados. Para abordar essas interfaces de maneira consistente e fácil, elas são divididas por categoria geral. As principais áreas 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#). Esta é a principal interface de interesse tanto para os consumidores quanto para os produtores do modelo de dados. As outras interfaces são mecanismos para acessar diferentes aspectos de 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
IIndexableConcept
IPreferredRuntimeTypeConcept
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 tanto os tipos nativos a pontos de extensão quanto as construções sintéticas a pontos de extensão. Além disso, é a entidade responsável pelo boxe 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 do Depurador e Espaços de Memória
O sistema de tipos subjacente e os espaços de memória do depurador são detalhadamente expostos para uso por extensões. As seguintes interfaces são definidas para esta categoria:
Interfaces gerais do host (depurador)
IDebugHostMemory / IDebugHostMemory2
IDebugHostEvaluator / IDebugHostEvaluator2
Interfaces do sistema de tipo host (depurador)
IDebugHostSymbol / IDebugHostSymbol2
IDebugHostType / IDebugHostType2
IDebugHostBaseClassIDebugHostPublic
Suporte ao host (depurador) para scripts
Criando e consumindo 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 apareça e defina uma ponte geral entre o modelo de dados e outra linguagem dinâmica (geralmente um ambiente de script). Este conjunto de interfaces é o meio pelo qual isso é realizado, além de como uma interface de usuário de um depurador pode utilizar esses scripts.
As seguintes interfaces são definidas para esta categoria:
Interfaces gerais de script
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 podem ser muito verbosas para implementar. 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 boilerplate que é usado para verificação de erros.
Para minimizar parte desse trabalho, há uma biblioteca completa de auxiliares em C++ para o modelo de dados, que utiliza um paradigma completo de programação com exceções e templates em C++. 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::DataModel::ClientEx – ferramentas auxiliares para a utilização do modelo de dados
Debugger::DataModel::ProviderEx – auxiliares para 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 do Modelo de Dados HelloWorld C++ 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 de um processo do depurador. Essa extensão é desenvolvida para a Biblioteca de Apoio C++17 do Modelo de Dados. É 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 desenvolvida para a Biblioteca Cliente do Modelo de Dados C++17
COM - Uma versão escrita baseada na ABI COM bruta (utilizando apenas WRL para auxiliares de COM)
Consulte também
interfaces C++ do modelo de dados do depurador de
Objetos C++ do modelo de dados do depurador
Interfaces adicionais do modelo de dados do depurador C++