本主題提供如何使用調試程序數據模型C++介面來擴充和自定義調試程式功能的概觀。
本主題是一系列的一部分,描述可從C++存取的介面、如何使用它們來建置以C++為基礎的調試程式延伸模組,以及如何從C++數據模型延伸模組使用其他數據模型建構(例如:JavaScript 或 NatVis)。
調試程序數據模型C++介面概觀
調試程序數據模型是可延伸的物件模型,其核心在於新的調試程式延伸模組(包括 JavaScript、NatVis 和 C++ 中的擴充物件模型)會從調試程式取用資訊,併產生可從調試程式和其他延伸模組存取的資訊。 寫入到數據模型 API 的構件可用於調試器的新運算式評估工具,並且可透過 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 (顯示調試程序物件模型表示式) 命令正用來查詢資訊。
- Dx 命令會透過串行化程式與物件列舉介面進行通訊。
- IDebugHost* 物件可用來從調試程式引擎收集資訊。
- 表達式和語意評估工具可用來將要求傳送至調試程序引擎。
數據模型:產生者檢視
此圖表顯示資料模型的生產者視角。
- NatVis 提供者會顯示在左側,其會取用定義其他功能的 XML。
- JavaScript 提供者可以利用 動態提供者概念 來即時處理資訊。
- 底部會顯示原生程式代碼提供者,也可以定義其他功能。
數據模型管理員
此圖顯示數據模型管理員在物件管理中扮演的核心角色。
- 數據模型管理員可作為所有物件的中央註冊機構。
- 左側會顯示註冊會話和進程等標準調試程序元素的方式。
- 命名空間區塊會顯示集中註冊清單。
- 圖表右側顯示兩個提供者,一個位於上方用於 NatVis,另一個位於下方是 C/C++ 的延伸模組。
調試程序數據模型介面的摘要
有許多C++介面組成不同數據模型片段。 為了以一致且容易的方式處理這些介面,它們會依一般類別細分。 這裡的主要區域:
一般物件模型
第一組最重要的介面會定義如何存取核心數據模型,以及如何存取和操作物件。 IModelObject 是介面,代表數據模型中的每一個物件(就像 C# 的物件一樣)。 這是數據模型的取用者和產生者感興趣的主要介面。 其他介面是存取物件不同層面的機制。 此類別定義了下列介面:
DbgEng 與數據模型之間的網橋
主要介面
IModelKeyReference / IModelKeyReference2
概念介面
IDynamicConceptProviderConcept
管理數據模型和擴充性
數據模型管理員是管理所有擴充性發生方式的核心元件。 它是一組數據表的中央存放庫,會將原生類型對應至延伸點,以及將綜合建構對應至延伸點。 此外,它是負責將物件封箱(將序數值或字串轉換成 IModelObject)的實體。
此類別定義了下列介面:
一般數據模型管理員存取
IDataModelManager / IDataModelManager2
腳本管理
IDataModelScriptProviderEnumerator
存取調試程式的型別系統和記憶體空間
調試程式的基礎類型系統和記憶體空間會詳細公開,以供延伸模組使用。 此類別定義了下列介面:
一般主機 (調試程式) 介面
IDebugHostMemory / IDebugHostMemory2
IDebugHostEvaluator / IDebugHostEvaluator2
主機 (調試程式) 類型系統介面
IDebugHostSymbol / IDebugHostSymbol2
IDebugHostType / IDebugHostType2
IDebugHostBaseClassIDebugHostPublic
主機(除錯器)腳本支援
撰寫和取用腳本
數據模型也有腳本的一般概念,以及如何偵錯腳本。 偵錯工具的擴充套件完全有可能出現,並在資料模型與另一種動態語言(通常是腳本環境)之間定義一般橋樑。 這組介面是用來實現這個目的的,同時也說明調試器 UI 如何利用這類腳本。
此類別定義了下列介面:
一般腳本介面
腳本調試程式介面
IDataModelScriptDebugStackFrame
IDataModelScriptDebugVariableSetEnumerator
IDataModelScriptDebugBreakpoint
IDataModelScriptDebugBreakpointEnumerator
使用 DbgModelClientEx 程式庫
概觀
C++物件介面的數據模型在實作時可能會非常冗長。 雖然它們允許對數據模型進行完整操控,但需要實作一些小型介面以擴充數據模型(例如:對於每個新增的動態可擷取屬性,都需要一個 IModelPropertyAccessor 的實作)。 此外,HRESULT 型程式設計模型會新增大量用於錯誤檢查的鍋爐板程序代碼。
為了減少部分工作,資料模型有完整的C++輔助程式庫,其使用完整的C++例外處理和模板程式設計範式。 使用此連結庫可在取用或擴充數據模型時,提供更簡潔的程序代碼,並建議使用。
輔助程式庫中有兩個重要的命名空間:
Debugger::DataModel::ClientEx - 用於取用數據模型的協助程式
Debugger::DataModel::ProviderEx - 擴展資料模型的工具
如需有關使用 DbgModelClientEx 連結庫的其他資訊,請參閱此 github 網站的自述檔:
https://github.com/Microsoft/WinDbg-Libraries/tree/master/DbgModelCppLib
HelloWorld C++ 範例
若要查看如何使用 DbgModelClientEx 連結庫,請在這裡檢閱數據模型 HelloWorld C++範例。
https://github.com/Microsoft/WinDbg-Samples/tree/master/DataModelHelloWorld
此範例包括:
HelloProvider.cpp - 這是提供者類別的實作,新增了一個名為「Hello」的新範例屬性到調試器對處理程序的概念中。
SimpleIntroExtension.cpp - 這是簡單的調試程式延伸模組,會將新的範例屬性 「Hello」 新增至調試程式的概念。 此擴充套件是針對 Data Model 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)