Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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.
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.
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.
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 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.
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.
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
Fő interfészek
IModelKeyReference / IModelKeyReference2
Concept Interfaces
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
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
IDebugHostMemory / IDebugHostMemory2
IDebugHostEvaluator / IDebugHostEvaluator2
Gazda (Hibakereső) Típus Rendszer Felületek
IDebugHostSymbol / IDebugHostSymbol2
IDebugHostType / IDebugHostType2
IDebugHostBaseClassIDebugHostPublic
Gazdagép (hibakereső) támogatása a szkripteléshez
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
IDataModelScriptTemplateEnumerator
Szkript hibakereső felületei
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