디버거 데이터 모델 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 - 데이터 모델을 참조하세요.

프로세스 및 스레드를 표시하는 데이터 모델 탐색 창의 스크린샷

데이터 모델 아키텍처 뷰

다음 다이어그램에서는 디버거 데이터 모델 아키텍처의 주요 요소를 요약합니다.

  • 왼쪽에는 개체에 대한 액세스를 제공하고 LINQ 쿼리와 같은 기능을 지원하는 UI 요소가 표시됩니다.
  • 다이어그램의 오른쪽에는 디버거 데이터 모델에 데이터를 제공하는 구성 요소가 있습니다. 여기에는 사용자 지정 NatVis, JavaScript 및 C++ 디버거 데이터 모델 확장이 포함됩니다.

중앙에 공통 개체 모델이 있고 오른쪽에 공급자가 있는 데이터 모델 아키텍처를 보여 주는 다이어그램

개체 모델

디버거 데이터 모델의 중심에는 모든 항목이 IModelObject 인터페이스의 instance 있는 균일한 개체 표현이 있습니다. 이러한 개체는 내장 개체(예: 정수 값) 또는 다른 데이터 모델 인터페이스를 나타낼 수 있지만 종종 동적 개체(키/값/메타데이터 튜플 사전 및 추상 동작을 설명하는 개념 집합)를 나타냅니다.

이 다이어그램은 IModelObject에서 키 저장소를 사용하여 공급자가 만들고 등록하고 조작할 수 있는 값을 포함하는 방법을 보여 주는 다이어그램입니다.

  • 개체 모델에 정보를 제공하는 공급자를 표시합니다.
  • 왼쪽에는 개체를 조작하는 데 사용되는 일반적인 개체 모델인 IModelObject가 표시됩니다.
  • 가운데에는 값을 저장하고 액세스하는 데 사용되는 키 저장소 가 있습니다.
  • 아래쪽에는 표시 가능한 문자열로 변환하거나 인덱싱할 수 있는 기능과 같은 기능이 있는 개체를 지원하는 개념 이 표시됩니다.

IModelObject를 입력 및 튜플 키 저장소로 사용하는 데이터 모델 아키텍처를 보여 주는 다이어그램

데이터 모델: 소비자 보기

다음 다이어그램은 데이터 모델의 소비자 보기를 보여줍니다. 예제에서는 dx(디버거 개체 모델 식 표시) 명령을 사용하여 정보를 쿼리합니다.

  • Dx 명령은 serializer를 통해 개체 열거형 인터페이스와 통신합니다.
  • IDebugHost* 개체는 디버거 엔진에서 정보를 수집하는 데 사용됩니다.
  • 식 및 의미 체계 계산기는 디버거 엔진에 요청을 보내는 데 사용됩니다.

IDebugHost에 연결하는 평가기에 UI가 공급되는 데이터 모델 아키텍처를 보여 주는 다이어그램

데이터 모델: 생산자 뷰

이 다이어그램은 데이터 모델의 생산자 뷰를 보여줍니다.

  • NatVis 공급자는 추가 기능을 정의하는 XML을 사용하는 왼쪽에 표시됩니다.
  • JavaScript 공급자는 동적 공급자 개념을 활용하여 실시간으로 정보를 조작할 수 있습니다.
  • 아래쪽에는 추가 기능을 정의할 수 있는 네이티브 코드 공급자가 표시됩니다.

IModelObject가 NatVis, JavaScript 및 네이티브 코드 소비자에 연결된 데이터 모델 아키텍처를 보여 주는 다이어그램

데이터 모델 관리자

이 다이어그램은 데이터 모델 관리자가 개체 관리에서 수행하는 중앙 역할을 보여줍니다.

  • 데이터 모델 관리자는 모든 개체에 대한 중앙 등록 기관 역할을 합니다.
  • 왼쪽에는 세션 및 프로세스와 같은 표준 디버거 요소가 등록되는 방법을 보여 줍니다.
  • 네임스페이스 블록은 중앙 등록 목록을 표시합니다.
  • 다이어그램의 오른쪽에는 상단의 NatVis용 공급자와 아래쪽에 C/C++ 확장의 두 공급자가 표시됩니다.

