다음을 통해 공유


디버거 데이터 모델 C++ 인터페이스

이 항목에서는 디버거 데이터 모델 C++ 인터페이스를 사용하여 디버거의 기능을 확장하고 사용자 지정하는 방법에 대한 개요를 제공합니다.

디버거 데이터 모델 C++ 호스트 인터페이스

디버거 데이터 모델 호스트

디버거 데이터 모델은 다양한 컨텍스트에서 호스팅할 수 있는 구성 요소화된 시스템으로 설계되었습니다. 일반적으로 데이터 모델은 디버거 애플리케이션의 컨텍스트에서 호스트됩니다. 데이터 모델의 호스트가 되려면 디버거의 핵심 측면(대상 지정, 메모리 공간, 계산기, 기호 및 형식 시스템 등)을 노출하기 위해 여러 인터페이스를 구현해야 합니다. 이러한 인터페이스는 데이터 모델을 호스트하려는 모든 애플리케이션에서 구현되지만 핵심 데이터 모델과 데이터 모델과 상호 운용되는 모든 확장에서 사용됩니다.

핵심 인터페이스 집합은 다음과 같습니다.

인터페이스 이름 Description
IDebugHost 디버그 호스트에 대한 핵심 인터페이스입니다.
IDebugHostStatus 클라이언트가 호스트의 상태 쿼리할 수 있는 인터페이스입니다.
IDebugHostContext 호스트 내의 컨텍스트 추상화(예: 특정 대상, 특정 프로세스, 특정 주소 공간 등).
IDebugHostErrorSink 호스트 및 데이터 모델의 특정 부분에서 오류를 수신하기 위해 호출자가 구현한 인터페이스
IDebugHostEvaluator / IDebugHostEvaluator2 디버그 호스트의 식 계산기입니다.
IDebugHostExtensibility 호스트 또는 해당 부분(예: 식 계산기)의 기능을 확장하기 위한 인터페이스입니다.

형식 시스템 및 기호 인터페이스는 다음과 같습니다.

InterfaceName Description
IDebugHostSymbols 기호에 대한 액세스 및 해상도를 제공하는 핵심 인터페이스
IDebugHostSymbol / IDebugHostSymbol2 모든 종류의 단일 기호를 나타냅니다. 특정 기호는 이 인터페이스의 파생입니다.
IDebugHostModule 프로세스 내에 로드된 모듈을 나타냅니다. 이것은 일종의 기호입니다.
IDebugHostType / IDebugHostType2 네이티브/언어 형식을 나타냅니다.
IDebugHostConstant 기호 정보 내의 상수를 나타냅니다(예: C++의 형식이 아닌 템플릿 인수).
IDebugHostField 구조체 또는 클래스 내의 필드를 나타냅니다.
IDebugHostData 모듈 내의 데이터를 나타냅니다(구조체 또는 클래스 내에 있는 경우 IDebugHostField임).
IDebugHostBaseClass 기본 클래스를 나타냅니다.
IDebugHostPublic PDB의 publics 테이블 내에 있는 기호를 나타냅니다. 여기에는 연결된 형식 정보가 없습니다. 이름과 주소입니다.
IDebugHostModuleSignature 모듈 서명을 나타냅니다. 이름 및/또는 버전별로 모듈 집합과 일치하는 정의입니다.
IDebugHostTypeSignature 형식 시그니처를 나타냅니다. 모듈 및/또는 이름별로 형식 집합과 일치하는 정의입니다.

핵심 호스트 인터페이스: IDebugHost

IDebugHost 인터페이스는 모든 데이터 모델 호스트의 핵심 인터페이스입니다. 아래와 같이 정의됩니다.

DECLARE_INTERFACE_(IDebugHost, IUnknown)
{
    STDMETHOD(GetHostDefinedInterface)(_COM_Outptr_ IUnknown** hostUnk) PURE;
    STDMETHOD(GetCurrentContext)(_COM_Outptr_ IDebugHostContext** context) PURE;
    STDMETHOD(GetDefaultMetadata)(_COM_Outptr_ IKeyStore** defaultMetadataStore) PURE;
}

GetHostDefinedInterface

GetHostDefinedInterface 메서드는 지정된 호스트에 대해 호스트의 기본 프라이빗 인터페이스를 반환합니다. Windows용 디버깅 도구의 경우 여기에 반환된 인터페이스는 IDebugClient(IUnknown으로 캐스팅)입니다.

GetCurrentContext

GetCurrentContext 메서드는 디버거 호스트의 현재 상태를 나타내는 인터페이스를 반환합니다. 이 것의 정확한 의미는 호스트에 남아 있지만 일반적으로 디버그 호스트의 사용자 인터페이스에서 활성 상태인 세션, 프로세스 및 주소 공간과 같은 항목이 포함됩니다. 반환된 컨텍스트 개체는 호출자에게 대체로 불투명하지만 디버그 호스트에 대한 호출 간에 전달해야 하는 중요한 개체입니다. 호출자가 메모리를 읽는 instance 경우 메모리를 읽는 프로세스 및 주소 공간을 알아야 합니다. 이 개념은 이 메서드에서 반환되는 컨텍스트 개체의 개념으로 캡슐화됩니다.

GetDefaultMetadata

GetDefaultMetadata 메서드는 명시적 메타데이터가 전달되지 않은 경우 특정 작업(예: 문자열 변환)에 사용할 수 있는 기본 메타데이터 저장소를 반환합니다. 이렇게 하면 디버그 호스트가 일부 데이터가 표시되는 방식을 제어할 수 있습니다. 예를 들어 기본 메타데이터에는 PreferredRadix 키가 포함될 수 있으며, 그렇지 않으면 호스트가 서수를 10진수 또는 16진수로 표시할지 여부를 나타낼 수 있습니다.

기본 메타데이터 저장소의 속성 값은 수동으로 확인되어야 하며 기본 메타데이터가 쿼리되는 개체를 전달해야 합니다. GetKeyValue 대신 GetKey 메서드를 사용해야 합니다.

상태 인터페이스: IDebugHostStatus

IDebugHostStatus 인터페이스를 사용하면 데이터 모델 또는 디버그 호스트의 클라이언트가 디버그 호스트의 상태 특정 측면에 대해 문의할 수 있습니다. 인터페이스는 다음과 같이 정의됩니다.

DECLARE_INTERFACE_(IDebugHostStatus, IUnknown)
{
    STDMETHOD(PollUserInterrupt)(_Out_ bool* interruptRequested) PURE;
}

PollUserInterrupt

PollUserInterrupt 메서드는 디버그 호스트의 사용자가 현재 작업의 중단을 요청했는지 여부를 문의하는 데 사용됩니다. 데이터 모델의 속성 접근자는 instance 임의의 코드(예: JavaScript 메서드)를 호출할 수 있습니다. 해당 코드는 임의의 시간이 걸릴 수 있습니다. 디버그 호스트의 응답성을 유지하기 위해 임의 시간이 걸릴 수 있는 이러한 코드는 이 메서드 호출을 통해 인터럽트 요청에 대해 검사 합니다. interruptRequested 값이 true로 돌아오면 호출자는 즉시 중단하고 E_ABORT 결과를 반환해야 합니다.

컨텍스트 인터페이스: IDebugHostContext

컨텍스트는 데이터 모델 및 기본 디버그 호스트의 가장 중요한 측면 중 하나입니다. 개체를 보유할 때는 개체가 어디에서 왔는지, 어떤 프로세스에 있는지, 어떤 주소 공간이 연결되어 있는지를 알 수 있어야 합니다. 이 정보를 알면 포인터 값과 같은 항목을 올바르게 해석할 수 있습니다. IDebugHostContext 형식의 개체는 디버그 호스트의 여러 메서드에 전달되어야 합니다. 이 인터페이스는 다음과 같은 여러 가지 방법으로 획득할 수 있습니다.

  • 디버거의 현재 컨텍스트를 가져와서: IDebugHost의 GetCurrentContext 메서드 호출
  • 개체의 컨텍스트 가져오기: IModelObject의 GetContext 메서드 호출
  • 기호의 컨텍스트 가져오기: IDebugHostSymbol의 GetContext 메서드 호출

또한 데이터 모델 또는 디버그 호스트 메서드에서 반환되거나 전달되는 IDebugHostContext 인터페이스의 컨텍스트에서 특별한 의미가 있는 두 가지 값이 있습니다.

nullptr: 컨텍스트가 없음을 나타냅니다. 일부 개체에 컨텍스트가 없는 것이 완벽하게 유효합니다. 데이터 모델의 루트 네임스페이스에 있는 Debugger 개체는 특정 프로세스 또는 주소 공간 내의 아무 것도 참조하지 않습니다. 컨텍스트가 없습니다.

USE_CURRENT_HOST_CONTEXT: 디버그 호스트의 현재 UI 컨텍스트를 사용해야 함을 나타내는 sentinel 값입니다. 이 값은 디버그 호스트에서 반환되지 않습니다. 그러나 IDebugHost의 GetCurrentContext 메서드를 명시적으로 호출하는 대신 입력 IDebugHostContext를 사용하는 디버그 호스트 메서드에 전달될 수 있습니다. USE_CURRENT_HOST_CONTEXT 명시적으로 전달하는 것은 현재 컨텍스트를 명시적으로 가져오는 것보다 성능이 더 좋은 경우가 많습니다.

