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.
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.
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.
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.
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.
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.
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
Interfaces principales
IModelKeyReference / IModelKeyReference2
Interfaces conceptuelles
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
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)
IDebugHostMemory / IDebugHostMemory2
IDebugHostEvaluator / IDebugHostEvaluator2
Interfaces système de type hôte (débogueur)
IDebugHostSymbol / IDebugHostSymbol2
IDebugHostType / IDebugHostType2
IDebugHostBaseClassIDebugHostPublic
Prise en charge de l’hôte (débogueur) pour les scripts
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
IDataModelScriptTemplateEnumerator
Interfaces de débogueur de script
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