프로파일링 API의 개체 검사
이 항목에서는 프로파일링 방법을 사용하여 개체를 검사하는 방식에 대해 설명합니다.
FunctionEnter2 콜백과 FunctionLeave2 콜백
FunctionEnter2 및 FunctionLeave2 콜백에서는 함수의 인수 및 반환 값에 대한 정보를 메모리의 영역으로 제공합니다. 인수는 지정한 메모리 영역에서 왼쪽에서 오른쪽으로 순서대로 저장됩니다. 프로파일러에서는 다음 표에 표시된 대로 함수의 메타데이터 시그니처를 사용하여 인수를 해석할 수 있습니다.
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::GetContextStaticAddress 및 ICorProfilerInfo2::GetRVAStaticAddress 메서드에서는 정적 필드의 위치에 대한 정보를 제공합니다. 해당 위치에서 메모리를 보면 다음과 같이 해석할 수 있습니다.
참조 형식: ObjectID
값 형식: 실제 값을 포함하는 상자의 ObjectID
기본 형식: 기본 형식 값
참조
ICorProfilerInfo2::GetClassLayout 메서드
ICorProfilerInfo2::GetBoxClassLayout 메서드
ICorProfilerInfo2::GetStringLayout 메서드
ICorProfilerInfo2::GetArrayObjectInfo 메서드
ICorProfilerInfo2::GetThreadStaticAddress 메서드
ICorProfilerInfo2::GetAppDomainStaticAddress 메서드
ICorProfilerInfo2::GetContextStaticAddress 메서드
ICorProfilerInfo2::GetRVAStaticAddress 메서드