다음을 통해 공유


프로파일링 API의 개체 검사

이 항목에서는 프로파일링 방법을 사용하여 개체를 검사하는 방식에 대해 설명합니다.

FunctionEnter2 콜백과 FunctionLeave2 콜백

FunctionEnter2FunctionLeave2 콜백에서는 함수의 인수 및 반환 값에 대한 정보를 메모리의 영역으로 제공합니다. 인수는 지정한 메모리 영역에서 왼쪽에서 오른쪽으로 순서대로 저장됩니다. 프로파일러에서는 다음 표에 표시된 대로 함수의 메타데이터 시그니처를 사용하여 인수를 해석할 수 있습니다.

ELEMENT_TYPE

표현

기본 형식(ELEMENT_TYPE <= R8, I, U)

기본 형식 값

값 형식(VALUETYPE)

형식에 따라 다름

참조 형식(CLASS, STRING, OBJECT, ARRAY, GENERICINST, SZARRAY)

ObjectID(가비지 수집 힙에 대한 포인터)

BYREF

관리되는 포인터(ObjectID는 아니지만 스택 또는 가비지 수집 힙을 가리킬 수 있음)

PTR

관리되지 않는 포인터(가비지 수집으로 이동할 수 없음)

FNPTR

포인터 크기의 불분명한 값

TYPEDBYREF

관리되는 포인터, 포인터 크기의 불분명한 값이 차례대로 나옴

ObjectID 및 관리되는 포인터 간의 차이점은 다음과 같습니다.

  • ObjectID는 가비지 수집 힙 또는 고정 개체 힙만 가리키지만 관리되는 포인터는 스택도 가리킬 수 있습니다.

  • ObjectID는 항상 개체의 시작 부분을 가리키지만 관리되는 포인터는 개체의 필드 중 하나를 가리킬 수 있습니다.

  • ObjectID를 사용해야 하는 함수에 관리되는 포인터를 전달하면 안 됩니다.

사용 가능한 CLR 형식의 목록에 대해서는 CorElementType 열거형을 참조하십시오.

복합 형식 검사

참조 형식 또는 기본 형식이 아닌 값 형식을 검사하려면 몇 가지 고급 기술이 필요합니다.

문자열 또는 배열 이외의 값 형식 및 참조 형식의 경우 ICorProfilerInfo2::GetClassLayout 메서드에서 각 필드에 대한 오프셋을 제공합니다. 그런 다음 프로파일러에서 메타데이터를 사용하여 필드의 형식을 결정하고 필드를 재귀적으로 확인할 수 있습니다.

참고참고

GetClassLayout은 클래스 자체에 정의된 필드만 반환하므로 부모 클래스에 정의된 필드는 포함되지 않습니다.ICorProfilerInfo2::GetClassIDInfo2 메서드를 사용하여 부모 클래스의 ClassID를 찾은 다음 GetClassLayout을 사용하여 부모 클래스에 정의된 필드에 대한 정보를 가져올 수 있습니다.

boxed 값 형식의 경우 ICorProfilerInfo2::GetBoxClassLayout 메서드에서 상자 내의 값 형식에 대한 오프셋을 제공합니다. 값 형식 자체의 레이아웃은 변경되지 않습니다. 따라서 프로파일러가 상자 내에서 값 형식을 찾는 즉시 GetClassLayout 메서드를 사용하여 해당 레이아웃을 파악할 수 있습니다.

문자열의 경우 ICorProfilerInfo2::GetStringLayout 메서드에서 특정 문자열 개체 데이터에 대한 오프셋을 제공합니다.

배열의 경우는 다소 특수해서 각 배열 형식이 아닌 각 배열 개체에 대해 메서드를 호출해야 합니다. 그 이유는 배열 형식이 너무 많아서 오프셋을 사용하여 설명할 수 없기 때문입니다. ICorProfilerInfo2::GetArrayObjectInfo 메서드는 이러한 해석을 수행하기 위해 제공됩니다.

정적 필드 검사

네 가지 형식의 정적 필드가 있습니다. 다음 표에서는 각 형식에 대한 정의와 이들을 식별하는 방법에 대해 설명합니다.

정적 형식

정의

메타데이터에서 표시되는 방식

AppDomain

기본 정적 필드입니다. 각 응용 프로그램 도메인에서 서로 다른 값을 가집니다.

연결된 사용자 지정 특성이 없는 정적 필드

Thread

관리되는 TLS(스레드 로컬 저장소)입니다. 각 스레드 및 각 응용 프로그램 도메인에 대해 고유한 값을 가지는 정적 필드입니다.

ThreadStaticAttribute로 표시된 정적 필드

RVA

모듈의 데이터 섹션에 홈이 있는 프로세스 범위의 정적 필드입니다.

hasRVA 플래그가 있는 정적 필드

컨텍스트

각 COM+ 컨텍스트에서 서로 다른 값을 가지는 정적 필드입니다.

ContextStaticAttribute로 표시된 정적 필드

ICorProfilerInfo2::GetThreadStaticAddress, ICorProfilerInfo2::GetAppDomainStaticAddress, ICorProfilerInfo2::GetContextStaticAddressICorProfilerInfo2::GetRVAStaticAddress 메서드에서는 정적 필드의 위치에 대한 정보를 제공합니다. 해당 위치에서 메모리를 보면 다음과 같이 해석할 수 있습니다.

  • 참조 형식: ObjectID

  • 값 형식: 실제 값을 포함하는 상자의 ObjectID

  • 기본 형식: 기본 형식 값

참조

FunctionEnter2 함수

FunctionLeave2 함수

ICorProfilerInfo2::GetClassLayout 메서드

ICorProfilerInfo2::GetBoxClassLayout 메서드

ICorProfilerInfo2::GetStringLayout 메서드

ICorProfilerInfo2::GetArrayObjectInfo 메서드

ICorProfilerInfo2::GetThreadStaticAddress 메서드

ICorProfilerInfo2::GetAppDomainStaticAddress 메서드

ICorProfilerInfo2::GetContextStaticAddress 메서드

ICorProfilerInfo2::GetRVAStaticAddress 메서드

참고 항목

개념

프로파일링 개요