호스트 컨텍스트의 컨텍스트는 대체로 호출자에게 불투명합니다. 코어 디버그 호스트 외부의 호출자가 호스트 컨텍스트를 사용하여 수행할 수 있는 유일한 작업은 다른 호스트 컨텍스트와 비교하는 것입니다.

IDebugHostContext 인터페이스는 다음과 같이 정의됩니다.

DECLARE_INTERFACE_(IDebugHostContext, IUnknown)
{
    STDMETHOD(IsEqualTo)(_In_ IDebugHostContext *pContext, _Out_ bool *pIsEqual) PURE;
}

IsEqualTo

IsEqualTo 메서드는 호스트 컨텍스트를 다른 호스트 컨텍스트와 비교합니다. 두 컨텍스트가 동일하면 이를 나타내는 표시가 반환됩니다. 이 비교는 인터페이스 동등성이 아닙니다. 컨텍스트 자체의 기본 불투명 콘텐츠를 비교합니다.

오류 싱크: IDebugHostErrorSink

IDebugHostErrorSink는 클라이언트가 특정 작업 중에 발생하는 오류 알림을 받고 필요한 경우 해당 오류를 라우팅할 수 있는 수단입니다. 인터페이스는 다음과 같이 정의됩니다.

enum ErrorClass
{
    ErrorClassWarning,
    ErrorClassError
}
DECLARE_INTERFACE_(IDebugHostErrorSink, IUnknown)
{
    STDMETHOD(ReportError)(_In_ ErrorClass errClass, _In_ HRESULT hrError, _In_ PCWSTR message) PURE;
}

ReportError

ReportError 메서드는 오류 싱크에 대한 콜백으로 오류가 발생했음을 알리고 싱크가 적절한 UI 또는 메커니즘으로 오류를 라우팅할 수 있도록 합니다.

호스트 계산기: IDebugHostEvaluator / IDebugHostEvaluator2

디버그 호스트가 클라이언트에 제공하는 가장 중요한 기능 중 하나는 해당 언어 기반 식 계산기에 대한 액세스입니다. IDebugHostEvaluator 및 IDebugHostEvaluator2 인터페이스는 디버그 호스트에서 해당 기능에 액세스하는 수단입니다.

인터페이스는 다음과 같이 정의됩니다.

DECLARE_INTERFACE_(IDebugHostEvaluator2, IDebugHostEvaluator)
{
    //
    // IDebugHostEvaluator:
    //
    STDMETHOD(EvaluateExpression)(_In_ IDebugHostContext* context, _In_ PCWSTR expression, _In_opt_ IModelObject* bindingContext, _COM_Errorptr_ IModelObject** result, _COM_Outptr_opt_result_maybenull_ IKeyStore** metadata) PURE;
    STDMETHOD(EvaluateExtendedExpression)(_In_ IDebugHostContext* context, _In_ PCWSTR expression, _In_opt_ IModelObject* bindingContext, _COM_Errorptr_ IModelObject** result, _COM_Outptr_opt_result_maybenull_ IKeyStore** metadata) PURE;
    //
    // IDebugHostEvaluator2:
    //
    STDMETHOD(AssignTo)(_In_ IModelObject* assignmentReference, _In_ IModelObject* assignmentValue, _COM_Errorptr_ IModelObject** assignmentResult, _COM_Outptr_opt_result_maybenull_ IKeyStore** assignmentMetadata) PURE;
}

EvaluateExpression

EvaluateExpression 메서드를 사용하면 디버그 호스트가 언어(예: C++) 식을 평가하고 IModelObject로 boxed된 해당 식 계산의 결과 값을 반환하도록 요청할 수 있습니다. 메서드의 이 특정 변형은 언어 구문만 허용합니다. 언어에 없는 디버그 호스트의 식 계산기 내에 표시되는 추가 기능(예: LINQ 쿼리 메서드)은 평가에 대해 해제됩니다.

EvaluateExtendedExpression

EvaluateExtendedExpression 메서드는 특정 디버그 호스트가 식 계산기에 추가하도록 선택하는 추가 비언어 기능을 다시 설정한다는 점을 제외하고 EvaluateExpression 메서드와 유사합니다. 예를 들어 Windows용 디버깅 도구의 경우 익명 형식, LINQ 쿼리, 모듈 한정자, 형식 지정자 및 기타 비 C/C++ 기능을 사용할 수 있습니다.

IDebugHostEvaluator2

AssignTo

AssignTo 메서드는 디버그 중인 언어의 의미 체계에 따라 할당을 수행합니다.

호스트 확장성 인터페이스: IDebugHostExtensibility

디버그 호스트의 특정 기능은 필요에 따라 확장성이 적용됩니다. instance 식 계산기를 포함할 수 있습니다. IDebugHostExtensibility 인터페이스는 이러한 확장성 지점에 액세스하는 수단입니다. 인터페이스는 다음과 같이 정의됩니다.

DECLARE_INTERFACE_(IDebugHostExtensibility, IUnknown)
{
    STDMETHOD(CreateFunctionAlias)(_In_ PCWSTR aliasName, _In_ IModelObject *functionObject) PURE;
    STDMETHOD(DestroyFunctionAlias)(_In_ PCWSTR aliasName) PURE;
}

CreateFunctionAlias

CreateFunctionAlias 메서드는 일부 확장에서 구현된 메서드에 대한 "빠른 별칭"인 "함수 별칭"을 만듭니다. 이 별칭의 의미는 호스트별로 다릅니다. 호스트의 식 계산기를 함수로 확장하거나 완전히 다른 작업을 수행할 수 있습니다.

DestroyFunctionAlias

DestroyFunctionAlias 메서드는 CreateFunctionAlias 메서드에 대한 이전 호출을 실행 취소합니다. 함수는 더 이상 빠른 별칭 이름으로 사용할 수 없습니다.

데이터 모델에 액세스

무엇보다도 데이터 모델 확장성 API는 데이터 모델의 호스트 역할을 하는 애플리케이션(일반적으로 디버거)에 중립적으로 설계되었습니다. 이론적으로 모든 애플리케이션은 애플리케이션의 디버그 대상의 형식 시스템과 프로젝션된 개체 집합을 데이터 모델의 네임스페이스에 노출하는 호스트 API 집합을 제공하여 데이터 모델을 호스트할 수 있습니다. 는 해당 디버그 대상에 있습니다.

IDataModel, IDebugHost 및 IModelObject의 오프셋을 시작하는 데이터 모델 API는 이식 가능하도록 설계되어 있지만 "디버거 확장"이 무엇인지 정의하지는 않습니다. 현재 Windows용 디버깅 도구와 이 도구가 제공하는 엔진을 확장하려는 구성 요소는 데이터 모델에 액세스하기 위해 엔진 확장을 작성해야 합니다. 해당 엔진 확장은 확장에 대한 로드 및 부트스트래핑 메커니즘과 마찬가지로 엔진 확장이어야 합니다. 따라서 최소 구현은 다음을 제공합니다.

  • DebugExtensionInitialize: 생성된 IDebugClient를 활용하여 데이터 모델에 액세스하고 개체 모델 조작을 설정하는 메서드입니다.
  • DebugExtensionUninitialize: DebugExtensionInitialize에서 수행된 개체 모델 조작을 실행 취소하는 메서드입니다.
  • DebugExtensionCanUnload: 확장이 언로드할 수 있는지 여부를 반환하는 메서드입니다. 확장에 여전히 라이브 COM 개체가 있는 경우 이를 나타내야 합니다. 이는 디버거가 COM의 DllCanUnloadNow와 동일합니다. 언로드할 수 없음을 나타내는 S_FALSE 반환하는 경우 디버거는 나중에 이를 쿼리하여 언로드가 안전한지 또는 DebugExtensionInitialize를 다시 호출하여 확장을 다시 초기화할 수 있는지 확인할 수 있습니다. 확장은 두 경로를 모두 처리할 수 있도록 준비해야 합니다.
  • DebugExtensionUnload: DLL이 언로드되기 직전에 필요한 최종 정리를 수행하는 메서드입니다.

브리지 인터페이스: IHostDataModelAccess

언급했듯이 DebugExtensionInitialize가 호출되면 디버그 클라이언트를 만들고 데이터 모델에 대한 액세스를 가져옵니다. 이러한 액세스는 Windows용 디버깅 도구의 레거시 IDebug* 인터페이스와 데이터 모델 간의 브리지 인터페이스에서 제공됩니다. 이 브리지 인터페이스는 'IHostDataModelAccess'이며 다음과 같이 정의됩니다.

DECLARE_INTERFACE_(IHostDataModelAccess, IUnknown)
{
   STDMETHOD(GetDataModel)(_COM_Outptr_ IDataModelManager** manager, _COM_Outptr_ IDebugHost** host) PURE;
}

GetDataModel

