Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Det här avsnittet innehåller en översikt över hur du använder felsökningsdatamodellens C++-gränssnitt för att utöka och anpassa funktionerna i felsökningsprogrammet.
Det här avsnittet är en del av en serie som beskriver de gränssnitt som är tillgängliga från C++, hur du använder dem för att skapa ett C++-baserat felsökningstillägg och hur du använder andra datamodellkonstruktioner (t.ex. JavaScript eller NatVis) från ett C++-datamodelltillägg.
Debugger-datamodell C++-gränssnitt
Debuggningsdatamodellens C++-objekt
Debuggerdatamodell C++ Ytterligare gränssnitt
Begrepp för felsökningsdatamodell C++
Felsökning av datamodell C++-skript
översikt över felsökningsdatamodellens C++-gränssnitt
Datamodellen för felsökningsprogrammet är en utökningsbar objektmodell som är central för hur nya felsökningstillägg (inklusive de i JavaScript, NatVis och C++) både använder information från felsökningsprogrammet och genererar information som kan nås från felsökningsprogrammet samt andra tillägg. Konstruktioner som skrivs till datamodell-API:er är tillgängliga i felsökarens nyare (dx) uttrycksutvärderare samt från JavaScript-tillägg eller C++-tillägg.
För att illustrera målen med datamodellen för felsökningsprogrammet bör du överväga det här traditionella felsökningskommandot.
0: kd> !process 0 0
PROCESS ffffe0007e6a7780
SessionId: 1 Cid: 0f68 Peb: 7ff7cfe7a000 ParentCid: 0f34
DirBase: 1f7fb9000 ObjectTable: ffffc001cec82780 HandleCount: 34.
Image: echoapp.exe
...
Felsökningskommandot använder en binär mask och ger endast textutdata på sätt som inte är standard. Textutdata är svåra att använda, formatera eller utöka och layouten är specifik för det här kommandot.
Jämför detta med dx-kommandot för felsökningsdatamodellen (Visa felsökningsobjektmodelluttryck).
dx @$cursession.Processes.Where(p => p.Threads.Count() > 5)
Det här kommandot använder en standarddatamodell som är identifierbar, utökningsbar och komposterbar på ett enhetligt sätt.
Logisk namngivning av utrymme och utökning av specifika objekt möjliggör upptäckt av felsökningsförlängningsfunktionalitet.
Tips
Eftersom gränssnitten för Data Model C++ Object kan vara mycket utförliga rekommenderas det att implementera ett fullständigt hjälpbibliotek för datamodellen i C++ som använder en fullständig C++-undantagshantering och mallprogrammeringsparadigm. Mer information finns i Använda DbgModelClientEx-biblioteket senare i det här avsnittet.
Datamodellen är det sätt som WinDbg visar det mesta. Många element i det nya användargränssnittet kan efterfrågas, utökas eller skriptas eftersom de drivs av datamodellen. Mer information finns i WinDbg – datamodell.
Arkitekturvy för datamodell
I följande diagram sammanfattas huvudelementen i datamodellarkitekturen för felsökningsprogrammet.
- Till vänster visas gränssnittselement som ger åtkomst till objekten och stöder sådana funktioner som LINQ-frågor.
- Till höger i diagrammet finns komponenter som tillhandahåller data för att felsöka datamodellen. Detta inkluderar anpassade NatVis-, JavaScript- och C++-felsökningsdatamodelltillägg.
Objektmodell
I mitten av felsökningsdatamodellen finns en enhetlig objektrepresentation där allt är en instans av IModelObject-gränssnittet. Även om ett sådant objekt kan representera ett inbyggt (t.ex. ett heltalsvärde) eller ett annat datamodellgränssnitt, representerar det ofta ett dynamiskt objekt – en ordlista med nyckel-/värde-/metadatatupplar och en uppsättning begrepp som beskriver abstrakta beteenden.
Det här diagrammet visar hur IModelObject använder nyckellager för att innehålla värden som en provider kan skapa, registrera och manipulera.
- Den visar en provider som tillhandahåller information till objektmodellen
- Till vänster visas IModelObject, som är den vanliga objektmodellen som används för att manipulera objekt.
- I mitten finns nyckelarkivet som används för att lagra och komma åt värden.
- Längst ned visas Begrepp som stöder objekt med funktioner som möjligheten att konvertera till en visningsbar sträng eller indexeras.
Datamodellen: Sett ur konsumentens perspektiv
Nästa diagram visar en konsumentvy över datamodellen. I exemplet används kommandot dx (Display Debugger Object Model Expression) för att fråga efter information.
- Dx-kommandot kommunicerar via en serialiserare till objektuppräkningsgränssnittet.
- IDebugHost*-objekt används för att samla in information från felsökningsmotorn.
- Uttrycks- och semantikutvärderare används för att skicka begäran till felsökningsmotorn.
Datamodellen: En producents perspektiv
Det här diagrammet visar en producentvy över datamodellen.
- En NatVis-provider visas till vänster som använder XML som definierar ytterligare funktioner.
- En JavaScript-provider kan dra nytta av begrepp för dynamisk provider för att manipulera information i realtid.
- Längst ned visas en intern kodprovider som också kan definiera ytterligare funktioner.
Datamodellhanterare
Det här diagrammet visar den centrala roll som datamodellhanteraren spelar i hanteringen av objekt.
- Data Model Manager fungerar som en central registrator för alla objekt.
- Till vänster visas hur standardfelsökarelement som sessioner och processer registreras.
- Namnområdesblocket visar den centrala registreringslistan.
- Till höger i diagrammet visas två providrar, en för NatVis överst och ett C/C++-tillägg längst ned.
sammanfattning av felsökningsgränssnitt för datamodeller
Det finns en mängd olika C++-gränssnitt som består av olika delar av datamodellen. För att kunna närma sig dessa gränssnitt på ett konsekvent och enkelt sätt delas de upp efter allmän kategori. De viktigaste områdena här:
Den allmänna objektmodellen
Den första och viktigaste uppsättningen gränssnitt definierar hur du får åtkomst till kärndatamodellen och hur du får åtkomst till och manipulerar objekt. IModelObject är gränssnittet som representerar varje objekt i datamodellen (ungefär som C#-objektet). Detta är det viktigaste gränssnittet för både konsumenter av och producenter till datamodellen. De andra gränssnitten är mekanismer för att komma åt olika aspekter av objekt. Följande gränssnitt definieras för den här kategorin:
Bryggor mellan DbgEng och datamodellen
Huvudgränssnitt
IModelKeyReference / IModelKeyReference2
Konceptgränssnitt
IDynamicConceptProviderConcept
Hantering av datamodeller och utökningsbarhet
Data Model Manager är den viktigaste komponenten som hanterar hur all utökningsbarhet sker. Det är den centrala lagringsplatsen för en uppsättning tabeller som mappar både inbyggda typer till tilläggspunkter och syntetiska konstruktioner till tilläggspunkter. Dessutom är det entiteten som ansvarar för boxning av objekt (konvertering av ordningstal eller strängar till IModelObjects).
Följande gränssnitt definieras för den här kategorin:
Allmän Data Model Manager-åtkomst
IDataModelManager / IDataModelManager2
Skripthantering
IDataModelScriptProviderUppräknare
Åtkomst till felsökningsprogrammets typsystem och minnesutrymmen
Felsökningsprogrammets underliggande typsystem och minnesutrymmen exponeras i detalj för tillägg att använda. Följande gränssnitt definieras för den här kategorin:
Gränssnitt för allmän värd (felsökningsprogram)
IDebugHostMemory / IDebugHostMemory2
IDebugHostEvaluator / IDebugHostEvaluator2
Systemgränssnitt av typen Värd (felsökare)
IDebugHostSymbol / IDebugHostSymbol2
IDebugHostType / IDebugHostType2
IDebugHostBaseClassIDebugHostPublic
Stöd för värd (felsökningsprogram) för skript
Redigera och använda skript
Datamodellen har också en allmän uppfattning om vad ett skript är och hur du felsöker ett. Det är fullt möjligt för ett felsökningstillägg att komma och definiera en allmän brygga mellan datamodellen och ett annat dynamiskt språk (vanligtvis en skriptmiljö). Den här uppsättningen gränssnitt är hur det går till och hur ett användargränssnitt för felsökningsprogram kan använda sådana skript.
Följande gränssnitt definieras för den här kategorin:
Allmänna skriptgränssnitt
IDataModelScriptTemplateEnumerator
Skriptfelsökargränssnitt
IDataModelScriptDebugStackFrame
IDataModelScriptDebugVariableSetEnumerator
IDataModelScriptDebugBreakpoint
IDataModelScriptDebugBreakpointEnumerator
Använda DbgModelClientEx-biblioteket
Överblick
DatamodellenS C++-objektgränssnitt till datamodellen kan vara mycket utförliga att implementera. Även om de möjliggör fullständig manipulering av datamodellen kräver de implementering av ett antal små gränssnitt för att utöka datamodellen (t.ex. en IModelPropertyAccessor-implementering för varje dynamisk hämtningsbar egenskap som läggs till). Dessutom lägger den HRESULT-baserade programmeringsmodellen till en betydande mängd pannplåtskod som används för felkontroll.
För att minimera en del av det här arbetet finns det ett fullständigt C++-hjälpbibliotek för datamodellen som använder ett fullständigt C++-undantag och mallprogrammeringsparadigm. Med hjälp av det här biblioteket kan du använda mer koncis kod när du använder eller utökar datamodellen och rekommenderas.
Det finns två viktiga namnområden i hjälpbiblioteket:
Felsökare::DataModel::ClientEx – verktyg för användning av datamodellen
Debugger::DataModel::ProviderEx – hjälpverktyg för utökning av datamodellen
Mer information om hur du använder dbgModelClientEx-biblioteket finns i readme-filen på den här github-webbplatsen:
https://github.com/Microsoft/WinDbg-Libraries/tree/master/DbgModelCppLib
HelloWorld C++-exempel
Om du vill se hur DbgModelClientEx-biblioteket kan användas kan du läsa Data Model HelloWorld C++-exemplet här.
https://github.com/Microsoft/WinDbg-Samples/tree/master/DataModelHelloWorld
Exemplet innehåller:
HelloProvider.cpp – Det här är en implementering av en providerklass som lägger till en ny exempelegenskap "Hello" i felsökningsprogrammets begrepp om en process.
SimpleIntroExtension.cpp – Det här är ett enkelt felsökningstillägg som lägger till en ny exempelegenskap "Hello" i felsökningsprogrammets begrepp om en process. Det här tillägget skrivs mot hjälpbiblioteket för datamodellen C++17. Det är mycket bättre att skriva tillägg mot det här biblioteket i stället för den råa COM ABI på grund av volymen (och komplexiteten) för limkoden som krävs.
JavaScript- och COM-exempel
För att bättre förstå de olika sätten att skriva ett felsökningstillägg med datamodellen finns det tre versioner av datamodellens HelloWorld-tillägg här:
https://github.com/Microsoft/WinDbg-Samples/tree/master/DataModelHelloWorld
JavaScript – en version skriven i JavaScript
C++17 – En version som skrivits mot klientbiblioteket för datamodellen C++17
COM – En version som skrivits mot råa COM ABI (endast med hjälp av WRL som hjälp för COM)
Se även
Felsökningsdatamodell C++-gränssnitt
Felsökningsdatamodell C++-objekt
Felsökningsdatamodellens C++ ytterligare gränssnitt