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

Cette rubrique fournit une vue d’ensemble de l’utilisation des interfaces C++ du modèle de données 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 créer une extension de débogueur basée sur C++ et comment utiliser d’autres constructions de modèles de données (par exemple, JavaScript ou NatVis) à partir d’une extension de modèle de données C++.

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

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

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 du modèle de données C++ du débogueur

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 d’objet extensible crucial pour la façon dont les nouvelles extensions du débogueur (y compris celles de JavaScript, NatVis et C++) utilisent les informations du débogueur et produisent des informations accessibles à partir du débogueur ainsi que d’autres extensions. Les constructions écrites dans les API de modèle de données sont disponibles dans l’évaluateur d’expression (dx) plus récent du débogueur, ainsi qu’à partir d’extensions JavaScript ou C++.

Pour illustrer les objectifs du modèle de données du débogueur, considérez cette commande de débogueur traditionnelle.

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 débogueur utilise un masque binaire et fournit une sortie de texte uniquement de manière non standard. La sortie de texte est difficile à utiliser, à mettre en forme ou à étendre et la disposition est spécifique à cette commande.

Comparez cela à la commande dx (Display Debugger Object Model Expression) du modèle de débogueur .

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.

L’espacement logique des noms et l’extension sur des objets spécifiques permettent de découvrir les fonctionnalités d’extension du débogueur.

Conseil

Étant donné que les interfaces objet C++ du modèle de données peuvent être très détaillées pour implémenter une bibliothèque d’assistance C++ complète pour le modèle de données qui utilise une exception C++ complète et le paradigme de programmation de modèle est recommandé. 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 montre la plupart des éléments. 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 qui affiche le processus et les threads.

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.

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

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

Modèle objet

Au centre du modèle de données du débogueur se trouve une représentation d’objet uniforme dans laquelle tout est un instance de l’interface IModelObject. Bien qu’un tel objet puisse représenter une interface 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 des magasins de clés pour contenir des valeurs qu’un fournisseur peut créer, inscrire et manipuler.

  • Il montre un fournisseur, qui fournit des informations au modèle objet
  • Sur la gauche, il affiche l’IModelObject, c’est-à-dire le modèle objet courant utilisé pour manipuler des objets.
  • Au centre se trouve le magasin de clés utilisé pour stocker et accéder aux valeurs.
  • En bas, il montre concepts qui prennent en charge des 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 du débogueur.
  • Les évaluateurs d’expression et de sémantique sont utilisés pour envoyer la demande au moteur de débogueur.

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

Modèle de données : vue 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 NatVis, JavaScript et Native.

Gestionnaire de modèle de données

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

  • Le Gestionnaire de modèle de données agit en tant que bureau d’enregistrement central pour tous les objets.
  • Sur la gauche, il montre comment les éléments de débogueur standard tels que les sessions et le processus sont inscrits.
  • Le bloc d’espace de noms affiche la liste d’inscriptions 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èle 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 zones main ici :

Modèle objet général

Le premier et le plus important ensemble d’interfaces définit 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 (tout comme l’objet de C#). Il s’agit de l’interface main d’intérêt pour les consommateurs et les producteurs pour le 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

Interfaces conceptuelles

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 toute l’extensibilité se produit. Il s’agit du référentiel central d’un ensemble de tables qui mappent à la fois les types natifs aux points d’extension et les constructions synthétiques aux points d’extension. En outre, c’est l’entité qui est responsable de la boxe d’objets (conversion de valeurs ordinales ou de chaînes 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 et aux espaces mémoire du débogueur

Le système de type sous-jacent et les espaces de mémoire du débogueur sont exposés en détail pour les extensions à utiliser. Les interfaces suivantes sont définies pour cette catégorie :

Interfaces hôtes générales (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 les scripts

IDebugHostScriptHost

Création et consommation de scripts

Le modèle de données a également une idée générale de ce qu’est un script et de la façon de déboguer un script. Il est tout à fait possible pour une extension de débogueur de définir 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 effectué, ainsi que la façon dont l’interface utilisateur d’un débogueur peut utiliser ces 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

Vue d'ensemble

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

Afin de réduire une partie de ce travail, 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ée.

Il existe deux espaces de noms importants dans la bibliothèque d’assistance :

Débogueur ::D ataModel ::ClientEx - assistances pour la consommation du modèle de données

Débogueur ::D ataModel ::P roviderEx - assistance pour l’extension du modèle de données

Pour plus d’informations sur l’utilisation de la bibliothèque DbgModelClientEx, consultez le fichier readme sur ce site github :

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

Exemple C++ HelloWorld

Pour voir comment utiliser la bibliothèque DbgModelClientEx, consultez l’exemple C++ du modèle de données HelloWorld ici.

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

L’exemple comprend :

  • HelloProvider.cpp : il s’agit d’une implémentation d’une classe de fournisseur qui ajoute un nouvel exemple de propriété « Hello » à la notion 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 processus du débogueur. Cette extension est écrite dans la bibliothèque d’assistance C++17 du modèle de données. Il est de loin 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, trois versions de l’extension HelloWorld du modèle de données sont disponibles ici :

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

  • JavaScript : version écrite en JavaScript

  • C++17 : version écrite dans la bibliothèque cliente C++17 du modèle de données

  • COM : version écrite par rapport à l’ABI COM brut (uniquement à l’aide de WRL pour les assistances COM)


Voir aussi

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

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 du modèle de données C++ du débogueur

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