Sdílet prostřednictvím


Přehled datového modelu ladicího programu C++

Toto téma obsahuje přehled o tom, jak pomocí rozhraní C++ datového modelu ladicího programu rozšířit a přizpůsobit možnosti ladicího programu.

Toto téma je součástí řady, která popisuje rozhraní přístupná z jazyka C++, jak je použít k sestavení rozšíření ladicího programu založeného na jazyce C++ a jak využít jiné konstruktory datového modelu (např. JavaScript nebo NatVis) z rozšíření datového modelu jazyka C++.

Rozhraní C++ datového modelu ladicího programu

Objekty C++ datového modelu ladicího programu

Další rozhraní modelu dat ladicího programu v C++

C++ koncepty datového modelu ladicího programu

skriptování datového modelu Ladicího programu C++


Přehled rozhraní C++ datového modelu ladicího programu

Datový model ladicího programu je rozšiřitelný objektový model, který je centrální pro způsob, jakým nová rozšíření ladicího programu (včetně těch v JavaScriptu, NatVis a C++) využívají informace z ladicího programu a vytvářejí informace, ke kterým je možné přistupovat z ladicího programu i z dalších rozšíření. Konstrukty, které jsou zapsány do rozhraní API datového modelu, jsou k dispozici v novějším vyhodnocovači výrazů ladicího programu (dx) i z rozšíření JavaScriptu nebo rozšíření jazyka C++.

Pokud chcete znázornit cíle datového modelu ladicího programu, zvažte tento tradiční příkaz ladicího programu.

0: kd> !process 0 0 
PROCESS ffffe0007e6a7780
    SessionId: 1  Cid: 0f68    Peb: 7ff7cfe7a000  ParentCid: 0f34
    DirBase: 1f7fb9000  ObjectTable: ffffc001cec82780  HandleCount:  34.
    Image: echoapp.exe
...

Příkaz ladicího programu používá binární masku a poskytuje textový výstup pouze nestandardními způsoby. Textový výstup je obtížné používat, formátovat nebo rozšířit a rozložení je specifické pro tento příkaz.

Porovnejte to s příkazem dx (Display Debugger Object Model Expression) datového modelu debuggeru.

dx @$cursession.Processes.Where(p => p.Threads.Count() > 5)

Tento příkaz používá standardní datový model, který je zjistitelný, rozšiřitelný a kompozovatelný jednotným způsobem.

Logické pojmenování a rozdělení věcí a rozšíření konkrétních objektů umožňuje objevení funkčnosti rozšíření ladicího programu.

Návod

Vzhledem k tomu, že rozhraní objektů C++ v datovém modelu mohou být velmi obsáhlá, je doporučeno implementovat kompletní pomocnou knihovnu jazyka C++ pro datový model, která využívá celý paradigmat výjimek a šablon v jazyce C++. Další informace naleznete v tématu Použití knihovny DbgModelClientEx dále v tomto tématu.

Datový model je způsob, jakým WinDbg ukazuje většinu věcí. Mnoho prvků v novém uživatelském rozhraní je možné dotazovat, rozšířit nebo skriptovat, protože jsou založené na datovém modelu. Další informace naleznete v tématu WinDbg – datový model.

Snímek obrazovky s oknem zkoumání datového modelu zobrazující proces a vlákna

Zobrazení architektury datového modelu

Následující diagram shrnuje hlavní prvky architektury datového modelu ladicího programu.

  • Na levé straně se zobrazují prvky uživatelského rozhraní, které poskytují přístup k objektům a podporují takové funkce jako dotazy LINQ.
  • Na pravé straně diagramu jsou komponenty, které poskytují data pro datový model ladicího programu. To zahrnuje vlastní rozšíření datových modelů debuggeru pro NatVis, JavaScript a C++.

Diagram znázorňující architekturu datového modelu s běžným objektovým modelem v centru a poskytovateli vpravo

Objektový model

Středem datového modelu ladicího programu je jednotná reprezentace objektu, ve které je vše instance rozhraní IModelObject. I když takový objekt může představovat vnitřní hodnotu (např. celočíselnou) nebo jiné rozhraní datového modelu, často představuje dynamický objekt – slovník dvojic klíč/hodnota/metadata a sadu konceptů, které popisují abstraktní chování.

Tento diagram znázorňuje, jak objekt IModelObject používá úložiště klíčů k zahrnutí hodnot, které může poskytovatel vytvořit, zaregistrovat a manipulovat s nimi.

  • Zobrazuje poskytovatele, který poskytuje informace pro objektový model.
  • Na levé straně zobrazuje objekt IModelObject, tedy běžný objektový model, který se používá k manipulaci s objekty.
  • Uprostřed je úložiště klíčů , které slouží k ukládání a přístupu k hodnotám.
  • V dolní části se zobrazují koncepty , které podporují objekty s funkcemi, jako je například možnost převést na zobrazovaný řetězec nebo indexovat.