GetDataModel 메서드는 데이터 모델의 양쪽에 대한 액세스를 제공하는 브리지 인터페이스의 메서드입니다. 디버그 호스트(디버거의 아래쪽 가장자리)는 반환된 IDebugHost 인터페이스 데이터 모델의 기본 구성 요소로 표현됩니다. 데이터 모델 관리자는 반환된 IDataModelManager 인터페이스에 의해 표현됩니다.

디버거 데이터 모델 시스템 인터페이스

데이터 모델 호스트

디버거 데이터 모델은 다양한 컨텍스트에서 호스팅할 수 있는 구성 요소화된 시스템으로 설계되었습니다. 일반적으로 데이터 모델은 디버거 애플리케이션의 컨텍스트에서 호스트됩니다. 데이터 모델의 호스트가 되려면 디버거의 핵심 측면(대상 지정, 메모리 공간, 계산기, 기호 및 형식 시스템 등)을 노출하기 위해 여러 인터페이스를 구현해야 합니다. 이러한 인터페이스는 데이터 모델을 호스트하려는 모든 애플리케이션에서 구현되지만 핵심 데이터 모델과 데이터 모델과 상호 운용되는 모든 확장에서 사용됩니다.

형식 시스템 및 기호 인터페이스는 다음과 같습니다.

인터페이스 이름 Description
IDebugHostSymbols 기호에 대한 액세스 및 해상도를 제공하는 핵심 인터페이스
IDebugHostSymbol / IDebugHostSymbol2 모든 종류의 단일 기호를 나타냅니다. 특정 기호는 이 인터페이스의 파생입니다.
IDebugHostModule 프로세스 내에 로드된 모듈을 나타냅니다. 이것은 일종의 기호입니다.
IDebugHostType / IDebugHostType2 네이티브/언어 형식을 나타냅니다.
IDebugHostConstant 기호 정보 내의 상수를 나타냅니다(예: C++의 형식이 아닌 템플릿 인수).
IDebugHostField 구조체 또는 클래스 내의 필드를 나타냅니다.
IDebugHostData 모듈 내의 데이터를 나타냅니다(구조체 또는 클래스 내에 있는 경우 IDebugHostField임).
IDebugHostBaseClass 기본 클래스를 나타냅니다.
IDebugHostPublic PDB의 publics 테이블 내에 있는 기호를 나타냅니다. 여기에는 연결된 형식 정보가 없습니다. 이름과 주소입니다.
IDebugHostModuleSignature 모듈 서명을 나타냅니다. 이름 및/또는 버전별로 모듈 집합과 일치하는 정의입니다.
IDebugHostTypeSignature 형식 시그니처를 나타냅니다. 모듈 및/또는 이름별로 형식 집합과 일치하는 정의입니다.

다른 핵심 인터페이스는 다음과 같습니다.

인터페이스 이름 Description
IDebugHost 디버그 호스트에 대한 핵심 인터페이스입니다.
IDebugHostStatus 클라이언트가 호스트의 상태 쿼리할 수 있는 인터페이스입니다.
IDebugHostContext 호스트 내의 컨텍스트 추상화(예: 특정 대상, 특정 프로세스, 특정 주소 공간 등).
IDebugHostErrorSink 호스트 및 데이터 모델의 특정 부분에서 오류를 수신하기 위해 호출자가 구현한 인터페이스
IDebugHostEvaluator / IDebugHostEvaluator2 디버그 호스트의 식 계산기입니다.
IDebugHostExtensibility 호스트 또는 해당 부분(예: 식 계산기)의 기능을 확장하기 위한 인터페이스입니다.

기본 기호 인터페이스: IDebugHostSymbols

IDebugHostSymbols 인터페이스는 디버그 대상의 기호에 액세스하는 기본 시작점입니다. 이 인터페이스는 IDebugHost의 instance 쿼리할 수 있으며 다음과 같이 정의됩니다.

DECLARE_INTERFACE_(IDebugHostSymbols, IUnknown)
{
    STDMETHOD(CreateModuleSignature)(_In_z_ PCWSTR pwszModuleName, _In_opt_z_ PCWSTR pwszMinVersion, _In_opt_z_ PCWSTR pwszMaxVersion, _Out_ IDebugHostModuleSignature** ppModuleSignature) PURE;
    STDMETHOD(CreateTypeSignature)(_In_z_ PCWSTR signatureSpecification, _In_opt_ IDebugHostModule* module, _Out_ IDebugHostTypeSignature** typeSignature) PURE;
    STDMETHOD(CreateTypeSignatureForModuleRange)(_In_z_ PCWSTR signatureSpecification, _In_z_ PCWSTR moduleName, _In_opt_z_ PCWSTR minVersion, _In_opt_z_ PCWSTR maxVersion, _Out_ IDebugHostTypeSignature** typeSignature) PURE;
    STDMETHOD(EnumerateModules)(_In_ IDebugHostContext* context, _COM_Outptr_ IDebugHostSymbolEnumerator** moduleEnum) PURE;
    STDMETHOD(FindModuleByName)(_In_ IDebugHostContext* context, _In_z_ PCWSTR moduleName, _COM_Outptr_ IDebugHostModule **module) PURE;
    STDMETHOD(FindModuleByLocation)(_In_ IDebugHostContext* context, _In_ Location moduleLocation, _COM_Outptr_ IDebugHostModule **module) PURE;
    STDMETHOD(GetMostDerivedObject)(_In_opt_ IDebugHostContext *pContext, _In_ Location location, _In_ IDebugHostType* objectType, _Out_ Location* derivedLocation, _Out_ IDebugHostType** derivedType) PURE;
}

CreateModuleSignature

CreateModuleSignature 메서드는 이름 및 선택적으로 버전별로 특정 모듈 집합을 일치시키는 데 사용할 수 있는 서명을 만듭니다. 모듈 서명에는 다음 세 가지 구성 요소가 있습니다.

  • 이름: 일치하는 모듈에는 서명의 이름과 정확히 일치하는 대/소문자를 구분하지 않는 이름이 있어야 합니다.
  • 최소 버전: 지정된 경우 일치하는 모듈에는 이 버전만큼 높은 최소 버전이 있어야 합니다. 버전은 "A.B.C.D" 형식으로 지정되며 각 후속 부분은 이전보다 덜 중요합니다. 첫 번째 세그먼트만 필수입니다.
  • 최대 버전: 지정된 경우 일치하는 모듈에는 이 버전보다 높지 않은 최대 버전이 있어야 합니다. 버전은 "A.B.C.D" 형식으로 지정되며 각 후속 부분은 이전보다 덜 중요합니다. 첫 번째 세그먼트만 필수입니다.

CreateTypeSignature

CreateTypeSignature 메서드는 모듈 및 형식 이름을 포함하여 구체적인 형식 집합을 일치시키는 데 사용할 수 있는 서명을 만듭니다. 형식 이름 서명 문자열의 형식은 디버그 중인 언어(및 디버그 호스트)와 관련이 있습니다. C/C++의 경우 서명 문자열은 NatVis 형식 사양과 동일합니다. 즉, 서명 문자열은 템플릿 인수에 와일드카드(*로 지정됨)가 허용되는 형식 이름입니다.

CreateTypeSignatureForModuleRange

CreateTypeSignatureForModuleRange 메서드는 모듈 서명 및 형식 이름으로 구체적인 형식 집합을 일치시키는 데 사용할 수 있는 서명을 만듭니다. 이는 서명과 일치하도록 특정 모듈을 전달하는 대신 호출자가 모듈 서명을 만드는 데 필요한 인수를 전달한다는 점을 제외하고 CreateTypeSignature 메서드와 유사합니다(CreateModuleSignature 메서드를 사용하여 모듈 서명을 만든 것처럼).

EnumerateModules

EnumerateModules 메서드는 특정 호스트 컨텍스트에서 사용할 수 있는 모든 모듈을 열거하는 열거자를 만듭니다. 해당 호스트 컨텍스트는 프로세스 컨텍스트를 캡슐화하거나 Windows 커널과 같은 항목을 캡슐화할 수 있습니다.

FindModuleByName

FindModuleByName 메서드는 지정된 호스트 컨텍스트를 살펴보고 지정된 이름을 가진 모듈을 찾아 인터페이스를 반환합니다. 파일 확장명을 사용하거나 사용하지 않고 이름으로 모듈을 검색하는 것은 합법적입니다.

FindModuleByLocation

FindModuleByLocation 메서드는 지정된 호스트 컨텍스트를 살펴보고 지정된 위치에 지정된 주소가 포함된 모듈을 결정합니다. 그런 다음 이러한 모듈에 인터페이스를 반환합니다.

GetMostDerivedObject

GetMostDerivedObject는 디버거의 형식 시스템을 사용하여 정적 형식에서 개체의 런타임 형식을 확인합니다. 이 메서드는 이 분석을 수행하기 위해 형식 시스템 계층에서 사용할 수 있는 기호 정보 및 추론만 사용합니다. 이러한 정보에는 C++ RTTI(런타임 형식 정보) 또는 개체의 가상 함수 테이블 셰이프 분석이 포함될 수 있습니다. IModelObject의 기본 런타임 형식 개념과 같은 항목은 포함되지 않습니다. 분석에서 런타임 형식을 찾을 수 없거나 메서드에 전달된 정적 형식과 다른 런타임 형식을 찾을 수 없는 경우 입력 위치 및 형식이 전달될 수 있습니다. 이러한 이유로 메서드가 실패하지 않습니다.

