Megosztás a következőn keresztül:


Hibakereső adatmodell C++ áttekintése

Ez a témakör áttekintést nyújt arról, hogyan használható a Hibakereső adatmodell C++ interfésze a hibakereső képességeinek kibővítésére és testreszabására.

Ez a témakör egy olyan sorozat része, amely leírja a C++-ból elérhető felületeket, a C++ alapú hibakeresőbővítmények készítésének módját, valamint azt, hogy miként használhat más adatmodell-szerkezeteket (pl. JavaScript vagy NatVis) egy C++ adatmodell-bővítményből.

Hibakereső adatmodell C++ interfészei

Hibakereső adatmodell C++ objektumai

Hibakereső adatmodell C++ további felületei

Hibakereső adatmodell C++ fogalmai

Hibakereső adatmodell C++ szkriptelése


A hibakereső adatmodell C++ felületének áttekintése

A hibakereső adatmodell egy bővíthető objektummodell, amely központi szerepet vállal abban, hogy az új hibakereső bővítmények (beleértve a JavaScriptben, a NatVisben és a C++-ban találhatóakat) egyaránt felhasználják a hibakeresőtől származó információkat, és olyan információkat hoznak létre, amelyek a hibakeresőből és más bővítményekből is elérhetők. Az adatmodell API-jaiba írt szerkezetek a hibakereső újabb (dx) kifejezéskiértékelésében, valamint JavaScript-bővítményekből vagy C++ bővítményekből érhetők el.

A hibakereső adatmodell céljainak szemléltetéséhez vegye figyelembe ezt a hagyományos hibakereső parancsot.

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

A hibakereső parancs bináris maszkot használ, és csak nem szabványos módon biztosít szöveges kimenetet. A szöveges kimenetet nehéz felhasználni, formázni vagy kiterjeszteni, és az elrendezés erre a parancsra jellemző.

Ezzel szemben a hibakereső adatmodell dx (Display Debugger Object Model Expression) parancsa.

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

Ez a parancs egy szabványos adatmodellt használ, amely egységes módon felderíthető, bővíthető és összeállítható.

A térközök logikai elnevezése és adott objektumokra való kiterjesztése lehetővé teszi a hibakereső bővítmény funkcióinak felderítését.

Jótanács

Annak érdekében, hogy a lehető legteljesebben kihasználjuk az adatmodell C++ objektumfelületeinek részletességét, ajánlott egy teljes C++ segédkönyvtárat implementálni az adatmodellhez, amely a teljes C++ kivételkezelést és a sablonprogramozási paradigmát alkalmazza. További információért olvashatja A DbgModelClientEx könyvtár használata a témakör későbbi részében.

Az adatmodell az, ahogyan a WinDbg a legtöbb dolgot megjeleníti. Az új felhasználói felület számos eleme lekérdezhető, bővíthető vagy szkriptelhető, mivel az adatmodell hajtja őket. További információ: WinDbg – Adatmodell.

Képernyőkép az adatmodell folyamatokat és szálakat megjelenítő ablakáról.

Adatmodell architekturális nézete

Az alábbi ábra a hibakereső adatmodell architektúrájának főbb elemeit foglalja össze.

  • A bal oldalon megjelennek az olyan felhasználói felületi elemek, amelyek hozzáférést biztosítanak az objektumokhoz, és támogatják az olyan funkciókat, mint a LINQ-lekérdezések.
  • A diagram jobb oldalán olyan összetevők találhatók, amelyek adatokat szolgáltatnak az adatmodell hibakereséséhez. Ide tartoznak az egyéni NatVis-, JavaScript- és C++ hibakereső adatmodell-bővítmények.

Egy diagram, amely az adatmodell felépítését mutatja, középen a közös objektummodellel, és a jobb oldalon a szolgáltatókkal.

Objektummodell

A Hibakereső adatmodell középpontjában egy egységes objektumábrázolás látható, amelyben minden az IModelObject felület egy példánya. Bár egy ilyen objektum belső (pl. egész szám) vagy más adatmodell-interfészt jelölhet, gyakran egy dinamikus objektumot jelöl – a kulcs-/érték-/metaadat-vonások szótárát és az absztrakt viselkedést leíró fogalmak készletét.

Ez az ábra bemutatja, hogy az IModelObject hogyan használja a kulcstárolókat olyan értékek tárolására, amelyeket a szolgáltató létrehozhat, regisztrálhat és kezelhet.

  • Egy szolgáltatót jelenít meg, amely információkat biztosít az objektummodell számára
  • A bal oldalon az IModelObject látható, amely az objektumok manipulálására használt általános objektummodell.
  • A központban található az értékek tárolására és elérésére szolgáló kulcstároló .
  • Alul azokat a fogalmakat jeleníti meg, amelyek olyan funkciókkal támogatják az objektumokat, mint a megjeleníthető sztringgé alakítás vagy indexelhetőség.