Diagram znázorňující architekturu datového modelu s objektem IModelObject jako vstupem a úložištěm klíčů pro ntice.

Datový model: Pohled spotřebitele

Následující diagram znázorňuje zobrazení datového modelu uživatelem. V příkladu se k dotazování informací používá příkaz dx (Display Debugger Object Model Expression).

  • Příkaz Dx komunikuje prostřednictvím serializátoru s rozhraním výčtu objektu.
  • Objekty IDebugHost* slouží ke shromažďování informací z modulu ladicího programu.
  • Výrazy a sémantické vyhodnocovače se používají k odeslání požadavku do modulu ladicího programu.

Diagram znázorňující architekturu datového modelu s uživatelským rozhraním do vyhodnocovačů, které se připojují k IDebugHost

Datový model: Pohled producenta

Tento diagram znázorňuje zobrazení producenta datového modelu.

  • Na levé straně se zobrazí zprostředkovatel NatVis, který využívá XML, který definuje další funkce.
  • Zprostředkovatel JavaScriptu může využít výhod konceptů dynamického zprostředkovatele k manipulaci s informacemi v reálném čase.
  • Dole je uveden nativní zprostředkovatel kódu, který může také definovat další funkce.

Diagram znázorňující architekturu datového modelu s objektem IModelObject připojeným k natVis, JavaScriptu a nativním příjemcům kódu

Správce datových modelů

Tento diagram znázorňuje centrální roli, kterou hraje správce datového modelu při správě objektů.

  • Správce datových modelů funguje jako centrální registrátor pro všechny objekty.
  • Na levé straně je zobrazeno, jak se registrují standardní prvky ladicího programu, jako jsou relace a proces.
  • Blok oboru názvů zobrazuje centrální seznam registrací.
  • Na pravé straně diagramu jsou dva zprostředkovatelé, jeden pro NatVis nahoře a dole rozšíření C/C++.

Diagram znázorňující architekturu datového modelu s registrovanými názvy, ke kterým přistupuje správce datového modelu

Souhrn rozhraní datového modelu ladicího programu

Existuje mnoho rozhraní jazyka C++, která tvoří různé části datového modelu. Aby bylo možné tato rozhraní přistupovat konzistentním a snadným způsobem, jsou rozděleny podle obecné kategorie. Hlavní oblasti:

Obecný objektový model