핵심 개별 기호 인터페이스: IDebugHostSymbol

데이터 모델 호스트에서 반환할 수 있는 모든 기호는 IDebugHostSymbol에서 어떤 방식으로 파생됩니다. 기호 종류에 관계없이 모든 기호가 구현하는 핵심 인터페이스입니다. 기호 종류에 따라 지정된 기호는 이 인터페이스가 나타내는 특정 종류의 기호에 더 고유한 특성을 반환하는 다른 인터페이스 집합을 구현할 수 있습니다. IDebugHostSymbol2 /IDebugHostSymbol 인터페이스는 다음과 같이 정의됩니다.

DECLARE_INTERFACE_(IDebugHostSymbol2, IDebugHostSymbol)
{
    // 
    // IDebugHostSymbol:
    //
    STDMETHOD(GetContext)(_COM_Outptr_ IDebugHostContext** context) PURE;
    STDMETHOD(EnumerateChildren)(_In_ SymbolKind kind, _In_opt_z_ PCWSTR name, _Out_ IDebugHostSymbolEnumerator **ppEnum) PURE;
    STDMETHOD(GetSymbolKind)(_Out_ SymbolKind *kind) PURE;
    STDMETHOD(GetName)(_Out_ BSTR* symbolName) PURE;
    STDMETHOD(GetType)(_Out_ IDebugHostType** type) PURE;
    STDMETHOD(GetContainingModule)(_Out_ IDebugHostModule **containingModule) PURE;
    STDMETHOD(CompareAgainst)(_In_ IDebugHostSymbol *pComparisonSymbol, _In_ ULONG comparisonFlags, _Out_ bool *pMatches) PURE;
    //
    // IDebugHostSymbol2
    //
    STDMETHOD(EnumerateChildrenEx)(_In_ SymbolKind kind, _In_opt_z_ PCWSTR name, _In_opt_ SymbolSearchInfo* searchInfo, _Out_ IDebugHostSymbolEnumerator **ppEnum) PURE;
}

이 인터페이스는 다음과 같은 값이 있는 SymbolKind 열거형으로 구분된 다양한 종류의 기호를 나타냅니다.

Enumarant 의미
기호 지정되지 않은 기호 형식
SymbolModule 기호는 모듈이며 IDebugHostModule에 대해 쿼리할 수 있습니다.
SymbolType 기호는 형식이며 IDebugHostType에 대해 쿼리할 수 있습니다.
SymbolField 기호는 필드(구조체 또는 클래스 내의 데이터 멤버)이며 IDebugHostField에 대해 쿼리할 수 있습니다.
SymbolConstant 기호는 상수 값이며 IDebugHostConstant에 대해 쿼리할 수 있습니다.
SymbolData 기호는 구조체 또는 클래스의 멤버가 아니며 IDebugHostData에 대해 쿼리할 수 있는 데이터입니다.
SymbolBaseClass 기호는 기본 클래스이며 IDebugHostBaseClass에 대해 쿼리할 수 있습니다.
SymbolPublic 기호는 모듈의 publics 테이블에 있는 항목이며(형식 정보가 없음) IDebugHostPublic에 대해 쿼리할 수 있습니다.
SymbolFunction 기호는 함수이며 IDebugHostData에 대해 쿼리할 수 있습니다.

GetContext

GetContext 메서드는 기호가 유효한 컨텍스트를 반환합니다. 이는 기호가 존재하는 디버그 대상 및 프로세스/주소 공간과 같은 항목을 나타내지만 다른 수단(예: IModelObject에서)에서 검색된 컨텍스트만큼 구체적이지 않을 수 있습니다.

EnumerateChildren

EnumerateChildren 메서드는 지정된 기호의 모든 자식을 열거하는 열거자를 반환합니다. 예를 들어 C++ 형식의 경우 기본 클래스, 필드, 멤버 함수 등은 모두 형식 기호의 자식으로 간주됩니다.

모듈 인터페이스: IDebugHostModule

일부 주소 공간 내에 로드되는 모듈에 대한 디버거의 개념은 데이터 모델에서 IDebugHostModule 인터페이스를 통해 형식 시스템 수준에서 두 가지 고유한 방식으로 표시됩니다. 여기서 모듈은 기호이며 모듈의 핵심 특성은 Debugger.Models.Module 데이터 모델을 통해 데이터 모델 수준에서 프로젝션된 인터페이스 메서드 호출입니다. 이는 모듈의 형식 시스템 IDebugHostModule 표현을 확장할 수 있는 캡슐화입니다.

IDebugHostModule 인터페이스는 다음과 같이 정의됩니다(IDebugHostSymbol에 제네릭인 메서드 무시).

DECLARE_INTERFACE_(IDebugHostModule, IDebugHostSymbol)
{
    //
    // IDebugHostModule:
    //
    STDMETHOD(GetImageName)(_In_ bool allowPath, _Out_ BSTR* imageName) PURE;
    STDMETHOD(GetBaseLocation)(_Out_ Location* moduleBaseLocation) PURE;
    STDMETHOD(GetVersion)(_Out_opt_ ULONG64* fileVersion, _Out_opt_ ULONG64* productVersion) PURE;
    STDMETHOD(FindTypeByName)(_In_z_ PCWSTR typeName, _Out_ IDebugHostType** type) PURE;
    STDMETHOD(FindSymbolByRVA)(_In_ ULONG64 rva, _Out_ IDebugHostSymbol** symbol) PURE;
    STDMETHOD(FindSymbolByName)(_In_z_ PCWSTR symbolName, _Out_ IDebugHostSymbol** symbol) PURE;
}

GetImageName

GetImageName 메서드는 모듈의 이미지 이름을 반환합니다. allowPath 인수의 값에 따라 반환된 이미지 이름에 이미지의 전체 경로가 포함되거나 포함되지 않을 수 있습니다.

GetBaseLocation

GetBaseLocation 메서드는 모듈의 기본 부하 주소를 위치 구조로 반환합니다. 모듈에 대해 반환된 위치 구조는 일반적으로 가상 주소를 참조합니다.

GetVersion

GetVersion 메서드는 모듈에 대한 버전 정보를 반환합니다(이러한 정보를 헤더에서 성공적으로 읽을 수 있다고 가정). 지정된 버전이 요청되고(nullptr이 아닌 출력 포인터를 통해) 읽을 수 없는 경우 메서드 호출에서 적절한 오류 코드가 반환됩니다.

FindTypeByName

FindTypeByName 메서드는 모듈 내에서 형식 이름으로 정의된 형식을 찾아 형식 기호를 반환합니다. 이 메서드는 모듈의 자식에 대한 명시적 재귀를 통해 반환되지 않는 유효한 IDebugHostType을 반환할 수 있습니다. 디버그 호스트는 파생 형식을 만들 수 있습니다. 즉, 모듈 자체에서 사용되지 않고 형식에서 파생된 형식입니다. 예를 들어 MyStruct 구조체가 모듈의 기호에 정의되어 있지만 MyStruct ** 형식을 사용하지 않는 경우 FindTypeByName 메서드는 해당 형식 이름이 모듈의 기호에 명시적으로 표시되지 않더라도 MyStruct **에 대한 형식 기호를 합법적으로 반환할 수 있습니다.

FindSymbolByRVA

FindSymbolByRVA 메서드는 모듈 내의 지정된 상대 가상 주소에서 일치하는 단일 기호를 찾습니다. 제공된 RVA에 단일 기호가 없는 경우(예: 일치하는 항목이 여러 개 있음) 이 메서드에서 오류가 반환됩니다. 이 메서드는 publics 테이블의 기호보다 프라이빗 기호를 반환하는 것을 선호합니다.

FindSymbolByName

FindSymbolByName 메서드는 모듈 내에서 지정된 이름의 단일 전역 기호를 찾습니다. 지정된 이름과 일치하는 단일 기호가 없으면 이 메서드에서 오류가 반환됩니다. 이 메서드는 publics 테이블의 기호보다 프라이빗 기호를 반환하는 것을 선호합니다.

형식 시스템에 대한 액세스: IDebugHostType2 / IDebugHostType

지정된 언어/네이티브 형식은 IDebugHostType2 또는 IDebugHostType 인터페이스에서 설명합니다. 이러한 인터페이스의 일부 메서드는 특정 유형의 형식에만 적용됩니다. 지정된 형식 기호는 TypeKind 열거형에 설명된 대로 다음 형식 중 하나를 참조할 수 있습니다.

