Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier les répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer de répertoire.
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.
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++.
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.
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.
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.
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.
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
Interfaces principales
IModelKeyReference / IModelKeyReference2
Concept Interfaces
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
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)
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 le script
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
IDataModelScriptTemplateEnumerator
Interfaces de débogueur de script
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