데이터 모델 관리자가 등록된 이름에 액세스하는 데이터 모델 아키텍처를 보여 주는 다이어그램

디버거 데이터 모델 인터페이스 요약

다양한 데이터 모델을 구성하는 다양한 C++ 인터페이스가 있습니다. 일관되고 쉬운 방식으로 이러한 인터페이스에 접근하기 위해 일반 범주별로 세분화됩니다. 기본 영역은 다음과 같습니다.

일반 개체 모델

첫 번째이자 가장 중요한 인터페이스 집합은 핵심 데이터 모델에 액세스하는 방법과 개체에 액세스하고 조작하는 방법을 정의합니다. IModelObject는 데이터 모델의 모든 개체를 나타내는 인터페이스입니다(C#의 개체와 유사). 이는 데이터 모델에 대한 소비자와 생산자 모두에게 관심 있는 기본 인터페이스입니다. 다른 인터페이스는 개체의 다양한 측면에 액세스하기 위한 메커니즘입니다. 이 범주에 대해 정의된 인터페이스는 다음과 같습니다.

DbgEng과 데이터 모델 간의 브리지

IHostDataModelAccess

기본 인터페이스

IModelObject

IKeyStore

IModelIterator

IModelPropertyAccessor

IModelMethod

IKeyEnumerator

IRawEnumerator

IModelKeyReference / IModelKeyReference2

개념 인터페이스

IStringDisplayableConcept

IIterableConcept

IIndexableConcept

IPreferredRuntimeTypeConcept

IDataModelConcept

IDynamicKeyProviderConcept

IDynamicConceptProviderConcept

데이터 모델 및 확장성 관리

데이터 모델 관리자는 모든 확장성이 발생하는 방식을 관리하는 핵심 구성 요소입니다. 네이티브 형식을 확장 지점에 매핑하고 가상 구문을 확장 지점에 매핑하는 테이블 집합의 중앙 리포지토리입니다. 또한 개체의 boxing을 담당하는 엔터티입니다(서수 값 또는 문자열을 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

IDataModelScriptTemplateEnumerator

IDataModelNameBinder

스크립트 디버거 인터페이스

IDataModelScriptDebug

IDataModelScriptDebugClient

IDataModelScriptDebugStack

IDataModelScriptDebugStackFrame

IDataModelScriptDebugVariableSetEnumerator

IDataModelScriptDebugBreakpoint

IDataModelScriptDebugBreakpointEnumerator

DbgModelClientEx 라이브러리 사용

개요

데이터 모델에 대한 데이터 모델 C++ 개체 인터페이스는 구현하기에 매우 세부적일 수 있습니다. 데이터 모델을 완전히 조작할 수 있지만 데이터 모델을 확장하려면 여러 개의 작은 인터페이스를 구현해야 합니다(예: 추가되는 각 동적 페치 가능한 속성에 대한 IModelPropertyAccessor 구현). 이 외에도 HRESULT 기반 프로그래밍 모델은 오류 검사에 사용되는 상당한 양의 보일러 플레이트 코드를 추가합니다.

이 작업의 일부를 최소화하기 위해 전체 C++ 예외 및 템플릿 프로그래밍 패러다임을 사용하는 데이터 모델에 대한 전체 C++ 도우미 라이브러리가 있습니다. 이 라이브러리를 사용하면 데이터 모델을 사용하거나 확장할 때 더 간결한 코드를 사용할 수 있으며 권장됩니다.

도우미 라이브러리에는 두 가지 중요한 네임스페이스가 있습니다.

디버거::D ataModel::ClientEx - 데이터 모델 사용 도우미

Debugger::D ataModel::P roviderEx - 데이터 모델 확장 도우미

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"를 추가하는 간단한 디버거 확장입니다. 이 확장은 데이터 모델 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++ 스크립팅