형식 종류 Description
TypeUDT 사용자 정의 형식(구조체, 클래스, 공용 구조체 등...) 형식이 TypeUDT인 네이티브 형식이 있는 모델 개체에는 항상 해당 IModelObject 내에 형식이 유지되는 ObjectTargetObject의 정식 표현이 있습니다.
TypePointer 포인터입니다. 형식이 TypePointer인 네이티브 형식이 있는 모델 개체는 포인터의 값이 0으로 확장되어 VT_UI8 확장되고 이 64비트 형식의 내장 데이터로 유지되는 ObjectIntrinsic의 정식 표현을 가집니다. TypePointer의 모든 형식 기호에는 포인터가 가리키는 형식의 기본 형식(GetBaseType 메서드에서 반환됨)이 있습니다.
TypeMemberPointer 클래스 멤버에 대한 포인터입니다. 형식이 TypeMemberPointer인 네이티브 형식이 있는 모델 개체에는 내장된 정식 표현(포인터 값과 같은 값)이 있습니다. 이 값의 정확한 의미는 컴파일러/디버그 호스트별입니다.
TypeArray 배열입니다. TypeArray 종류가 ObjectTargetObject의 정식 표현인 네이티브 형식이 있는 모델 개체입니다. 배열의 기본 주소는 개체의 위치(GetLocation 메서드를 통해 검색됨)이며 배열 형식은 항상 유지됩니다. TypeArray의 모든 형식 기호에는 배열이 배열인 형식의 기본 형식(GetBaseType 메서드에서 반환됨)이 있습니다.
TypeFunction 함수입니다.
TypeTypedef typedef입니다. 형식이 TypeTypedef인 네이티브 형식이 있는 모델 개체는 typedef의 내부 최종 형식의 정식 표현과 동일한 정식 표현을 가합니다. IDebugHostType2의 명시적 typedef 메서드를 사용하여 typedef 정보를 쿼리하거나 typedef에 대해 등록된 명시적 데이터 모델이 없는 경우 개체의 최종 사용자와 형식 정보에 완전히 투명하게 표시됩니다. GetTypeKind 메서드는 TypeTypedef를 반환하지 않습니다. 모든 메서드는 typedef의 기본이 되는 최종 형식을 반환합니다. IDebugHostType2에는 typedef 특정 정보를 가져오는 데 사용할 수 있는 typedef 특정 메서드가 있습니다.
TypeEnum 열거형입니다. 형식이 TypeEnum인 네이티브 형식이 있는 모델 개체는 ObjectIntrinsic의 정식 표현으로, 내장 값과 형식이 열거형 값과 동일합니다.
TypeIntrinsic 내장 함수(기본 형식)입니다. 형식이 TypeIntrinsic인 네이티브 형식이 있는 모델 개체에는 ObjectIntrinsic의 정식 표현이 있습니다. 형식 정보는 유지되거나 유지되지 않을 수 있습니다. 특히 기본 형식이 IModelObject에 저장된 내장 데이터의 변형 데이터 형식(VT_*)으로 완전히 설명되는 경우

전체 IDebugHostType2/IDebugHostType 인터페이스는 다음과 같이 정의됩니다(IDebugHostSymbol 메서드 제외).

DECLARE_INTERFACE_(IDebugHostType2, IDebugHostType)
{
    //
    // IDebugHostType:
    //
    STDMETHOD(GetTypeKind)(_Out_ TypeKind *kind) PURE;
    STDMETHOD(GetSize)(_Out_ ULONG64* size) PURE;
    STDMETHOD(GetBaseType)(_Out_ IDebugHostType** baseType) PURE;
    STDMETHOD(GetHashCode)(_Out_ ULONG* hashCode) PURE;
    STDMETHOD(GetIntrinsicType)(_Out_opt_ IntrinsicKind *intrinsicKind, _Out_opt_ VARTYPE *carrierType) PURE;
    STDMETHOD(GetBitField)(_Out_ ULONG* lsbOfField, _Out_ ULONG* lengthOfField) PURE;
    STDMETHOD(GetPointerKind)(_Out_ PointerKind* pointerKind) PURE;
    STDMETHOD(GetMemberType)(_Out_ IDebugHostType** memberType) PURE;
    STDMETHOD(CreatePointerTo)(_In_ PointerKind kind, _COM_Outptr_ IDebugHostType** newType) PURE;
    STDMETHOD(GetArrayDimensionality)(_Out_ ULONG64* arrayDimensionality) PURE;
    STDMETHOD(GetArrayDimensions)(_In_ ULONG64 dimensions, _Out_writes_(dimensions) ArrayDimension *pDimensions) PURE;
    STDMETHOD(CreateArrayOf)(_In_ ULONG64 dimensions, _In_reads_(dimensions) ArrayDimension *pDimensions, _COM_Outptr_ IDebugHostType** newType) PURE;
    STDMETHOD(GetFunctionCallingConvention)(_Out_ CallingConventionKind* conventionKind) PURE;
    STDMETHOD(GetFunctionReturnType)(_COM_Outptr_ IDebugHostType** returnType) PURE;
    STDMETHOD(GetFunctionParameterTypeCount)(_Out_ ULONG64* count) PURE;
    STDMETHOD(GetFunctionParameterTypeAt)(_In_ ULONG64 i, _Out_ IDebugHostType** parameterType) PURE;
    STDMETHOD(IsGeneric)(_Out_ bool* isGeneric) PURE;
    STDMETHOD(GetGenericArgumentCount)(_Out_ ULONG64* argCount) PURE;
    STDMETHOD(GetGenericArgumentAt)(_In_ ULONG64 i, _Out_ IDebugHostSymbol** argument) PURE;
    //
    // IDebugHostType2:
    //
    STDMETHOD(IsTypedef)(_Out_ bool* isTypedef) PURE;
    STDMETHOD(GetTypedefBaseType)(_Out_ IDebugHostType2** baseType) PURE;
    STDMETHOD(GetTypedefFinalBaseType)(_Out_ IDebugHostType2** finalBaseType) PURE;
    STDMETHOD(GetFunctionVarArgsKind)(_Out_ VarArgsKind* varArgsKind) PURE;
}

IDebugHostType2/IDebugHostType 일반 메서드

다음 IDebugHostType 메서드는 GetTypeKind 메서드에서 반환되는 종류에 관계없이 모든 형식에 일반적입니다.

STDMETHOD(GetTypeKind)(_Out_ TypeKind *kind) PURE;
STDMETHOD(GetSize)(_Out_ ULONG64* size) PURE;
STDMETHOD(GetBaseType)(_Out_ IDebugHostType** baseType) PURE;
STDMETHOD(GetHashCode)(_Out_ ULONG* hashCode) PURE;

GetTypeKind

GetTypeKind 메서드는 기호가 참조하는 형식의 종류(포인터, 배열, 내장 등...)를 반환합니다.

GetSize

GetSize 메서드는 형식의 크기를 반환합니다(C++에서 sizeof(type)를 수행한 것처럼).

GetBaseType

형식이 다른 단일 형식의 파생 형식인 경우(예: MyStruct *는 MyStruct에서 파생됨). GetBaseType 메서드는 파생의 기본 형식을 반환합니다. 포인터의 경우 가리키는 형식을 반환합니다. 배열의 경우 배열이 배열인 것을 반환합니다. 형식이 파생 형식이 아니면 오류가 반환됩니다.

GetHashCode

GetHashCode 메서드는 형식에 대한 32비트 해시 코드를 반환합니다. 전역 일치(예: 호스트에서 허용하는 경우 모든 항목과 일치하는 *에 해당하는 형식 서명)를 제외하고 특정 형식 서명과 일치할 수 있는 모든 형식 instance 동일한 해시 코드를 반환해야 합니다. 이 메서드는 형식 서명을 형식 인스턴스와 일치시키기 위해 형식 서명과 함께 사용됩니다.

IDebugHostType2/IDebugHostType 내장 메서드

다음 IDebugHostType 메서드는 내장 형식(또는 열거형과 같은 내장 데이터를 보유하는 형식)과 관련이 있습니다.

STDMETHOD(GetIntrinsicType)(_Out_opt_ IntrinsicKind *intrinsicKind, _Out_opt_ VARTYPE *carrierType) PURE;

GetIntrinsicType

GetIntrinsicType 메서드는 형식의 내장 함수 종류에 대한 정보를 반환합니다. 다음 두 값이 이 메서드에서 반환됩니다.

  • 내장 종류는 전체 형식(예: 정수, 부호 없음, 부동 소수점)을 나타내지만 형식의 크기는 나타내지 않습니다(예: 8비트, 16비트, 32비트, 64비트).
  • 캐리어 형식은 내장 종류가 VARIANT 구조체로 압축되는 방식을 나타냅니다. VT_* 상수입니다.

두 값의 조합은 내장 함수에 대한 전체 정보 집합을 제공합니다.

IDebugHostType2/IDebugHostType Bitfield 메서드

다음 IDebugHostType 메서드는 데이터를 비트 필드에 저장하는 형식과 관련이 있습니다. 내장 함수 내의 비트 필드 배치에 대한 정보는 위치의 특성이 아니라 데이터 모델에 있는 형식 기호의 일부로 저장됩니다.

STDMETHOD(GetBitField)(_Out_ ULONG* lsbOfField, _Out_ ULONG* lengthOfField) PURE;

GetBitField

