Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In dit onderwerp vindt u een overzicht van het gebruik van Debugger Data Model C++ Interfaces om de mogelijkheden van het foutopsporingsprogramma uit te breiden en aan te passen.
Dit onderwerp maakt deel uit van een reeks waarin de interfaces worden beschreven die toegankelijk zijn vanuit C++, hoe u deze kunt gebruiken om een C++-extensie voor foutopsporingsprogramma's te bouwen en hoe u andere gegevensmodelconstructies (bijvoorbeeld JavaScript of NatVis) gebruikt vanuit een C++-gegevensmodelextensie.
Debuggergegevensmodel C++-interfaces
Gegevensmodel C++-objecten voor foutopsporingsprogramma's
Gegevensmodel debugger C++ aanvullende interfaces
C++ Concepten voor het Debugger-gegevensmodel
Foutopsporingsgegevensmodel C++ Scripting
Overzicht van de C++-interface van het foutopsporingsprogramma
Het gegevensmodel voor foutopsporingsprogramma's is een uitbreidbaar objectmodel dat centraal staat bij de manier waarop nieuwe foutopsporingsprogramma-extensies (inclusief extensies in JavaScript, NatVis en C++) gegevens uit het foutopsporingsprogramma gebruiken en informatie produceren die toegankelijk is via het foutopsporingsprogramma en andere extensies. Constructies die naar de api's van het gegevensmodel worden geschreven, zijn beschikbaar in de nieuwere (dx)-expressie-evaluator van het foutopsporingsprogramma, evenals van JavaScript-extensies of C++-extensies.
Bekijk deze traditionele foutopsporingsprogramma-opdracht om de doelen van het gegevensmodel voor foutopsporing te illustreren.
0: kd> !process 0 0
PROCESS ffffe0007e6a7780
SessionId: 1 Cid: 0f68 Peb: 7ff7cfe7a000 ParentCid: 0f34
DirBase: 1f7fb9000 ObjectTable: ffffc001cec82780 HandleCount: 34.
Image: echoapp.exe
...
De debuggeropdracht maakt gebruik van een binair masker en biedt alleen tekstuitvoer op een niet-standaard manier. De tekstuitvoer is moeilijk te gebruiken, op te maken of uit te breiden en de indeling is specifiek voor deze opdracht.
Vergelijk dit met de opdracht dx (Display Debugger Object Model Expression) van het gegevensmodel van het foutopsporingsprogramma.
dx @$cursession.Processes.Where(p => p.Threads.Count() > 5)
Deze opdracht maakt gebruik van een standaardgegevensmodel dat op uniforme wijze kan worden gedetecteerd, uitbreidbaar en samenstelbaar.
Het logisch groeperen van dingen en het uitbreiden van specifieke objecten maakt het mogelijk de functionaliteit van debugger-extensies te ontdekken.
Hint
Omdat de objectinterfaces van het gegevensmodel in C++ erg uitgebreid kunnen zijn, wordt aanbevolen om een volledige C++ helperbibliotheek te implementeren voor het gegevensmodel. Deze bibliotheek maakt gebruik van een uitgebreid C++-uitzonderings- en sjabloonprogrammeringsparadigma. Voor meer informatie, zie Het gebruik van de DbgModelClientEx-bibliotheek later in dit onderwerp.
Het gegevensmodel is de manier waarop WinDbg de meeste dingen laat zien. Veel elementen in de nieuwe gebruikersinterface kunnen worden opgevraagd, uitgebreid of gescript, omdat ze worden aangedreven door het gegevensmodel. Zie WinDbg - Gegevensmodel voor meer informatie.
Architectuurweergave voor gegevensmodellen
In het volgende diagram ziet u een overzicht van de belangrijkste elementen van de gegevensmodelarchitectuur voor foutopsporingsprogramma's.
- Aan de linkerkant worden UI-elementen weergegeven die toegang bieden tot de objecten en ondersteuning bieden voor dergelijke functionaliteit als LINQ-query's.
- Aan de rechterkant van het diagram bevinden zich onderdelen die gegevens leveren voor het foutopsporingsprogrammagegevensmodel. Dit omvat aangepaste NatVis-, JavaScript- en C++-gegevensmodelextensies voor foutopsporingsprogramma's.
Objectmodel
In het hart van het debuggergegevensmodel is er een uniforme objectweergave waarin alles een exemplaar van de IModelObject-interface is. Hoewel een dergelijk object een intrinsiek object kan vertegenwoordigen (bijvoorbeeld een geheel getal) of een andere gegevensmodelinterface, vertegenwoordigt het vaak een dynamisch object: een woordenlijst met sleutel-/waarde-/metagegevens-tuples en een set concepten die abstract gedrag beschrijven.
In dit diagram ziet u hoe het IModelObject sleutelarchieven gebruikt om waarden te bevatten die een provider kan maken, registreren en bewerken.
- Er wordt een provider weergegeven die informatie levert aan het objectmodel
- Aan de linkerkant ziet u het IModelObject, dat het algemene objectmodel is dat wordt gebruikt om objecten te bewerken.
- In het midden bevindt zich het sleutelarchief dat wordt gebruikt voor het opslaan en openen van waarden.
- Onderaan ziet u concepten die objecten ondersteunen met functionaliteiten, zoals de mogelijkheid om te converteren naar een weergegeven tekenreeks of om geïndexeerd te worden.
Het gegevensmodel: een consumentenweergave
In het volgende diagram ziet u een consumentenweergave van het gegevensmodel. In het voorbeeld wordt de opdracht dx (Display Debugger Object Model Expression) gebruikt om gegevens op te vragen.
- De Dx-opdracht communiceert via een serializer naar de interface voor objectumeratie.
- IDebugHost*-objecten worden gebruikt om informatie te verzamelen van de foutopsporingsprogramma-engine.
- Expressies en semantische evaluators worden gebruikt om de aanvraag naar de debugger engine te sturen.
Het gegevensmodel: een producentweergave
In dit diagram ziet u een producentweergave van het gegevensmodel.
- Aan de linkerkant wordt een NatVis-provider weergegeven die XML gebruikt waarmee extra functionaliteit wordt gedefinieerd.
- Een JavaScript-provider kan profiteren van dynamische providerconcepten om informatie in realtime te bewerken.
- Onderaan ziet u een systeemeigen codeprovider die ook aanvullende functionaliteit kan definiëren.
Gegevensmodelbeheer
In dit diagram ziet u de centrale rol die de gegevensmodelbeheerder speelt in het beheer van objecten.
- Data Model Manager fungeert als centrale registrar voor alle objecten.
- Aan de linkerkant ziet u hoe standaard debugger-elementen, zoals sessies en processen, worden geregistreerd.
- Het naamruimteblok toont de centrale registratielijst.
- Aan de rechterkant van het diagram ziet u twee providers, één voor NatVis bovenaan en een C/C++-extensie onderaan.
Samenvatting van gegevensmodelinterfaces voor foutopsporingsprogramma
Er zijn verschillende C++-interfaces die verschillende onderdelen van het gegevensmodel omvatten. Om deze interfaces op een consistente en eenvoudige manier te benaderen, worden ze onderverdeeld op algemene categorie. De belangrijkste gebieden hier:
Het algemene objectmodel
In de eerste en belangrijkste set interfaces wordt gedefinieerd hoe u toegang krijgt tot het kerngegevensmodel en hoe u objecten kunt openen en bewerken. IModelObject is de interface die elk object in het gegevensmodel vertegenwoordigt (net als C#'s object). Dit is de belangrijkste interface van belang voor zowel consumenten als producenten voor het gegevensmodel. De andere interfaces zijn mechanismen voor toegang tot verschillende aspecten van objecten. De volgende interfaces zijn gedefinieerd voor deze categorie:
Bruggen tussen DbgEng en het gegevensmodel
Hoofdinterfaces
IModelKeyReference / IModelKeyReference2
Conceptinterfaces
IDynamicConceptProviderConcept
Beheer van gegevensmodellen en uitbreidbaarheid
Data Model Manager is het kernonderdeel dat beheert hoe alle uitbreidbaarheid plaatsvindt. Het is de centrale opslagplaats van een set tabellen die zowel systeemeigen typen toewijzen aan extensiepunten als synthetische constructies aan extensiepunten. Daarnaast is het de entiteit die verantwoordelijk is voor het wrapperen van objecten (conversie van ordinale waarden of tekenreeksen in IModelObject-items).
De volgende interfaces zijn gedefinieerd voor deze categorie:
Algemene toegang tot Data Model Manager
IDataModelManager / IDataModelManager2
Scriptbeheer
IDataModelScriptProviderEnumerator
Toegang tot het type systeem en geheugenruimten van het foutopsporingsprogramma
Het onderliggende type systeem en de geheugenruimten van het foutopsporingsprogramma worden gedetailleerd weergegeven voor extensies om gebruik te maken van. De volgende interfaces zijn gedefinieerd voor deze categorie:
Algemene hostinterfaces (foutopsporingsprogramma)
IDebugHostMemory / IDebugHostMemory2
IDebugHostEvaluator / IDebugHostEvaluator2
Systeeminterfaces van het type Host (Foutopsporingsprogramma)
IDebugHostSymbol / IDebugHostSymbol2
IDebugHostType / IDebugHostType2
IDebugHostBaseClassIDebugHostPublic
Ondersteuning voor host (foutopsporingsprogramma) voor scripting
Scripts ontwerpen en gebruiken
Het gegevensmodel heeft ook een algemeen begrip van wat een script is en hoe u fouten in een script opsneert. Het is volledig mogelijk dat een foutopsporingsprogramma-extensie langskomt en een algemene brug definieert tussen het gegevensmodel en een andere dynamische taal (meestal een scriptomgeving). Deze set interfaces is hoe dit wordt bereikt en hoe een foutopsporingsprogramma-gebruikersinterface gebruik kan maken van dergelijke scripts.
De volgende interfaces zijn gedefinieerd voor deze categorie:
Algemene scriptinterfaces
IDataModelScriptTemplateEnumerator
Interfaces voor scriptdebugger
IDataModelScriptDebugStackFrame
IDataModelScriptDebugVariableSetEnumerator
IDataModelScriptDebugBreakpoint
IDataModelScriptDebugBreakpointEnumerator
De Library DbgModelClientEx gebruiken
Overzicht
De gegevensmodel-C++-objectinterfaces voor het gegevensmodel kunnen zeer uitgebreid zijn om te implementeren. Hoewel ze volledige manipulatie van het gegevensmodel mogelijk maken, vereisen ze implementatie van een aantal kleine interfaces om het gegevensmodel uit te breiden (bijvoorbeeld een IModelPropertyAccessor-implementatie voor elke dynamische ophaalbare eigenschap die wordt toegevoegd). Daarnaast voegt het op HRESULT gebaseerde programmeermodel een aanzienlijke hoeveelheid standaardplaatcode toe die wordt gebruikt voor foutcontrole.
Om een deel van dit werk te minimaliseren, is er een volledige C++-helperbibliotheek voor het gegevensmodel dat gebruikmaakt van een volledig C++-uitzonderings- en sjabloonprogrammeringsparadigma. Het gebruik van deze bibliotheek maakt beknoptere code mogelijk bij het gebruiken of uitbreiden van het gegevensmodel en wordt aanbevolen.
Er zijn twee belangrijke naamruimten in de helperbibliotheek:
Debugger::DataModel::ClientEx - helpers voor het gebruik van het gegevensmodel
Debugger::DataModel::ProviderEx - hulpmodulen voor het uitbreiden van het gegevensmodel
Zie het readme-bestand op deze github-site voor meer informatie over het gebruik van de bibliotheek DbgModelClientEx.
https://github.com/Microsoft/WinDbg-Libraries/tree/master/DbgModelCppLib
HelloWorld C++ Voorbeeld
Als u wilt zien hoe de Library DbgModelClientEx kan worden gebruikt, bekijkt u het voorbeeld HelloWorld C++ van het gegevensmodel hier.
https://github.com/Microsoft/WinDbg-Samples/tree/master/DataModelHelloWorld
Het voorbeeld bevat:
HelloProvider.cpp - Dit is een implementatie van een providerklasse die een nieuwe voorbeeldeigenschap "Hallo" toevoegt aan de manier waarop de debugger een proces begrijpt.
SimpleIntroExtension.cpp: dit is een eenvoudige foutopsporingsprogramma-extensie waarmee een nieuwe voorbeeldeigenschap 'Hallo' wordt toegevoegd aan het idee van het foutopsporingsprogramma van een proces. Deze extensie wordt geschreven op basis van de Data Model C++17 Helper Library. Het verdient veel voorkeur om extensies te schrijven voor deze bibliotheek in plaats van de onbewerkte COM ABI vanwege het volume (en de complexiteit) van lijmcode die vereist is.
JavaScript- en COM-voorbeelden
Om meer inzicht te krijgen in de verschillende manieren om een foutopsporingsprogramma-extensie te schrijven met het gegevensmodel, zijn er drie versies van de HelloWorld-extensie voor het gegevensmodel beschikbaar:
https://github.com/Microsoft/WinDbg-Samples/tree/master/DataModelHelloWorld
JavaScript : een versie die is geschreven in JavaScript
C++17 - Een versie geschreven op basis van de C++17 Clientbibliotheek voor het gegevensmodel
COM - Een versie die is geschreven op basis van de onbewerkte COM ABI (alleen met WRL voor COM-helpers)
Zie ook
Debuggergegevensmodel C++-interfaces
Gegevensmodel C++-objecten voor foutopsporingsprogramma's
Gegevensmodel debugger C++ aanvullende interfaces