.NET Framework 2.0의 프로파일링

.NET Framework 버전 2.0의 프로파일링 API는 기능이 추가되어 성능이 향상되었습니다. 새 기능은 두 개의 새로운 메서드인 ICorProfilerCallback2ICorProfilerInfo2를 통해 노출됩니다.

.NET Framework 버전 1.0 또는 1.1용으로 작성된 프로파일러 DLL은 .NET Framework 2.0 CLR(공용 언어 런타임) 환경에서 올바로 작동하지 않습니다. 이 프로파일러 DLL을 버전 2.0 이상에서 작동하도록 업데이트하려면 ICorProfilerCallback2 인터페이스를 구현해야 합니다. ICorProfilerInfo2 인터페이스는 ICorProfilerInfo 인터페이스에서 상속되며 CLR과의 상호 작용을 향상하는 새 메서드를 추가합니다.

다음 단원에서는 이러한 변경 내용에 대해 설명합니다.

  • 제네릭

  • 코드 분할

  • In-Process 디버깅 제거

  • 네이티브 이미지 생성기를 사용한 콜백

  • 향상된 가비지 수집 콜백

  • 고정 개체

  • 기타 API 변경 내용

API가 변경되었을 뿐만 아니라 새 HRESULT인 CORPROF_E_UNSUPPORTED_CALL_SEQUENCE가 추가되었습니다. 이 HRESULT가 반환될 수 있는 시나리오에 대한 자세한 내용은 CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT를 참조하십시오.

제네릭

런타임에 제네릭이 도입되어 프로파일링 API에서 다음 세 가지 사항이 변경되었습니다.

  • typedef 토큰과 ClassID 값 사이 또는 MethodDef 토큰과 FunctionID 값 사이에 일대일 매핑이 더 이상 없습니다. 이는 각 클래스 또는 함수가 여러 다른 형식에 대해 인스턴스화될 수 있기 때문입니다. 프로파일러 작성자는 프로파일링 및 런타임 알림 ID를 참고하여 코드에서 ICorProfilerInfo::GetClassFromTokenICorProfilerInfo::GetFunctionFromToken 메서드가 사용되는 방법을 검토하고 제네릭을 인식하는 코드로 다시 작성해야 합니다. 프로파일링 API에서는 제네릭을 지원하는 ICorProfilerInfo2::GetClassFromTokenAndTypeArgsICorProfilerInfo2::GetFunctionFromTokenAndTypeArgs라는 두 개의 새 메서드를 제공합니다.

  • FunctionID와 여기에 포함된 ClassID 사이에 직접 매핑이 더 이상 없습니다. 코드 공유 최적화를 사용하여 제네릭 형식의 여러 인스턴스에서 코드를 공유하도록 설정할 수 있습니다. FunctionID를 함수의 특정 활성화 컨텍스트에서 검사하는 경우에만 해당 ClassID를 확인할 수 있습니다.

  • ICorProfilerInfo 인터페이스의 기존 클래스 및 함수 정보 메서드에서는 제네릭 형식 및 함수의 형식 인수에 대한 정보를 제공하지 않습니다. 이러한 용도로 ICorProfilerInfo2::GetClassIDInfo2ICorProfilerInfo2::GetFunctionInfo2 메서드가 제공되었습니다. 이러한 메서드에서 이 정보를 항상 제공할 수 있는 것은 아닙니다. 자세한 내용은 프로파일링 및 런타임 알림 ID를 참조하십시오.

맨 위로 이동

코드 분할

.NET Framework의 어셈블리는 성능이 최적화되었습니다. 미리 컴파일된 네이티브 코드는 함수당 여러 영역으로 분할되었습니다. 따라서 기존 ICorProfilerInfo::GetCodeInfo 메서드에서는 더 이상 함수의 네이티브 코드 범위를 올바로 설명할 수 없습니다. 프로파일러에서는 보다 일반적인 ICorProfilerInfo2::GetCodeInfo2 메서드를 대신 사용해야 합니다.

맨 위로 이동

In-Process 디버깅 제거

.NET Framework 2.0에서는 in-process 디버깅이 프로파일링 API와 일관성이 있는 기능 집합으로 바뀌었습니다. 스택 스냅숏(프로파일링 개요 참조)과 개체 검사 기능이 그 결과물입니다.

맨 위로 이동

네이티브 이미지 생성기를 사용한 콜백

네이티브 이미지 생성기(NGen.exe)가 대단히 최적화되어 보다 많은 작업이 런타임에서 네이티브 이미지 생성 시간으로 이동되었습니다. 이로 인해 프로파일링 API의 동작이 다음과 같이 변경되었습니다.

  • 대부분의 함수의 경우 더 이상 네이티브 이미지에서 JITCachedFunctionSearch 콜백을 받지 않습니다. 프로파일러에서는 콜백을 사용하는 방법에 따라 다음 두 가지 옵션을 선택할 수 있습니다.

    • 프로파일러에서 콜백을 사용하여 함수에 대한 정보를 수집하는 경우에는 프로그램 실행 동안 지정된 함수를 처음 발견할 때만 해당 함수에 대한 정보를 수집하는 체계로 전환할 수 있습니다.

    • 프로파일러에서 콜백을 사용하여 함수가 계측을 위해 강제로 JIT(Just-In-Time) 컴파일되도록 하는 경우 대신 프로파일러 확장 이미지를 사용할 수 있습니다. 자세한 내용은 프로파일링 API의 코드 생성을 참조하십시오.

  • 대부분의 형식의 경우 더 이상 네이티브 이미지에서 ClassLoad 콜백을 받지 않습니다. 프로파일러에서는 이러한 클래스에 대해 런타임 계산 기술(지연 계산이라고도 함)을 사용해야 합니다. 이미 프로파일러 확장 네이티브 이미지를 사용하고 있는 프로파일러는 동작을 변경할 필요가 없습니다. 그러나 프로파일러 확장 네이티브 이미지는 일반 이미지와 상당히 다르므로 이러한 이미지가 필요한 다른 이유가 있는 경우 외에는 프로파일러에서 프로파일러 확장 네이티브 이미지로 전환하지 말아야 합니다.

맨 위로 이동

향상된 가비지 수집 콜백

가비지 수집 콜백이 여러 가지 면에서 향상되었습니다. 이제 콜백에서는 가비지 수집 핸들이 만들어지거나 소멸되었음을 프로파일러에 알리고, 종료할 개체의 큐에 대한 정보를 제공하고, Collect 메서드를 사용하여 가비지 수집을 강제로 실행할 수 있습니다. ICorProfilerCallback::RootReferences가 확장된 ICorProfilerCallback2::RootReferences2 메서드에서는 각 루트의 형식에 대한 정보를 제공합니다. 마지막으로 ICorProfilerCallback2::SurvivingReferences 메서드에서는 비압축 가비지 수집으로 발생하는 힙의 개체 레이아웃을 보고합니다.

맨 위로 이동

고정 개체

.NET Framework 2.0에서 새로 추가된 고정 개체는 네이티브 이미지 생성 시간에 초기화되어 네이티브 이미지로 지정되는 상수 개체입니다. 고정 개체는 가비지 수집에 의해 재배치되지 않지만 가비지 수집 개체에서 참조될 수 있습니다. 새 ICorProfilerInfo2::EnumModuleFrozenObjects 메서드를 사용하면 프로파일러에서 고정 개체를 열거할 수 있습니다.

맨 위로 이동

기타 API 변경 내용

.NET Framework 2.0에서는 다음과 같은 API 변경 내용도 도입되었습니다.

맨 위로 이동

참고 항목

개념

프로파일링 개요