데이터 구조의 지정된 멤버가 비트 필드(예: ULONG MyBits:8)인 경우 필드의 형식 정보는 비트필드 배치에 대한 정보와 함께 전달됩니다. GetBitField 메서드를 사용하여 해당 정보를 검색할 수 있습니다. 이 메서드는 비트 필드가 아닌 모든 형식에서 실패합니다. 이것이 메서드가 실패하는 유일한 이유입니다. 이 메서드를 호출하고 성공/실패를 확인하면 비트 필드를 비트 필드와 비비트 필드로 구분하기에 충분합니다. 지정된 형식이 비트 필드인 경우 필드 위치는 반 열린 집합(lsbOfField + lengthOfField : lsbOfField)으로 정의됩니다.

IDebugHostType2/IDebugHostType 포인터 관련 메서드

다음 IDebugHostType 메서드는 포인터 형식과 관련이 있습니다. GetTypeKind가 TypePointer 또는 TypeMemberPointer'를 반환하는 형식은 다음과 같습니다.

STDMETHOD(GetPointerKind)(_Out_ PointerKind* pointerKind) PURE;
STDMETHOD(GetMemberType)(_Out_ IDebugHostType** memberType) PURE;

GetPointerKind

포인터인 형식의 경우 GetPointerKind 메서드는 포인터 종류를 반환합니다. 이는 PointerKind 열거형으로 정의됩니다.

GetMemberType

TypeMemberPointer 형식으로 표시된 것처럼 멤버에 대한 포인터인 형식의 경우 GetMemberType 메서드는 포인터가 의 포인터-멤버인 클래스를 반환합니다.

IDebugHostType2/IDebugHostType 배열 관련 메서드

배열은 GetTypeKind가 TypeArray를 반환하는 형식입니다. 디버그 호스트의 형식 시스템에서 정의한 배열은 C가 활용하는 단일 차원, 0 인덱스 기반의 압축된 선형 1차원 배열과 동일하지 않습니다. C 스타일 배열은 정의에 적합하지만 배열의 전체 scope IDebugHostType에서 더 광범위합니다. 디버그 호스트의 배열은 다차원일 수 있으며 배열 내의 각 차원은 ArrayDimensionThis 설명자로 알려진 설명자에 의해 정의됩니다.

필드 의미
LowerBound 서명된 64비트 값으로 배열의 기본 인덱스입니다. C 스타일 배열의 경우 항상 0입니다. 그것은 될 필요가 없습니다. 배열의 개별 차원은 음수인 경우에도 64비트 인덱스에서 시작하는 것으로 간주할 수 있습니다.
길이 부호 없는 64비트 값으로 배열 차원의 길이입니다. 배열의 인덱스 범위는 [LowerBound, LowerBound + Length) 반 열린 집합에 걸쳐 있습니다.
Stride 배열 차원의 보폭을 정의합니다. 이 차원의 인덱스에서 N에서 N + 1로 증가하면 메모리에서 앞으로 이동할 바이트 수를 나타냅니다. C 스타일 배열의 경우 배열의 각 요소 크기입니다. 그것은 될 필요가 없습니다. 요소 간의 안쪽 여백은 각 개별 요소의 크기보다 큰 보폭으로 표현할 수 있습니다. 다차원 배열의 경우 이 값은 전체 차원을 앞으로 이동하는 방법을 나타냅니다. M x N 행렬을 고려합니다. 이는 행 주 형식으로 다음 두 차원으로 설명될 수 있습니다.
{ [LowerBound: 0, Length: M, Stride: N \* sizeof(element)], [LowerBound: 0, Length: N, Stride: sizeof(element)]} 

또는 열 주 형식에서 다음 두 차원으로 설명할 수 있습니다.

{ [LowerBound: 0, Length: M, Stride: sizeof(element)], [LowerBound: 0, Length: N, Stride: M \* sizeof(element)]} 

ArrayDimension 개념은 이러한 수준의 유연성을 허용합니다.

다음 IDebugHostType 메서드는 배열 형식과 관련이 있습니다.

STDMETHOD(GetArrayDimensionality)(\_Out_ ULONG64\* arrayDimensionality) PURE; 
STDMETHOD(GetArrayDimensions)(\_In_ ULONG64 dimensions, \_Out_writes_(dimensions) ArrayDimension \*pDimensions) PURE;

GetArrayDimensionality

GetArrayDimensionality 메서드는 배열이 인덱싱되는 차원 수를 반환합니다. C 스타일 배열의 경우 여기에서 반환되는 값은 항상 1입니다.

GetArrayDimensions

GetArrayDimensions 메서드는 GetArrayDimensionality 메서드에 표시된 대로 배열의 각 차원에 대해 하나씩 설명자 집합을 반환합니다. 각 설명자는 각 배열 차원의 시작 인덱스, 길이 및 정방향 보폭을 설명하는 ArrayDimension 구조체입니다. 이렇게 하면 C 형식 시스템에서 허용되는 것보다 훨씬 더 강력한 배열 구문에 대한 설명이 가능합니다.

C 스타일 배열의 경우 단일 배열 차원은 항상 다음과 같은 값으로 반환됩니다.

  • LowerBound = 0
  • Length = ARRAYSIZE(array)
  • Stride = sizeof(elementType)

IDebugHostType2/IDebugHostType 함수 관련 메서드

TypeFunction의 종류를 통해 함수 형식임을 나타내는 형식은 IDebugHostType 및 IDebugHostType2 모두에서 다음 메서드를 지원합니다.

//
// IDebugHostType:
//
STDMETHOD(GetFunctionCallingConvention)(_Out_ CallingConventionKind* conventionKind) PURE;
STDMETHOD(GetFunctionReturnType)(_COM_Outptr_ IDebugHostType** returnType) PURE;
STDMETHOD(GetFunctionParameterTypeCount)(_Out_ ULONG64* count) PURE;
STDMETHOD(GetFunctionParameterTypeAt)(_In_ ULONG64 i, _Out_ IDebugHostType** parameterType) PURE;
//
// IDebugHostType2:
//
STDMETHOD(GetFunctionVarArgsKind)(_Out_ VarArgsKind* varArgsKind) PURE;

GetFunctionCallingConvention

GetFunctionCallingConvention 메서드는 함수의 호출 규칙을 반환합니다. 이러한 값은 CallingConventionKind 열거형의 멤버로 반환됩니다.

GetFunctionReturnType

GetFunctionReturnType 메서드는 함수의 반환 형식을 반환합니다.

GetFunctionParameterTypeCount

GetFunctionParameterTypeCount 메서드는 함수가 사용하는 인수 수를 반환합니다. C/C++ 줄임표 기반 변수 인수 표식은 이 수에서 고려되지 않습니다. 이러한 존재는 GetFunctionVarArgsKind 메서드를 통해 검색되어야 합니다. 여기에는 줄임표 앞의 인수만 포함됩니다.

GetFunctionParameterTypeAt

GetFunctionParameterTypeAt 메서드는 i-th 인수의 형식을 함수에 반환합니다.

GetFunctionVarArgsKind 메서드는 지정된 함수가 변수 인수 목록을 활용하는지 여부와 변수 인수가 사용하는 변수 인수 스타일을 반환합니다. 이러한 값은 다음과 같이 정의된 VarArgsKind 열거형의 멤버에 의해 정의됩니다.

열거형 의미
VarArgsNone 함수는 변수 인수를 사용하지 않습니다.
VarArgsCStyle 함수는 C 스타일 varargs 함수(returnType(arg1, arg2, ...))입니다. 함수에서 보고하는 인수 수에는 줄임표 인수가 포함되지 않습니다. 모든 변수 인수 전달은 GetFunctionParameterTypeCount 메서드에서 반환된 인수 수 다음에 발생합니다.

IDebugHostType2 GetFunctionVarArgsKind

GetFunctionVarArgsKind 메서드는 지정된 함수가 변수 인수 목록을 활용하는지 여부와 변수 인수가 사용하는 변수 인수 스타일을 반환합니다. 이러한 값은 다음과 같이 정의된 VarArgsKind 열거형의 멤버에 의해 정의됩니다.

IDebugHostType2/IDebugHostType Typedef 관련 메서드

typedef인 모든 형식은 형식이 typedef의 기본이 되는 최종 형식인 것처럼 동작합니다. 즉, GetTypeKind와 같은 메서드는 형식이 typedef임을 나타내지 않습니다. 마찬가지로 GetBaseType은 정의가 참조하는 형식을 반환하지 않습니다. 대신 typedef의 기본이 되는 최종 정의에서 호출된 것처럼 동작을 나타냅니다. 예를 들어

typedef MYSTRUCT *PMYSTRUCT;
typedef PMYSTRUCT PTRMYSTRUCT;

'PMYSTRUCT 또는 PTRMYSTRUCT에 대한 IDebugHostType은 다음 정보를 보고합니다.

  • GetTypeKind 메서드는 TypePointer를 반환합니다. MYSTRUCT * 최종 기본 형식은 실제로 포인터입니다.
  • 'GetBaseType 메서드는 MYSTRUCT에 대한 형식을 반환합니다. MYSTRUCT *의 기본 형식은 MYSTRUCT입니다.