První a nejdůležitější sada rozhraní definují, jak získat přístup k základnímu datovému modelu a jak přistupovat k objektům a manipulovat s nimi. IModelObject je rozhraní, které představuje každý objekt v datovém modelu (podobně jako objekt jazyka C#). Toto je hlavní rozhraní zájmu pro spotřebitele i producenty datového modelu. Další rozhraní jsou mechanismy pro přístup k různým aspektům objektů. Pro tuto kategorii jsou definována následující rozhraní:

Mosty mezi DbgEng a datovým modelem

IHostDataModelAccess

Hlavní rozhraní

IModelObject

IKeyStore

IModelIterator

IModelPropertyAccessor

IModelMethod

IKeyEnumerator

IRawEnumerator

IModelKeyReference / IModelKeyReference2

Rozhraní konceptů

IStringDisplayableConcept

IIterableConcept

IIndexableConcept

IPreferredRuntimeTypeConcept

IDataModelConcept

IDynamicKeyProviderConcept

IDynamicConceptProviderConcept

Správa datových modelů a rozšiřitelnosti

Správce datových modelů je základní komponenta, která spravuje způsob, jakým probíhá veškerá rozšiřitelnost. Jedná se o centrální úložiště sady tabulek, které mapují oba nativní typy na body rozšíření i syntetické konstrukty na body rozšíření. Kromě toho je to entita, která je zodpovědná za boxování objektů (převod řadových hodnot nebo řetězců na objekty IModelObject).

Pro tuto kategorii jsou definována následující rozhraní:

Obecný přístup ke Správci datových modelů

IDataModelManager / IDataModelManager2

Správa skriptů

IDataModelScriptManager

IDataModelScriptProviderEnumerator

Přístup k systému typů ladicího programu a prostorům paměti

Základní systém typů a paměťové prostory ladicího programu jsou podrobně zpřístupněny pro rozšíření, která mohou být využita. Pro tuto kategorii jsou definována následující rozhraní:

Obecná rozhraní hostitele debuggeru

IDebugHost

IDebugHostStatus

IDebugHostContext

IDebugHostMemory / IDebugHostMemory2

IDebugHostErrorSink

IDebugHostEvaluator / IDebugHostEvaluator2

IDebugHostExtensibility

Hostitelský (ladicí program) typ systémových rozhraní

IDebugHostSymbols

IDebugHostSymbol / IDebugHostSymbol2

IDebugHostModule

IDebugHostType / IDebugHostType2

IDebugHostConstant

IDebugHostField

IDebugHostData

IDebugHostBaseClassIDebugHostPublic

IDebugHostModuleSignature

IDebugHostTypeSignature

Podpora hostitele (ladicího programu) pro skriptování

IDebugHostScriptHost

Vytváření a používání skriptů

Datový model má také obecný pojem o tom, co je skript a jak ho ladit. Rozšíření ladicího programu může být zcela možné a definovat obecný most mezi datovým modelem a jiným dynamickým jazykem (obvykle skriptovacím prostředím). Tato sada rozhraní je způsob, jak toho dosáhnout a jak může uživatelské rozhraní ladicího programu využívat tyto skripty.

Pro tuto kategorii jsou definována následující rozhraní:

Obecná rozhraní skriptů

IDataModelScriptProvider

IDataModelScript

IDataModelScriptClient

IDataModelScriptHostContext

IDataModelScriptTemplate

IDataModelScriptTemplateEnumerator

IDataModelNameBinder

Rozhraní ladicího programu skriptu

IDataModelScriptDebug

IDataModelScriptDebugClient

IDataModelScriptDebugStack

IDataModelScriptDebugStackFrame

IDataModelScriptDebugVariableSetEnumerator

IDataModelScriptDebugBreakpoint

IDataModelScriptDebugBreakpointEnumerator

Použití knihovny DbgModelClientEx

Přehled

Objektová rozhraní datového modelu C++ pro datový model mohou být velmi podrobná k implementaci. I když umožňují úplnou manipulaci s datovým modelem, vyžadují implementaci řady malých rozhraní k rozšíření datového modelu (např. implementace IModelPropertyAccessor pro každou dynamickou načístelnou vlastnost, která se přidá). Kromě toho programovací model založený na HRESULT přidává značné množství kódu kotlového plátu, který se používá ke kontrole chyb.

Aby bylo možné některé z těchto prací minimalizovat, existuje úplná pomocná knihovna jazyka C++ pro datový model, která používá úplnou výjimku jazyka C++ a programovací paradigma šablony. Použití této knihovny umožňuje stručnější kód při využívání nebo rozšíření datového modelu a doporučuje se.

V pomocné knihovně jsou dva důležité obory názvů:

Ladicí program::D ataModel::ClientEx – pomocné rutiny pro spotřebu datového modelu

Ladicí program::DataModel::ProviderEx – pomocné rutiny pro rozšíření datového modelu

Další informace o použití knihovny DbgModelClientEx najdete v souboru readme na tomto webu GitHubu:

https://github.com/Microsoft/WinDbg-Libraries/tree/master/DbgModelCppLib

Ukázka HelloWorld C++

Pokud chcete zjistit, jak se dá použít knihovna DbgModelClientEx, projděte si ukázku HelloWorld C++ datového modelu.

https://github.com/Microsoft/WinDbg-Samples/tree/master/DataModelHelloWorld

Ukázka zahrnuje:

  • HelloProvider.cpp - Jedná se o implementaci třídy zprostředkovatele, která přidá novou ukázkovou vlastnost "Hello" do koncepce procesu v ladicím programu.

  • SimpleIntroExtension.cpp - Toto je jednoduché rozšíření ladicího programu, které přidá novou příkladovou vlastnost "Hello" do pojmu procesu ladicího programu. Toto rozšíření je napsáno s využitím knihovny Helper pro datový model C++17. Je mnohem vhodnější psát rozšíření na základě této knihovny vzhledem k množství (a složitosti) lepicího kódu, který je nutný, než vůči neopracovanému COM ABI.

Ukázky JavaScriptu a modelu COM

Aby bylo možné lépe porozumět různým způsobům zápisu rozšíření ladicího programu s datovým modelem, jsou zde k dispozici tři verze rozšíření HelloWorld datového modelu:

https://github.com/Microsoft/WinDbg-Samples/tree/master/DataModelHelloWorld

  • JavaScript – verze napsaná v JavaScriptu

  • C++17 – verze vyvinutá pro použití s klientskou knihovnou C++17 datového modelu

  • COM – verze napsaná proti nezpracovaným modelu COM ABI (pouze pomocí knihovny WRL pro pomocné rutiny MODELU COM)


Viz také

Rozhraní C++ datového modelu ladicího programu

Objekty C++ datového modelu ladicího programu

Další rozhraní datového modelu ladicího programu C++

Koncepty datového modelu C++ ladicího programu

skriptování datového modelu Ladicího programu C++