共用方式為


偵錯工具資料模型 C++ 概觀

本主題提供如何使用偵錯工具資料模型 C++ 介面擴充和自訂偵錯工具功能的概觀。

本主題是一系列中的一部分,描述可從 C++ 存取的介面、如何使用它們來建置以 C++ 為基礎的偵錯工具延伸模組,以及如何利用其他資料模型建構 (例如:C++ 資料模型延伸模組的 JavaScript 或 NatVis) 。

偵錯工具資料模型 C++ 概觀

偵錯工具資料模型 C++ 介面

偵錯工具資料模型 C++ 物件

偵錯工具資料模型 C++ 其他介面

偵錯工具資料模型 C++ 概念

偵錯工具資料模型 C++ 腳本


偵錯工具資料模型 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,也就是用來操作物件的通用物件模型。
  • 在中央是用來儲存和存取值的 金鑰存放區
  • 其底部會顯示支援具有功能的物件 的概念 ,例如轉換成可顯示字串或編制索引的能力。

此圖顯示具有 IModelObject 作為輸入和 Tuple 金鑰存放區的資料模型架構。

資料模型:取用者檢視

下圖顯示資料模型的取用者檢視。 在範例中, 會使用 dx (Display Debugger Object Model Expression) 命令來查詢資訊。

  • 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) (物件 boxing 的實體。

此類別定義下列介面:

一般資料模型管理員存取

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

IDataModelScriptTemplateEnumerator

IDataModelNameBinder

腳本偵錯工具介面

IDataModelScriptDebug

IDataModelScriptDebugClient

IDataModelScriptDebugStack

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)


另請參閱

偵錯工具資料模型 C++ 介面

偵錯工具資料模型 C++ 物件

偵錯工具資料模型 C++ 其他介面

偵錯工具資料模型 C++ 概念

偵錯工具資料模型 C++ 腳本