Diagram, amely az adatmodell architektúráját mutatja be az IModelObject bemenetként és egy kulcstartó tárolóval.

Az adatmodell: Fogyasztói nézet

A következő ábrán az adatmodell fogyasztói nézete látható. A példában a dx (Display Debugger Object Model Expression) paranccsal kérdezhetők le az adatok.

  • A Dx parancs szerializálón keresztül kommunikál az objektum-enumerálási felülettel.
  • Az IDebugHost* objektumokkal információkat gyűjthet a hibakereső motorról.
  • A kifejezés- és szemantikai kiértékelők a kérelmet a hibakereső motornak küldik el.

Az IDebugHosthoz csatlakozó kiértékelőkbe betápláló felhasználói felülettel rendelkező adatmodell-architektúrát bemutató ábra.

Az adatmodell: Gyártói nézet

Ez az ábra az adatmodell gyártói nézetét mutatja be.

  • A bal oldalon megjelenik egy NatVis-szolgáltató, amely további funkciókat definiáló XML-t használ.
  • A JavaScript-szolgáltatók kihasználhatják a dinamikus szolgáltatói fogalmakat az információk valós idejű manipulálásához.
  • Az alsó részen egy natív kódszolgáltató látható, amely további funkciókat is meghatározhat.

A NatVishez, JavaScripthez és natív kódfelhasználókhoz csatlakoztatott IModelObject adatmodell-architektúrát bemutató ábra.

Adatmodell Menedzser

Ez az ábra azt a központi szerepet mutatja be, amelyet az adatmodell-kezelő játszik az objektumok kezelésében.

  • Az Adatmodell-kezelő minden objektum központi regisztrálójaként működik.
  • A bal oldalon a szabványos hibakereső elemek, például a munkamenetek és a folyamat regisztrálása látható.
  • A névtérblokk a központi regisztrációs listát jeleníti meg.
  • A diagram jobb oldalán két szolgáltató látható, a tetején egy NatVis, alul pedig egy C/C++ kiterjesztés.

Az adatmodell architektúráját ábrázoló ábra, amelyen az adatmodell-kezelő regisztrált neveket használ.

A hibakereső adatmodell-interfészeinek összegzése

Számos C++ interfész létezik, amelyek az adatmodell különböző részeit alkotják. Az interfészek egységes és egyszerű megközelítése érdekében általános kategóriák szerint vannak lebontva. A fő területek itt:

Az általános objektummodell