여기서 유일한 차이점은 IDebugHostType2의 typedef 특정 메서드가 작동하는 방식입니다. 이러한 메서드는 다음과 같습니다.

STDMETHOD(IsTypedef)(_Out_ bool* isTypedef) PURE;
STDMETHOD(GetTypedefBaseType)(_Out_ IDebugHostType2** baseType) PURE;
STDMETHOD(GetTypedefFinalBaseType)(_Out_ IDebugHostType2** finalBaseType) PURE;

이 예제에 대한 설명:

  • IsTypedef 메서드는 PMYSTRUCT 및 PTRMYSTRUCT 모두에 대해 true를 반환합니다.
  • GetTypedefBaseType 메서드는 PMYSTRUCT에 대해 MYSTRUCT *를 반환하고 PTRMYSTRUCT의 경우 PMYSTRUCT를 반환합니다.
  • GetTypedefFinalBaseType 메서드는 두 형식 모두에 대해 MYSTRUCT *를 반환합니다.

IsTypedef

IsTypedef 메서드는 형식이 typedef인지 여부를 확인할 수 있는 유일한 메서드입니다. GetTypeKind 메서드는 기본 형식에서 호출된 것처럼 동작합니다.

GetTypedefBaseType

GetTypedefBaseType 메서드는 typedef의 즉각적인 정의를 반환합니다. 설명서에 설명된 예제에서 다음을 수행합니다.

typedef MYSTRUCT *PMYSTRUCT;
typedef PMYSTRUCT PTRMYSTRUCT;

이 메서드는 PMYSTRUCT의 경우 MYSTRUCT *를 반환하고 PTRMYSTRUCT의 경우 PMYSTRUCT를 반환합니다.

GetTypedefFinalBaseType

GetTypedefFinalBaseType 메서드는 typedef가 정의인 최종 형식을 반환합니다. typedef가 다른 typedef의 정의인 경우 typedef가 아닌 형식에 도달하고 해당 형식이 반환될 때까지 정의 체인을 계속 따릅니다. 설명서에 설명된 예제에서 다음을 수행합니다.

typedef MYSTRUCT *PMYSTRUCT;
typedef PMYSTRUCT PTRMYSTRUCT;

이 메서드는 PMYSTRUCT 또는 PTRMYSTRUCT에서 호출될 때 MYSTRUCT * 를 반환합니다.

IDebugHostType2/IDebugHostType 형식 만들기 메서드

STDMETHOD(CreatePointerTo)(_In_ PointerKind kind, _COM_Outptr_ IDebugHostType** newType) PURE;
STDMETHOD(CreateArrayOf)(_In_ ULONG64 dimensions, _In_reads_(dimensions) ArrayDimension *pDimensions, _COM_Outptr_ IDebugHostType** newType) PURE;

상수 기호 값: IDebugHostConstant

상수 값이 기호 정보(특정 값이 상수 값일 수도 있고 그렇지 않을 수도 있는 기호)에 있는 위치의 경우 IDebugHostConstant 인터페이스는 이러한 상수의 개념을 표현합니다. 일반적으로 지정된 인수가 형식이지만 대신 형식이 아닌 템플릿 인수(예: 상수)일 수 있는 템플릿 인수와 같은 위치에서 사용됩니다.

IDebugHostConstant 인터페이스는 다음과 같이 정의됩니다(IDebugHostSymbol에서 구현된 제네릭 메서드 무시).

DECLARE_INTERFACE_(IDebugHostConstant, IDebugHostSymbol)
{
    STDMETHOD(GetValue)(_Out_ VARIANT* value) PURE;
}

GetValue

GetValue 메서드는 VARIANT에 압축된 상수의 값을 반환합니다. IDebugHostSymbol의 GetType 메서드는 상수에 대한 특정 형식 기호를 반환할 수 있습니다. 이러한 경우 형식 기호에 정의된 상수 값의 압축이 여기서 GetValue 메서드에서 반환한 압축과 동일하다는 보장은 없습니다.

데이터 멤버 액세스: IDebugHostField

IDebugHostField 클래스는 클래스, 구조체, 공용 구조체 또는 기타 형식 구문의 데이터 멤버인 기호를 나타냅니다. 무료 데이터(예: 전역 데이터)를 나타내지 않습니다. 인터페이스는 다음과 같이 정의됩니다(IDebugHostSymbol에 대한 제네릭 메서드 무시).

DECLARE_INTERFACE_(IDebugHostField, IDebugHostSymbol)
{
    STDMETHOD(GetLocationKind)(_Out_ LocationKind *locationKind) PURE;
    STDMETHOD(GetOffset)(_Out_ ULONG64* offset) PURE;
    STDMETHOD(GetLocation)(_Out_ Location* location) PURE;
    STDMETHOD(GetValue)(_Out_ VARIANT* value) PURE;
}

GetLocationKind

GetLocationKind 메서드는 LocationKind 열거형에 따라 기호가 있는 위치의 종류를 반환합니다. 이러한 열거형은 다음 값 중 하나일 수 있습니다.

열거형 의미
LocationMember 필드는 클래스, 구조체, 공용 구조체 또는 기타 형식 구문의 일반 데이터 멤버입니다. 포함하는 형식 구문의 기본 주소를 기준으로 하는 오프셋이 있습니다. 이러한 기본 주소는 일반적으로 이 포인터로 표시됩니다. 필드의 오프셋은 GetOffset 메서드를 통해 검색할 수 있습니다. LocationMember인 필드에 대해 GetLocation 및 GetValue 메서드가 실패합니다.
LocationStatic 필드가 정적이며 고유한 주소가 있습니다. GetLocation 메서드는 정적 필드의 추상 위치(예: 주소)를 반환합니다. LocationStatic인 필드에 대해 GetOffset 및 GetValue 메서드가 실패합니다.
LocationConstant 필드는 상수이며 값이 있습니다. GetValue 메서드는 상수의 값을 반환합니다. LocationConstant인 필드에 대해 GetOffset 및 GetLocation 메서드가 실패합니다.
LocationNone 필드에 위치가 없습니다. 컴파일러에 의해 최적화되었거나 선언되었지만 정의되지 않은 정적 필드일 수 있습니다. 이러한 필드가 어떻게 되었든, 물리적 존재나 가치는 없습니다. 기호에만 있습니다. LocationNone인 필드에 대해 모든 취득 방법(GetOffset, GetLocation 및 GetValue)이 실패합니다.

GetOffset

오프셋이 있는 필드(예: 위치 종류가 LocationMember를 나타내는 필드)의 경우 GetOffset 메서드는 포함하는 형식(이 포인터)의 기본 주소에서 필드 자체의 데이터로 오프셋을 반환합니다. 이러한 오프셋은 항상 부호 없는 64비트 값으로 표현됩니다. 지정된 필드에 포함된 형식의 기본 주소에서 오프셋인 위치가 없으면 GetOffset 메서드가 실패합니다.

GetLocation

특정 형식 instance 관계없이 주소가 있는 필드(예: 위치 종류가 LocationStatic을 나타내는 필드)의 경우 GetLocation 메서드는 필드의 추상 위치(주소)를 반환합니다. 지정된 필드에 정적 위치가 없으면 GetLocation 메서드가 실패합니다.

GetValue

기호 정보 내에 상수 값이 정의된 필드(예: 위치 종류가 LocationConstant를 나타내는 필드)의 경우 GetValue 메서드는 필드의 상수 값을 반환합니다. 지정된 필드에 상수 값이 없으면 GetValue 메서드가 실패합니다.

무료 데이터 액세스: IDebugHostData

다른 형식의 멤버가 아닌 모듈의 데이터는 IDebugHostData 인터페이스로 표시됩니다. 해당 인터페이스는 다음과 같이 정의됩니다(IDebugHostSymbol에 대한 제네릭 메서드 무시).

DECLARE_INTERFACE_(IDebugHostData, IDebugHostSymbol)
{
    STDMETHOD(GetLocationKind)(_Out_ LocationKind *locationKind) PURE;
    STDMETHOD(GetLocation)(_Out_ Location* location) PURE;
    STDMETHOD(GetValue)(_Out_ VARIANT* value) PURE;
}

이러한 모든 메서드는 IDebugHostField의 해당 메서드와 의미상 동일합니다. 유일한 차이점은 GetLocationKind 메서드가 무료 데이터에 대해 LocationMember를 반환하지 않는다는 것입니다.

GetLocationKind

GetLocationKind 메서드는 LocationKind 열거형에 따라 기호가 있는 위치의 종류를 반환합니다. 이 열거형에 대한 설명은 IDebugHostField 설명서에서 찾을 수 있습니다.

GetLocation

주소가 있는 데이터의 경우 GetLocation 메서드는 필드의 추상 위치(주소)를 반환합니다. 지정된 데이터에 정적 위치가 없으면 GetLocation 메서드가 실패합니다.

GetValue

datawhich의 경우 기호 정보(예: 위치 종류가 LocationConstant를 나타내는 데이터) 내에 정의된 상수 값이 있는 경우 GetValue 메서드는 필드의 상수 값을 반환합니다. 지정된 데이터에 상수 값이 없으면 GetValue 메서드가 실패합니다.

