偵錯工具資料模型 C++ 概觀
本主題提供如何使用偵錯工具資料模型 C++ 介面擴充和自訂偵錯工具功能的概觀。
本主題是一系列中的一部分,描述可從 C++ 存取的介面、如何使用它們來建置以 C++ 為基礎的偵錯工具延伸模組,以及如何利用其他資料模型建構 (例如:C++ 資料模型延伸模組的 JavaScript 或 NatVis) 。
偵錯工具資料模型 C++ 介面的概觀
偵錯工具資料模型是可延伸的物件模型,其中心在於新的偵錯工具延伸模組 (包括 JavaScript、NatVis 和 C++ 中的延伸模組,) 兩者都會取用偵錯工具的資訊,並產生可從偵錯工具存取的資訊以及其他延伸模組。 寫入資料模型 API 的建構可在偵錯工具的較新 (dx) 運算式評估工具以及 JavaScript 延伸模組或 C++ 延伸模組中取得。
若要說明偵錯工具資料模型的目標,請考慮此傳統偵錯工具命令。
0: kd> !process 0 0
PROCESS ffffe0007e6a7780
SessionId: 1 Cid: 0f68 Peb: 7ff7cfe7a000 ParentCid: 0f34
DirBase: 1f7fb9000 ObjectTable: ffffc001cec82780 HandleCount: 34.
Image: echoapp.exe
...
偵錯工具命令使用二進位遮罩,而且它只以非標準方式提供文字輸出。 文字輸出很難取用、格式化或擴充,而且配置是這個命令特有的。
將此與偵錯工具資料模型 dx (顯示偵錯工具物件模型運算式) 命令對比。
dx @$cursession.Processes.Where(p => p.Threads.Count() > 5)
此命令會使用標準資料模型,以統一的方式探索、可擴充且可組合。
邏輯上將專案命名為間距,並在特定物件上延伸,可讓您探索偵錯工具擴充功能。
提示
由於建議針對使用完整 C++ 例外狀況和範本程式設計範例的資料模型實作完整的 C++ 協助程式程式庫,因此資料模型 C++ 物件介面可能非常詳細。 如需詳細資訊,請參閱本主題稍後 的使用 DbgModelClientEx 程式庫 。
資料模型是 WinDbg顯示大部分專案的方式。 新 UI 中的許多元素都可以查詢、擴充或編寫腳本,因為它們是由資料模型所提供。 如需詳細資訊,請參閱 WinDbg - 資料模型。
資料模型架構檢視
下圖摘要說明偵錯工具資料模型架構的主要元素。
- 左側會顯示 UI 元素,提供物件的存取權,並支援 LINQ 查詢等功能。
- 圖表右側是提供資料給偵錯工具資料模型的元件。 這包括自訂 NatVis、JavaScript 和 C++ 偵錯工具資料模型延伸模組。
物件模型
偵錯工具資料模型的中央是統一物件標記法,其中所有專案都是 IModelObject 介面的實例。 雖然這類物件可能代表內建 (例如:整數值) 或其他資料模型介面,但它通常代表動態物件 – 索引鍵/值/中繼資料元組的字典,以及一組描述抽象行為的概念。
此圖顯示 IModelObject 如何使用金鑰存放區來包含提供者可以建立、註冊及操作的值。
- 它會顯示 提供者,提供物件模型的資訊
- 左邊會顯示 IModelObject,也就是用來操作物件的通用物件模型。
- 在中央是用來儲存和存取值的 金鑰存放區 。
- 其底部會顯示支援具有功能的物件 的概念 ,例如轉換成可顯示字串或編制索引的能力。
資料模型:取用者檢視
下圖顯示資料模型的取用者檢視。 在範例中, 會使用 dx (Display Debugger Object Model Expression) 命令來查詢資訊。
- Dx 命令會透過序列化程式與物件列舉介面進行通訊。
- IDebugHost* 物件可用來收集偵錯工具引擎的資訊。
- 運算式和語意評估工具可用來將要求傳送至偵錯工具引擎。
資料模型:產生者檢視
下圖顯示資料模型的產生者檢視。
- NatVis 提供者會顯示在左側,其會取用定義其他功能的 XML。
- JavaScript 提供者可以利用 動態提供者概念 來即時操作資訊。
- 底部會顯示也可以定義其他功能的機器碼提供者。
資料模型管理員
下圖顯示資料模型管理員在物件管理中扮演的中央角色。
- 資料模型管理員可作為所有物件的中央註冊機構。
- 左側會顯示如何註冊標準偵錯工具專案,例如會話和進程。
- 命名空間區塊會顯示中央註冊清單。
- 圖表右側顯示兩個提供者,一個用於頂端的 NatVis,另一個是底部的 C/C++ 延伸模組。
偵錯工具資料模型介面的摘要
有許多 C++ 介面組成不同的資料模型片段。 為了以一致且簡單的方式處理這些介面,它們會依一般類別細分。 此處的主要區域:
一般物件模型
第一組最重要的介面會定義如何存取核心資料模型,以及如何存取及操作物件。 IModelObject 是介面,代表資料模型中的每個物件, (與 C# 的物件) 非常類似。 這是資料模型的取用者和產生者感興趣的主要介面。 其他介面是存取物件不同層面的機制。 此類別定義下列介面:
DbgEng 與資料模型之間的橋接器
主要介面
IModelKeyReference / IModelKeyReference2
概念介面
IDynamicConceptProviderConcept
管理資料模型和擴充性
資料模型管理員是管理所有擴充性發生方式的核心元件。 它是一組資料表的中央存放庫,其會將原生類型對應至擴充點,以及將綜合建構對應至擴充點。 此外,它是負責將序數值或字串轉換成 IModelObject) (物件 boxing 的實體。
此類別定義下列介面:
一般資料模型管理員存取
IDataModelManager / IDataModelManager2
腳本管理
IDataModelScriptProviderEnumerator
存取偵錯工具的類型系統和記憶體空間
偵錯工具的基礎類型系統和記憶體空間會詳細公開,以供擴充功能使用。 此類別定義下列介面:
一般主機 (偵錯工具) 介面
IDebugHostMemory / IDebugHostMemory2
IDebugHostEvaluator / IDebugHostEvaluator2
主機 (偵錯工具) 類型系統介面
IDebugHostSymbol / IDebugHostSymbol2
IDebugHostType / IDebugHostType2
IDebugHostBaseClassIDebugHostPublic
主機 (偵錯工具) 腳本支援
撰寫和使用腳本
資料模型也有腳本是什麼以及如何偵錯腳本的一般概念。 偵錯工具延伸模組完全可以搭配使用,並定義資料模型與另一個動態語言之間的一般橋接器, (通常是腳本環境) 。 這組介面是如何完成的,以及偵錯工具 UI 如何使用這類腳本。
此類別定義下列介面:
一般指令碼介面
IDataModelScriptTemplateEnumerator
腳本偵錯工具介面
IDataModelScriptDebugStackFrame
IDataModelScriptDebugVariableSetEnumerator
IDataModelScriptDebugBreakpoint
IDataModelScriptDebugBreakpointEnumerator
使用 DbgModelClientEx Library
概觀
資料模型 C++ 物件介面對資料模型的實作可能非常詳細。 雖然它們允許完全操作資料模型,但需要實作一些小型介面來擴充資料模型 (例如:每個新增) 的動態可擷取屬性的 IModelPropertyAccessor 實作。 此外,HRESULT 型程式設計模型還會新增大量用於錯誤檢查的未定型分板程式碼。
為了將部分工作降到最低,資料模型會有完整的 C++ 協助程式程式庫,其使用完整的 C++ 例外狀況和範本程式設計範例。 使用此程式庫可在取用或擴充資料模型時提供更精簡的程式碼,並建議使用。
協助程式程式庫中有兩個重要命名空間:
Debugger::D ataModel::ClientEx - 用於取用資料模型的協助程式
Debugger::D ataModel::P roviderEx - 擴充資料模型的協助程式
如需使用 DbgModelClientEx 程式庫的其他資訊,請參閱此 github 網站上的讀我檔案:
https://github.com/Microsoft/WinDbg-Libraries/tree/master/DbgModelCppLib
HelloWorld C++ 範例
若要查看如何使用 DbgModelClientEx 程式庫,請在這裡檢閱 Data Model HelloWorld C++ 範例。
https://github.com/Microsoft/WinDbg-Samples/tree/master/DataModelHelloWorld
此範例包括:
HelloProvider.cpp - 這是提供者類別的實作,會將新的範例屬性 「Hello」 新增至偵錯工具的處理常式概念。
SimpleIntroExtension.cpp - 這是簡單的偵錯工具延伸模組,可將新的範例屬性 「Hello」 新增至偵錯工具的處理常式概念。 此延伸模組是針對資料模型 C++17 協助程式程式庫所撰寫。 最好是針對此程式庫撰寫延伸模組,而不是原始 COM ABI,因為需要黏附程式碼的磁片區 (和複雜度) 。
JavaScript 和 COM 範例
為了進一步瞭解以資料模型撰寫偵錯工具延伸模組的不同方式,以下提供三個版本的資料模型 HelloWorld 延伸模組:
https://github.com/Microsoft/WinDbg-Samples/tree/master/DataModelHelloWorld
JavaScript - 以 JavaScript 撰寫的版本
C++17 - 針對資料模型 C++17 用戶端程式庫撰寫的版本
COM - 針對原始 COM ABI 所撰寫的版本 (僅針對 COM 協助程式使用 WRL)