Az első és legfontosabb interfészkészlet határozza meg, hogyan férhet hozzá az alapvető adatmodellhez, és hogyan érheti el és kezelheti az objektumokat. Az IModelObject az az interfész, amely az adatmodell minden objektumát képviseli (hasonlóan a C#objektumához). Ez az adatmodell felhasználói és gyártói számára is ez a fő érdeklődési felület. A többi interfész az objektumok különböző aspektusainak elérésére szolgáló mechanizmusok. A következő interfészek vannak definiálva ehhez a kategóriához:

Hidak a DbgEng és az adatmodell között

IHostDataModelAccess

Fő interfészek

IModelObject

IKeyStore

IModelIterator

IModelPropertyAccessor

IModelMethod

IKeyEnumerator

IRawEnumerator

IModelKeyReference / IModelKeyReference2

Concept Interfaces

IStringDisplayableConcept

IIterableConcept

IIndexableConcept

IPreferredRuntimeTypeConcept

IDataModelConcept

IDynamicKeyProviderConcept

IDynamicConceptProviderConcept

Adatmodellek és bővíthetőség kezelése

Az Adatmodell-kezelő az a fő összetevő, amely az összes bővíthetőséget kezeli. Ez egy táblakészlet központi adattára, amely mindkét natív típust bővítménypontokra, valamint szintetikus szerkezeteket mellékpontokra képez le. Emellett ez az entitás felelős az objektumok dobozolásáért (az ordinális értékek vagy sztringek IModelObject-ekké alakítása).

A következő interfészek vannak definiálva ehhez a kategóriához:

Általános Adatmodell-kezelő hozzáférés

IDataModelManager / IDataModelManager2

Szkriptkezelés

IDataModelScriptManager

IDataModelScriptProviderEnumerator

Hozzáférés a hibakereső típusrendszeréhez és memóriatereihez

A hibakereső mögöttes típusrendszere és memóriaterei részletesen ki vannak téve a bővítmények használatához. A következő interfészek vannak definiálva ehhez a kategóriához:

Általános gazdagép (nyomkövető) felületek

IDebugHost

IDebugHostStatus

IDebugHostContext

IDebugHostMemory / IDebugHostMemory2

IDebugHostErrorSink

IDebugHostEvaluator / IDebugHostEvaluator2

IDebugHostExtensibility

Gazda (Hibakereső) Típus Rendszer Felületek

IDebugHostSymbols

IDebugHostSymbol / IDebugHostSymbol2

IDebugHostModule

IDebugHostType / IDebugHostType2

IDebugHostConstant

IDebugHostField

IDebugHostData

IDebugHostBaseClassIDebugHostPublic

IDebugHostModuleSignature

IDebugHostTypeSignature

Gazdagép (hibakereső) támogatása a szkripteléshez

IDebugHostScriptHost

Szkriptek létrehozása és használata

Az adatmodell általános fogalma is van arról, hogy mi az a szkript, és hogyan lehet hibakeresést végezni. Teljes mértékben lehetséges, hogy egy hibakereső bővítmény végighaladjon, és meghatározzon egy általános hidat az adatmodell és egy másik dinamikus nyelv (általában egy szkriptelési környezet) között. Ez a felületkészlet az, ahogyan ezt el lehet végezni, valamint azt, hogy a hibakereső felhasználói felülete hogyan használhatja ezeket a szkripteket.

A következő interfészek vannak definiálva ehhez a kategóriához:

Általános szkriptfelületek

IDataModelScriptProvider

IDataModelScript

IDataModelScriptClient

IDataModelScriptHostContext

IDataModelScriptTemplate

IDataModelScriptTemplateEnumerator

IDataModelNameBinder

Szkript hibakereső felületei

IDataModelScriptDebug

IDataModelScriptDebugClient

IDataModelScriptDebugStack

IDataModelScriptDebugStackFrame

IDataModelScriptDebugVariableSetEnumerator

IDataModelScriptDebugBreakpoint

IDataModelScriptDebugBreakpointEnumerator

A DbgModelClientEx könyvtár használata

Áttekintés

Az adatmodell C++ objektuminterfészeinek implementálása igen terjengős lehet. Bár lehetővé teszik az adatmodell teljes kezelését, az adatmodell kibővítéséhez számos kis felület implementálására van szükség (például minden hozzáadott dinamikus lekéréses tulajdonsághoz IModelPropertyAccessor-implementáció). Emellett a HRESULT-alapú programozási modell jelentős mennyiségű, hibaellenőrzéshez használt kazánlemez-kódot ad hozzá.

A munka egy részének minimalizálása érdekében teljes C++ segédkönyvtár áll rendelkezésre az adatmodellhez, amely teljes C++ kivételt és sablonprogramozási paradigmát használ. A kódtár használata tömörebb kódot tesz lehetővé az adatmodell használatakor vagy kiterjesztésekor, és ajánlott.

A segédtárban két fontos névtér található:

Hibakereső::D ataModel::ClientEx – segítők az adatmodell használatához

Debugger::DataModel::ProviderEx – a data model kiterjesztésének segédeszközei

A DbgModelClientEx kódtár használatával kapcsolatos további információkért tekintse meg az olvasófájlt ezen a GitHub-webhelyen:

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

HelloWorld C++ minta

A DbgModelClientEx kódtár használatáról itt tekintheti meg a HelloWorld C++ adatmodellt.

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

A minta a következőket tartalmazza:

  • HelloProvider.cpp – Ez egy olyan szolgáltatói osztály implementációja, amely hozzáad egy új "Hello" példatulajdonságot a hibakereső folyamat fogalmához.

  • SimpleIntroExtension.cpp – Ez egy egyszerű hibakereső bővítmény, amely hozzáad egy új "Hello" példatulajdonságot a hibakereső folyamat fogalmához. Ez a bővítmény a C++17 adatmodell segédkönyvtárára van írva. A szükséges ragasztókód mennyisége (és összetettsége) miatt sokkal előnyösebb a bővítmények írása erre a kódtárra a nyers COM ABI helyett.

JavaScript- és COM-minták

Annak érdekében, hogy jobban megértse a hibakereső bővítmény adatmodellel való írásának különböző módjait, az adatmodell HelloWorld bővítményének három verziója érhető el itt:

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

  • JavaScript – JavaScriptben írt verzió

  • C++17 - A C++17 adatmodell klientkönyvtárhoz írt verzió

  • COM – A nyers COM ABI-ra írt verzió (csak a WRL használata COM-segítők számára)


Lásd még:

Hibakereső adatmodell C++ interfészei

Hibakereső adatmodell C++ objektumai

Hibakereső adatmodell C++ további felületei

Hibakereső adatmodell C++ fogalmai

Hibakereső adatmodell C++ szkriptelése