기본 클래스: IDebugHostBaseClass

지정된 형식의 상속 계층 구조는 형식 기호의 자식을 통해 표현됩니다. 지정된 형식이 하나 이상의 형식에서 파생(상속 현명한 경우) 형식에 대한 형식 기호의 SymbolBaseClass 자식이 하나 이상 있습니다. 이러한 각 SymbolBaseClass 기호는 특정 형식의 즉각적인 상속을 나타냅니다. 기본 클래스의 이름은 SymbolBaseClass 기호의 이름과 기본 클래스에 대한 형식 기호의 이름입니다. SymbolBaseClass 기호의 GetType 메서드를 사용하여 기본 클래스 자체의 형식 기호를 가져올 수 있습니다. 전체 상속 계층 구조는 SymbolBaseClass 자식 기호를 재귀적으로 탐색하여 트래버스할 수 있습니다. 이러한 각 기본 클래스 기호는 다음과 같이 정의된 IDebugHostBaseClass 인터페이스로 표현됩니다(IDebugHostSymbol에 대한 제네릭 메서드 무시).

DECLARE_INTERFACE_(IDebugHostBaseClass, IDebugHostSymbol)
{
    STDMETHOD(GetOffset)(_Out_ ULONG64* offset) PURE;
}

GetOffset

GetOffset 메서드는 파생 클래스의 기본 주소에서 기본 클래스의 오프셋을 반환합니다. 이러한 오프셋은 0이거나 양수 부호 없는 64비트 값일 수 있습니다.

공용 기호: IDebugHostPublic

공용 기호는 기호 파일 내의 공용 테이블에 있는 항목을 나타냅니다. 사실상 주소 내보내기입니다. 공용 기호와 연결된 형식 정보는 없으며 주소만 있습니다. 호출자가 공용 기호를 명시적으로 요청하지 않는 한 디버그 호스트는 모든 문의에 대해 프라이빗 기호를 반환하는 것을 선호합니다. 공용 기호는 다음과 같이 정의된 IDebugHostPublic 인터페이스로 표현됩니다(IDebugHostSymbol에 제네릭인 메서드 무시).

DECLARE_INTERFACE_(IDebugHostPublic, IDebugHostSymbol)
{
    STDMETHOD(GetLocationKind)(_Out_ LocationKind *locationKind) PURE;
    STDMETHOD(GetLocation)(_Out_ Location* location) PURE;
}

이러한 모든 메서드는 IDebugHostField의 해당 메서드와 의미상 동일합니다. 유일한 차이점은 GetLocationKind 메서드가 이러한 기호에 대해 LocationMember 또는 LocationConstant를 반환하지 않는다는 것입니다.

GetLocationKind

GetLocationKind 메서드는 LocationKind 열거형에 따라 기호가 있는 위치의 종류를 반환합니다. 이 열거형에 대한 설명은 IDebugHostField 설명서에서 찾을 수 있습니다.

GetLocation

주소가 있는 데이터의 경우 GetLocation 메서드는 필드의 추상 위치(주소)를 반환합니다. 지정된 공용에 정적 위치가 없으면 GetLocation 메서드가 실패합니다.

모듈 서명 및 버전 일치: IDebugHostModuleSignature

모듈 서명은 지정된 모듈이 명명 및 버전 관리와 관련된 조건 집합을 충족하는지 여부를 검사 수단을 나타냅니다. 모듈 서명은 IDebugHostSymbols의 CreateModuleSignature 메서드를 통해 만들어집니다. 모듈 이름 및 모듈의 선택적 버전 번호 범위와 일치할 수 있습니다. 이러한 서명이 만들어지면 클라이언트는 다음과 같이 정의된 IDebugHostModuleSignature 인터페이스를 받습니다.

DECLARE_INTERFACE_(IDebugHostModuleSignature, IUnknown)
{
    STDMETHOD(IsMatch)(_In_ IDebugHostModule* pModule, _Out_ bool* isMatch) PURE;
}

Ismatch

IsMatch 메서드는 특정 모듈(IDebugHostModule 기호로 제공됨)을 서명과 비교하여 모듈 이름과 버전을 서명에 표시된 이름 및 버전 범위와 비교합니다. 지정된 모듈 기호가 서명과 일치하는지 여부를 나타내는 표시가 반환됩니다.

형식 서명 및 형식 일치: IDebugHostTypeSignature

형식 서명은 지정된 형식 instance 형식 이름, 형식에 대한 제네릭 인수 및 형식이 있는 모듈에 대한 조건 집합을 충족하는지 여부를 검사 수단을 나타냅니다. 형식 서명은 IDebugHostSymbols의 CreateTypeSignature 메서드를 통해 만들어집니다. 이러한 서명이 만들어지면 클라이언트는 다음과 같이 정의된 IDebugHostTypeSignature 인터페이스를 받습니다.

DECLARE_INTERFACE_(IDebugHostTypeSignature, IUnknown)
{
    STDMETHOD(GetHashCode)(_Out_ ULONG* hashCode) PURE;
    STDMETHOD(IsMatch)(_In_ IDebugHostType* type, _Out_ bool* isMatch, _COM_Outptr_opt_ IDebugHostSymbolEnumerator** wildcardMatches) PURE;
    STDMETHOD(CompareAgainst)(_In_ IDebugHostTypeSignature* typeSignature, _Out_ SignatureComparison* result) PURE;
}

GetHashCode

GetHashCode 메서드는 형식 서명에 대한 32비트 해시 코드를 반환합니다. 디버그 호스트는 형식 인스턴스에 대해 반환된 해시 코드와 형식 서명에 대해 반환된 해시 코드 간에 구현에 동기화가 있음을 보장합니다. 전역 일치를 제외하고 형식 instance 형식 서명을 일치시킬 수 있는 경우 둘 다 동일한 32비트 해시 코드를 갖습니다. 이렇게 하면 instance 형식과 데이터 모델 관리자에 등록된 다양한 형식 서명 간에 초기 빠른 비교 및 일치가 가능합니다.

Ismatch

IsMatch 메서드는 특정 형식 instance 형식 서명에 지정된 조건과 일치하는지 여부를 나타냅니다. 이 경우 형식 시그니처의 와일드카드와 일치하는 형식 instance(기호)의 모든 특정 부분을 나타내는 열거자뿐만 아니라 이 표시가 반환됩니다.

CompareAgainst

CompareAgainst 메서드는 형식 서명을 다른 형식 서명과 비교하고 두 서명이 비교하는 방법을 반환합니다. 반환되는 비교 결과는 다음과 같이 정의된 SignatureComparison 열거형의 멤버입니다.

열거형 의미
Unrelated 비교되는 두 서명 또는 형식 간에는 관계가 없습니다.
모호함 한 서명 또는 형식은 다른 서명과 모호하게 비교됩니다. 두 형식 서명의 경우 두 서명이 동일하게 일치할 수 있는 잠재적인 형식 인스턴스가 있음을 의미합니다. 예를 들어 아래에 표시된 두 형식 서명은 모호합니다. 서명 1: std::pair<*, int> 서명 2: std::pair<int,*> instance std::pair<int, int> 형식이 둘 중 하나와 동일하게 일치하기 때문입니다(둘 다 하나의 콘크리트와 하나의 와일드카드 일치가 있음).
LessSpecific 한 서명 또는 형식은 다른 서명보다 덜 구체적입니다. 즉, 덜 구체적인 서명에는 구체적인 형식이 있는 와일드카드가 있는 경우가 많습니다. 예를 들어 아래의 첫 번째 서명은 두 번째 서명보다 덜 구체적입니다. 서명 1: std::pair<*, int> 서명 2: std::pair<int, int> 두 번째 에 구체적인 형식( *int)이 있는 와일드카드()가 있기 때문입니다.
MoreSpecific 한 서명 또는 형식이 다른 서명보다 더 구체적입니다. 즉, 보다 구체적인 시그니처에는 덜 구체적인 서명에 와일드카드가 있는 구체적인 형식이 있는 경우가 많습니다. 예를 들어 아래의 첫 번째 서명은 두 번째 서명보다 더 구체적입니다. 서명 1: std::pair<int, int> 서명 2: std::pair<*, int> 두 번째 에 와일드카드()가 있는 구체적인 형식(int)이 *있기 때문입니다.
동일한 두 서명 또는 형식이 동일합니다.

참고 항목

이 항목은 C++에서 액세스할 수 있는 인터페이스, 이를 사용하여 C++ 기반 디버거 확장을 빌드하는 방법, C++ 데이터 모델 확장에서 다른 데이터 모델 구문(예: JavaScript 또는 NatVis)을 사용하는 방법을 설명하는 시리즈의 일부입니다.

디버거 데이터 모델 C++ 개요

디버거 데이터 모델 C++ 인터페이스

디버거 데이터 모델 C++ 개체

디버거 데이터 모델 C++ 추가 인터페이스

디버거 데이터 모델 C++ 개념

디버거 데이터 모델 C++ 스크립팅