Partager via


Vue d’ensemble du modèle de données du débogueur C++

Cette rubrique fournit une vue d’ensemble de l’utilisation des interfaces C++ du modèle de données du débogueur pour étendre et personnaliser les fonctionnalités du débogueur.

Cette rubrique fait partie d’une série qui décrit les interfaces accessibles à partir de C++, comment les utiliser pour générer une extension de débogueur C++ et comment utiliser d’autres constructions de modèle de données (par exemple, JavaScript ou NatVis) à partir d’une extension de modèle de données C++.

Interfaces du modèle de données C++ du débogueur

Objets du modèle de données C++ du débogueur

Interfaces supplémentaires du modèle de données C++ du débogueur

Concepts C++ du modèle de données du débogueur

de script C++ du modèle de données du débogueur


Vue d’ensemble de l’interface C++ du modèle de données du débogueur

Le modèle de données du débogueur est un modèle objet extensible qui est essentiel à la façon dont les nouvelles extensions de débogueur (y compris celles en JavaScript, NatVis et C++) consomment des informations du débogueur et produisent des informations accessibles à partir du débogueur ainsi que d’autres extensions. Les constructions écrites dans les API du modèle de données sont disponibles dans l’évaluateur d’expression plus récent (dx) du débogueur, ainsi qu’à partir d’extensions JavaScript ou C++.

Pour illustrer les objectifs du modèle de données du débogueur, envisagez cette commande de débogueur classique.

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

La commande de débogueur utilise un masque binaire et fournit uniquement une sortie de texte de manière non standard. La sortie de texte est difficile à lire, à formater ou à étendre et la disposition est spécifique à cette commande.

