Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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.
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++.
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.
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.
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.
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++.
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
Hlavní rozhraní
IModelKeyReference / IModelKeyReference2
Rozhraní konceptů
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ů
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
IDebugHostMemory / IDebugHostMemory2
IDebugHostEvaluator / IDebugHostEvaluator2
Hostitelský (ladicí program) typ systémových rozhraní
IDebugHostSymbol / IDebugHostSymbol2
IDebugHostType / IDebugHostType2
IDebugHostBaseClassIDebugHostPublic
Podpora hostitele (ladicího programu) pro skriptování
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ů
IDataModelScriptTemplateEnumerator
Rozhraní ladicího programu skriptu
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++