Översikt över felsökningsdatamodellen C++

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.

Skärmbild av fönstret för att utforska datamodellen som visar processer och trådar.

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.

Diagram som visar datamodellarkitektur med gemensam objektmodell i mitten och leverantörer till höger.

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.

Diagram som visar datamodellarkitektur med IModelObject som datainput och ett nyckellager för tupler.

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.

Diagram som visar datamodellarkitektur med UI-matning till utvärderare som ansluter till IDebugHost.

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.

Diagram som visar datamodellarkitektur med IModelObject anslutet till NatVis, JavaScript och interna kodkonsumenter.

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.

Diagram som visar datamodellarkitektur med registrerade namn som används av datamodellhanteraren.

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

IHostDataModelAccess

Huvudgränssnitt

IModelObject

IKeyStore

IModelIterator

IModelPropertyAccessor

IModelMethod

IKeyEnumerator

IRawEnumerator

IModelKeyReference / IModelKeyReference2

Konceptgränssnitt

IStringDisplayableConcept

IIterableConcept

IIndexableConcept

IPreferredRuntimeTypeConcept

IDataModelConcept

IDynamicKeyProviderConcept

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

IDataModelScriptManager

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)

IDebugHost

IDebugHostStatus

IDebugHostContext

IDebugHostMemory / IDebugHostMemory2

IDebugHostErrorSink

IDebugHostEvaluator / IDebugHostEvaluator2

IDebugHostExtensibility

Systemgränssnitt av typen Värd (felsökare)

IDebugHostSymbols

IDebugHostSymbol / IDebugHostSymbol2

IDebugHostModule

IDebugHostType / IDebugHostType2

IDebugHostConstant

IDebugHostField

IDebugHostData

IDebugHostBaseClassIDebugHostPublic

IDebugHostModuleSignature

IDebugHostTypeSignature

Stöd för värd (felsökningsprogram) för skript

IDebugHostScriptHost

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

IDataModelScriptProvider

IDataModelScript

IDataModelScriptClient

IDataModelScriptHostContext

IDataModelScriptTemplate

IDataModelScriptTemplateEnumerator

IDataModelNameBinder

Skriptfelsökargränssnitt

IDataModelScriptDebug

IDataModelScriptDebugClient

IDataModelScriptDebugStack

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

Begrepp för felsökningsdatamodell C++

Felsökning av datamodell C++-skript