共用方式為


調試程序數據模型C++概觀

本主題提供如何使用調試程序數據模型C++介面來擴充和自定義調試程式功能的概觀。

本主題是一系列的一部分,描述可從C++存取的介面、如何使用它們來建置以C++為基礎的調試程式延伸模組,以及如何從C++數據模型延伸模組使用其他數據模型建構(例如:JavaScript 或 NatVis)。

調試程序數據模型C++介面

調試程序數據模型C++物件

調試程序數據模型C++其他介面

調試程序數據模型C++概念

調試程序數據模型C++腳本


調試程序數據模型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,這是用來操作物件的通用物件模型。
  • 在中心是用來儲存和存取值的 金鑰存放區
  • 底部會顯示支援功能的物件 的概念 ,例如能夠轉換成可顯示字串或編製索引。

顯示以IModelObject 作為輸入和 Tuple 金鑰存放區之數據模型架構的圖表。

數據模型:使用者檢視

下圖顯示數據模型的使用者視圖。 在範例中, dx (顯示調試程序物件模型表示式) 命令正用來查詢資訊。

  • Dx 命令會透過串行化程式與物件列舉介面進行通訊。
  • IDebugHost* 物件可用來從調試程式引擎收集資訊。
  • 表達式和語意評估工具可用來將要求傳送至調試程序引擎。

顯示資料模型架構的圖表,其中UI匯入評估器,評估器再連接至IDebugHost。

數據模型:產生者檢視

此圖表顯示資料模型的生產者視角。

  • NatVis 提供者會顯示在左側,其會取用定義其他功能的 XML。
  • JavaScript 提供者可以利用 動態提供者概念 來即時處理資訊。
  • 底部會顯示原生程式代碼提供者,也可以定義其他功能。

此圖顯示已連線至 NatVis、JavaScript 和原生程式代碼取用者之 IModelObject 的數據模型架構。

數據模型管理員

此圖顯示數據模型管理員在物件管理中扮演的核心角色。

  • 數據模型管理員可作為所有物件的中央註冊機構。
  • 左側會顯示註冊會話和進程等標準調試程序元素的方式。
  • 命名空間區塊會顯示集中註冊清單。
  • 圖表右側顯示兩個提供者,一個位於上方用於 NatVis,另一個位於下方是 C/C++ 的延伸模組。

顯示數據模型架構的圖表,其中包含數據模型管理員正在存取的已註冊名稱。

調試程序數據模型介面的摘要

有許多C++介面組成不同數據模型片段。 為了以一致且容易的方式處理這些介面,它們會依一般類別細分。 這裡的主要區域:

一般物件模型

第一組最重要的介面會定義如何存取核心數據模型,以及如何存取和操作物件。 IModelObject 是介面,代表數據模型中的每一個物件(就像 C# 的物件一樣)。 這是數據模型的取用者和產生者感興趣的主要介面。 其他介面是存取物件不同層面的機制。 此類別定義了下列介面:

DbgEng 與數據模型之間的網橋

IHostDataModelAccess

主要介面

IModelObject

IKeyStore

IModelIterator

IModelPropertyAccessor

IModelMethod

IKeyEnumerator

IRawEnumerator

IModelKeyReference / IModelKeyReference2

概念介面

IStringDisplayableConcept

IIterableConcept

IIndexableConcept

IPreferredRuntimeTypeConcept

IDataModelConcept

IDynamicKeyProviderConcept

IDynamicConceptProviderConcept

管理數據模型和擴充性

數據模型管理員是管理所有擴充性發生方式的核心元件。 它是一組數據表的中央存放庫,會將原生類型對應至延伸點,以及將綜合建構對應至延伸點。 此外,它是負責將物件封箱(將序數值或字串轉換成 IModelObject)的實體。

此類別定義了下列介面:

一般數據模型管理員存取

IDataModelManager / IDataModelManager2

腳本管理

IDataModelScriptManager

IDataModelScriptProviderEnumerator

存取調試程式的型別系統和記憶體空間

調試程式的基礎類型系統和記憶體空間會詳細公開,以供延伸模組使用。 此類別定義了下列介面:

一般主機 (調試程式) 介面

IDebugHost

IDebugHostStatus

IDebugHostContext

IDebugHostMemory / IDebugHostMemory2

IDebugHostErrorSink

IDebugHostEvaluator / IDebugHostEvaluator2

IDebugHostExtensibility

主機 (調試程式) 類型系統介面

IDebugHostSymbols

IDebugHostSymbol / IDebugHostSymbol2

IDebugHostModule

IDebugHostType / IDebugHostType2

IDebugHostConstant

IDebugHostField

IDebugHostData

IDebugHostBaseClassIDebugHostPublic

IDebugHostModuleSignature

IDebugHostTypeSignature

主機(除錯器)腳本支援

IDebugHostScriptHost

撰寫和取用腳本

數據模型也有腳本的一般概念,以及如何偵錯腳本。 偵錯工具的擴充套件完全有可能出現,並在資料模型與另一種動態語言(通常是腳本環境)之間定義一般橋樑。 這組介面是用來實現這個目的的,同時也說明調試器 UI 如何利用這類腳本。

此類別定義了下列介面:

一般腳本介面

IDataModelScriptProvider

IDataModelScript

IDataModelScriptClient

IDataModelScriptHostContext

IDataModelScriptTemplate

IDataModelScript模板列舉器

IDataModelNameBinder

腳本調試程式介面

IDataModelScriptDebug

IDataModelScriptDebugClient

IDataModelScriptDebugStack

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)


另請參閱

調試程序數據模型C++介面

調試程序數據模型C++物件

調試程序數據模型C++其他介面

調試程序數據模型C++概念

調試程序數據模型C++腳本