Contrairement à la commande dx (expression du modèle objet dans le débogueur d'affichage).

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

Cette commande utilise un modèle de données standard qui est détectable, extensible et composable de manière uniforme.

Nommer logiquement les espaces et l'extension à des objets spécifiques permet la découverte des fonctionnalités d’extension du débogueur.

Conseil / Astuce

Étant donné que les interfaces objet C++ du modèle de données peuvent être très volumineuses, il est recommandé d'implémenter une bibliothèque d'assistance C++ complète pour le modèle de données, qui utilise pleinement le paradigme de programmation en C++ basé sur les exceptions et les templates. Pour plus d’informations, consultez Utilisation de la bibliothèque DbgModelClientEx plus loin dans cette rubrique.

Le modèle de données est la façon dont WinDbg affiche la plupart des choses. De nombreux éléments de la nouvelle interface utilisateur peuvent être interrogés, étendus ou scriptés, car ils sont alimentés par le modèle de données. Pour plus d’informations, consultez WinDbg - Modèle de données.

Capture d’écran de la fenêtre d'exploration du modèle de données affichant des processus et les fils d'exécution.

Vue architecturale du modèle de données

Le diagramme suivant récapitule les principaux éléments de l’architecture du modèle de données du débogueur.

  • À gauche, les éléments d'interface utilisateur permettent d'accéder aux objets et supportent des fonctionnalités telles que les requêtes LINQ.
  • Sur le côté droit du diagramme sont des composants qui fournissent des données au modèle de données du débogueur. Cela inclut des extensions personnalisées du modèle de données de débogueur NatVis, JavaScript et C++.

Diagramme montrant l’architecture du modèle de données avec un modèle objet commun dans le centre et les fournisseurs à droite.

Modèle objet

Au centre du modèle de données du débogueur est une représentation d’objet uniforme dans laquelle tout est une instance de l’interface IModelObject. Bien qu’un tel objet puisse représenter une valeur intrinsèque (par exemple, une valeur entière) ou une autre interface de modèle de données, il représente souvent un objet dynamique , un dictionnaire de tuples clé/valeur/métadonnées et un ensemble de concepts qui décrivent des comportements abstraits.

Ce diagramme montre comment IModelObject utilise les magasins de clés pour contenir des valeurs qu’un fournisseur peut créer, inscrire et manipuler.

  • Il affiche un fournisseur qui fournit des informations au modèle objet
  • Sur la gauche, il affiche iModelObject, c’est-à-dire le modèle objet commun utilisé pour manipuler des objets.
  • Dans le centre est le magasin de clés utilisé pour stocker et accéder aux valeurs.
  • En bas, il montre les concepts qui prennent en charge les objets avec des fonctionnalités telles que la possibilité de convertir en chaîne affichable ou d’être indexés.

Diagramme montrant l’architecture du modèle de données avec IModelObject comme entrée et un magasin de clés tuples.

Modèle de données : vue consommateur

Le diagramme suivant montre une vue du consommateur du modèle de données. Dans l’exemple, la commande dx (Display Debugger Object Model Expression) est utilisée pour interroger des informations.

  • La commande Dx communique via un sérialiseur à l’interface d’énumération d’objet.
  • Les objets IDebugHost* sont utilisés pour collecter des informations à partir du moteur de débogueur.
  • Les évaluateurs d’expression et sémantique sont utilisés pour envoyer la requête au moteur de débogueur.

Diagramme montrant l’architecture du modèle de données avec l’alimentation de l’interface utilisateur dans les évaluateurs qui se connectent à IDebugHost.

Modèle de données : vue du producteur

Ce diagramme montre une vue de producteur du modèle de données.

  • Un fournisseur NatVis s’affiche à gauche qui consomme du code XML qui définit des fonctionnalités supplémentaires.
  • Un fournisseur JavaScript peut tirer parti des concepts du fournisseur dynamique pour manipuler des informations en temps réel.
  • Le bas montre un fournisseur de code natif qui peut également définir des fonctionnalités supplémentaires.

Diagramme montrant l’architecture du modèle de données avec IModelObject connecté aux consommateurs de code Natif, JavaScript et NatVis.

Gestionnaire de modèles de données

Ce diagramme montre le rôle central joué par le gestionnaire de modèles de données dans la gestion des objets.

  • Data Model Manager agit en tant que bureau d’enregistrement central pour tous les objets.
  • Sur la gauche, cela montre comment les éléments de débogueur standard tels que les sessions et le processus sont enregistrés.
  • Le bloc d’espace de noms affiche la liste d’inscription centrale.
  • Le côté droit du diagramme montre deux fournisseurs, un pour NatVis en haut et une extension C/C++ en bas.

Diagramme montrant l’architecture du modèle de données avec des noms inscrits accessibles par le gestionnaire de modèles de données.

Résumé des interfaces de modèle de données du débogueur

Il existe une multitude d’interfaces C++ qui comprennent différents éléments du modèle de données. Afin d’aborder ces interfaces de manière cohérente et facile, elles sont réparties par catégorie générale. Les principaux domaines ici :

Modèle objet général

Le premier et le plus important ensemble d’interfaces définissent comment accéder au modèle de données de base et comment accéder aux objets et les manipuler. IModelObject est l’interface qui représente chaque objet dans le modèle de données (comme l’objet C#). Il s’agit de l’interface principale d’intérêt pour les consommateurs et les producteurs du modèle de données. Les autres interfaces sont des mécanismes permettant d’accéder à différents aspects des objets. Les interfaces suivantes sont définies pour cette catégorie :

Ponts entre DbgEng et le modèle de données

IHostDataModelAccess

Interfaces principales

IModelObject

IKeyStore

IModelIterator

IModelPropertyAccessor

IModelMethod

IKeyEnumerator

IRawEnumerator

IModelKeyReference / IModelKeyReference2

Concept Interfaces

IStringDisplayableConcept

IIterableConcept

IIndexableConcept

IPreferredRuntimeTypeConcept

IDataModelConcept

IDynamicKeyProviderConcept

IDynamicConceptProviderConcept

Gestion des modèles de données et de l’extensibilité

Data Model Manager est le composant principal qui gère la façon dont toutes les extensibilités se produisent. Il s’agit du référentiel central d’un ensemble de tables qui mappe les deux types natifs aux points d’extension, ainsi que les constructions synthétiques aux points d’extension. En outre, il s'agit de l'entité responsable de l'emboîtement des objets (conversion de valeurs ou de chaînes ordinales en IModelObject).

Les interfaces suivantes sont définies pour cette catégorie :

Accès général au Gestionnaire de modèles de données

IDataModelManager / IDataModelManager2

Gestion des scripts

IDataModelScriptManager

IDataModelScriptProviderEnumerator

Accès au système de type du débogueur et aux espaces de mémoire

Le système de types sous-jacent et les espaces de mémoire du débogueur sont exposés en détail pour être utilisés par des extensions. Les interfaces suivantes sont définies pour cette catégorie :

Interfaces d’hôte général (débogueur)

IDebugHost

IDebugHostStatus

IDebugHostContext

IDebugHostMemory / IDebugHostMemory2

IDebugHostErrorSink

IDebugHostEvaluator / IDebugHostEvaluator2

IDebugHostExtensibility

Interfaces système de type hôte (débogueur)

IDebugHostSymbols

IDebugHostSymbol / IDebugHostSymbol2

IDebugHostModule

IDebugHostType / IDebugHostType2

IDebugHostConstant

IDebugHostField

IDebugHostData

IDebugHostBaseClassIDebugHostPublic

IDebugHostModuleSignature

IDebugHostTypeSignature

Prise en charge de l’hôte (débogueur) pour le script

IDebugHostScriptHost

Création et consommation de scripts

Le modèle de données a également une notion générale de ce qu’est un script et comment en déboguer un. Une extension de débogueur est entièrement possible et définit un pont général entre le modèle de données et un autre langage dynamique (généralement un environnement de script). Cet ensemble d’interfaces est la façon dont cela est accompli, ainsi que la façon dont une interface utilisateur du débogueur peut utiliser de tels scripts.

Les interfaces suivantes sont définies pour cette catégorie :

Interfaces de script générales

IDataModelScriptProvider

IDataModelScript

IDataModelScriptClient

IDataModelScriptHostContext

IDataModelScriptTemplate

IDataModelScriptTemplateEnumerator

IDataModelNameBinder

Interfaces de débogueur de script

IDataModelScriptDebug

IDataModelScriptDebugClient

IDataModelScriptDebugStack

IDataModelScriptDebugStackFrame

IDataModelScriptDebugVariableSetEnumerator

IDataModelScriptDebugBreakpoint

IDataModelScriptDebugBreakpointEnumerator

Utilisation de la bibliothèque DbgModelClientEx

Aperçu

Les interfaces objet C++ du modèle de données vers le modèle de données peuvent être très détaillées à implémenter. Bien qu’ils permettent une manipulation complète du modèle de données, ils nécessitent l’implémentation d’un certain nombre d’interfaces de petite taille pour étendre le modèle de données (par exemple, une implémentation IModelPropertyAccessor pour chaque propriété récupérable dynamique qui est ajoutée). En plus de cela, le modèle de programmation BASÉ sur HRESULT ajoute une quantité significative de code de plaque de chaudière utilisé pour la vérification des erreurs.

Pour réduire certains de ces travaux, il existe une bibliothèque d’assistance C++ complète pour le modèle de données qui utilise une exception C++ complète et un paradigme de programmation de modèle. L’utilisation de cette bibliothèque permet un code plus concis lors de la consommation ou de l’extension du modèle de données et est recommandé.

Il existe deux espaces de noms importants dans la bibliothèque utilitaire :

Débogueur::DataModel::ClientEx - aides pour l'utilisation du modèle de données

Débogueur::DataModel::ProviderEx - outils pour l’extension du modèle de données

Pour plus d’informations sur l’utilisation de la bibliothèque DbgModelClientEx, consultez le fichier lisez-moi sur ce site Github :

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

Exemple HelloWorld C++

Pour voir comment la bibliothèque DbgModelClientEx peut être utilisée, consultez l’exemple De modèle de données HelloWorld C++ ici.

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

L’exemple inclut les éléments suivants :

  • HelloProvider.cpp : il s’agit d’une implémentation d’une classe de fournisseur qui ajoute un nouvel exemple de propriété « Hello » à la définition de processus du débogueur.

  • SimpleIntroExtension.cpp : il s’agit d’une extension de débogueur simple qui ajoute un nouvel exemple de propriété « Hello » à la notion de débogueur d’un processus. Cette extension est conçue pour fonctionner avec la bibliothèque d'aide C++17 du modèle de données. Il est très préférable d’écrire des extensions sur cette bibliothèque plutôt que sur l’ABI COM brut en raison du volume (et de la complexité) du code de collage requis.

Exemples JavaScript et COM

Pour mieux comprendre les différentes façons d’écrire une extension de débogueur avec le modèle de données, il existe trois versions de l’extension HelloWorld du modèle de données disponibles ici :

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

  • JavaScript - Version écrite en JavaScript

  • C++17 - Une version écrite pour la bibliothèque cliente C++17 du modèle de données

  • COM - Version écrite en rapport avec l'ABI COM brut (utilisant uniquement WRL pour les assistants COM)


Voir aussi

Interfaces du modèle de données du débogueur C++

Objets C++ du modèle de données du débogueur

Interfaces supplémentaires du modèle de données C++ du débogueur

Concepts C++ du modèle de données du débogueur

de script C++ du modèle de données du débogueur