다음을 통해 공유


In-Process Side-by-Side 프로파일링

.NET Framework 4부터는 .NET Framework의 여러 버전이 동일한 프로세스에서 함께 실행될 수 있습니다. 이러한 환경에서 프로파일러가 실행되려면 side-by-side 실행을 인식해야 합니다. .NET Framework 버전 2.0, .NET Framework 2.0 SP1, .NET Framework 3.0, .NET Framework 3.5 또는 .NET Framework 3.5 SP1과 함께 사용하도록 설계된 프로파일러는 프로파일링 대상 프로세스가 .NET Framework의 여러 버전을 호스팅하지 않는 경우 .NET Framework 버전 4에서 사용할 수 있습니다. in-process side-by-side 프로파일링을 사용하는 방법에 대한 자세한 내용은 프로파일러 호환성 설정을 참조하십시오.

Side-by-Side 인식

여러 런타임을 로드하는 응용 프로그램으로 인해 액세스 위반 같은 예기치 않은 손상이 발생하지 않도록 하는 프로파일러는 side-by-side 실행을 인식할 수 있습니다. Side-by-side 인식은 다음과 같은 지원 수준을 포함합니다.

  • 첫 번째 로드된 버전 프로파일링. 프로세스로 로드된 첫 번째 CLR(공용 언어 런타임)이 프로파일링되고 나중에 로드되는 CLR 버전은 프로파일링되지 않습니다. 프로파일러는 해당 COM 클래스 팩터리 개체에 대해 CreateInstance가 여러 번 호출되도록 준비해야 하지만 해당 COM 개체의 여러 인스턴스에 대해 콜백을 동시에 사용할 수 있도록 지원할 필요는 없습니다. 프로파일러는 첫 번째 클래스 팩터리 CreateInstance 호출 및 Initialize 콜백 호출만 받아들이고 나머지는 거부합니다.

  • 한 버전 프로파일링. 첫 번째 로드된 버전 프로파일링과 유사합니다. 그러나 로드된 첫 번째 CLR 버전을 프로파일링하는 대신 프로파일링 대상 CLR 버전을 사용자가 선택할 수 있다는 점에서 차이가 있습니다.

  • 여러 버전 프로파일링. 사용자는 프로파일링할 CLR 버전을 하나 이상 또는 모두 선택할 수 있습니다. 프로파일러는 CLR 버전의 콜백을 사용하여 해당 버전에 대해 Info 함수를 호출합니다. 이렇게 하려면 프로파일러는 어느 런타임 항목(함수, 응용 프로그램 도메인, 클래스, 개체 등)이 어떤 CLR에 속하는지 추적해야 합니다.

참고참고

.NET Framework 4용으로 디자인된 프로파일러는 side-by-side 실행을 인식해야 합니다.즉, ICorProfilerCallback3 인터페이스를 구현하는 프로파일러는 위에서 언급한 지원 수준(첫 번째 로드된 버전 프로파일링, 한 버전 프로파일링, 여러 버전 프로파일링) 중 하나를 구현하여 여러 개의 런타임으로 인해 프로파일러의 예기치 않은 손상이 발생하지 않도록 해야 합니다.

여러 버전 프로파일링 지원 관련 요구 사항

여러 버전 프로파일링 옵션을 지원하려면 프로파일러가 다음을 수행할 수 있어야 합니다.

  • 전역 함수 호출을 올바른 런타임과 연결합니다.

  • 다양한 ID(예: ObjectID, FunctionID, ClassID, ModuleID, AssemblyID, AppDomainID)를 올바른 런타임과 연결하고, 특정 런타임의 ID가 다른 런타임의 ICorProfilerCallback(2,3) 인터페이스에 전달되지 않도록 합니다. 그러나 명령 포인터를 런타임 또는 네이티브 코드에서 런타임의 ICorProfilerInfo::GetFunctionFromIP 메서드 구현으로 전달하는 것은 가능합니다.

  • 런타임 간의 상호 작용(예: 특정 런타임에서 다른 런타임으로 전달되는 호출 스택)을 처리합니다.

  • ICorProfilerCallback(2,3)을 구현하는 클래스의 여러 인스턴스가 동일한 프로세스에서 활성화되도록 처리합니다.

일반적으로 프로파일러는 전역 함수 구현 및 여러 개의 데이터 확장 런타임에 대한 처리를 담당하는 단일 프로파일러 관리자 개체를 제공합니다. 예를 들면 다음과 같습니다.

또한 프로파일러는 ICorProfilerCallback 인터페이스를 구현하는 프로파일러 개체를 제공해야 합니다. CLR에서는 각 활성 런타임별로 이 프로파일러 개체를 한 번씩 인스턴스화합니다. 프로파일러 관리자는 프로파일러에서 액세스해야 하는 유일한 전역 개체입니다. 프로세스에 여러 런타임이 포함되어 있으면 ICorProfilerCallback 구현의 여러 인스턴스가 활성화될 수 있기 때문에 프로파일러는 해당 ICorProfilerCallback 구현에 대한 전역 참조를 유지하지 않아야 합니다.

프로파일러 활성화

프로파일러 활성화를 위한 기본 작업은 프로파일러를 런타임 버전과 연결하는 것입니다.

프로파일러 시작

해당 프로세스의 모든 런타임에서 프로파일러를 시작하려면 COR_PROFILER 및 COR_ENABLE_PROFILING 환경 변수를 설정합니다. 이 절차는 .NET Framework 3.5 이하 버전에서의 절차와 동일합니다.

특정 런타임에서만 프로파일러를 시작하려면 COR_PROFILER 및 COR_ENABLE_PROFILING 환경 변수를 설정하고 다음 중 하나를 수행합니다.

  • 클래스 팩터리 개체에 대한 첫 번째 CreateInstance 호출을 제외한 모든 호출이 실패하도록 합니다(첫 번째 로드된 버전 프로파일링).

    -또는-

  • 클래스 팩터리 개체에 대한 모든 CreateInstance 호출을 허용하고, Initialize 호출에서 호출 런타임의 버전을 확인합니다. 이렇게 하려면 다음 두 작업을 수행해야 합니다.

    • CLR의 QueryInterface 메서드를 ICorProfilerInfo3 인터페이스에 대해 실행합니다. 실행에 실패하는 경우 런타임 버전은 1 또는 2.0입니다. ICorProfilerInfo2 인터페이스에 대해 QueryInterface를 실행하면 해당 런타임이 버전 2.0 런타임인지 또는 버전 1.0 런타임인지 알 수 있습니다.

    • ICorProfilerInfo3이 지원되면 GetRuntimeInformation 메서드를 호출하여 프로파일링 대상 런타임에 대한 자세한 정보를 가져옵니다.

    런타임 버전이 확인되면 해당 런타임을 프로파일링할지 여부를 프로파일러에서 결정할 수 있습니다. 런타임 버전이 확인된 경우 정상적으로 초기화를 계속하고, 그렇지 않으면 Initialize에서 오류를 반환합니다. .NET Framework 4부터는 오류가 Windows 응용 프로그램 이벤트 로그에 기록되지 않도록 하기 위해 프로파일러에서 CORPROF_E_PROFILER_CANCEL_ACTIVATION HRESULT를 반환할 수 있습니다.

프로파일러 연결

연결 트리거 프로세스는 다음을 수행합니다.

프로파일러 연결에 대한 자세한 내용은 프로파일러 연결 및 분리를 참조하십시오.

참고 항목

개념

프로파일링 개요

기타 리소스

.NET Framework 4에서 프로파일링

관리되지 않는 API 참조