다음을 통해 공유


프로파일링 환경 설정

비고

.NET Framework 4에서 프로파일링에 상당한 변화가 있었습니다.

관리 프로세스(애플리케이션 또는 서비스)가 시작되면 CLR(공용 언어 런타임)을 로드합니다. CLR이 초기화되면 다음 두 환경 변수를 평가하여 프로세스가 프로파일러에 연결되어야 하는지 여부를 결정합니다.

  • COR_ENABLE_PROFILING: CLR은 이 환경 변수가 존재하고 1로 설정된 경우에만 프로파일러에 연결합니다.

  • COR_PROFILER: COR_ENABLE_PROFILING 검사가 통과하면 CLR은 이전에 레지스트리에 저장되어 있어야 하는 이 CLSID 또는 ProgID가 있는 프로파일러에 연결합니다. COR_PROFILER 환경 변수는 다음 두 예제와 같이 문자열로 정의됩니다.

    set COR_PROFILER={32E2F4DA-1BEA-47ea-88F9-C5DAF691C94A}
    set COR_PROFILER="MyProfiler"
    

CLR 애플리케이션을 프로파일하려면 애플리케이션을 실행하기 전에 COR_ENABLE_PROFILING 및 COR_PROFILER 환경 변수를 설정해야 합니다. 또한 프로파일러 DLL이 등록되어 있는지 확인해야 합니다.

비고

.NET Framework 4부터 프로파일러를 등록할 필요가 없습니다.

비고

.NET Framework 4 이상 버전에서 .NET Framework 버전 2.0, 3.0 및 3.5 프로파일러를 사용하려면 COMPLUS_ProfAPI_ProfilerCompatibilitySetting 환경 변수를 설정해야 합니다.

환경 변수 범위

COR_ENABLE_PROFILING 및 COR_PROFILER 환경 변수를 설정하는 방법에 따라 영향 범위가 결정됩니다. 다음 방법 중 하나로 이러한 변수를 설정할 수 있습니다.

  • ICorDebug::CreateProcess 호출에서 변수를 설정하는 경우 해당 변수는 당시 실행 중인 애플리케이션에만 적용됩니다. (환경을 상속하는 해당 애플리케이션에서 시작한 다른 애플리케이션에도 적용됩니다.)

  • 명령 프롬프트 창에서 변수를 설정하면 해당 창에서 시작된 모든 애플리케이션에 해당 변수가 적용됩니다.

  • 사용자 수준에서 변수를 설정하면 파일 탐색기에서 시작하는 모든 애플리케이션에 해당 변수가 적용됩니다. 변수를 설정한 후 연 명령 프롬프트 창에는 이러한 환경 설정이 있으며 해당 창에서 시작하는 모든 애플리케이션도 마찬가지입니다. 사용자 수준에서 환경 변수를 설정하려면 내 컴퓨터를 마우스 오른쪽 단추로 클릭하고 속성을 클릭한 다음 고급 탭을 클릭하고 환경 변수를 클릭한 다음 변수를 사용자 변수 목록에 추가합니다.

  • 컴퓨터 수준에서 변수를 설정하면 해당 컴퓨터에서 시작된 모든 애플리케이션에 해당 변수가 적용됩니다. 해당 컴퓨터에서 여는 명령 프롬프트 창에는 이러한 환경 설정이 있으므로 해당 창에서 시작하는 모든 애플리케이션도 마찬가지입니다. 즉, 해당 컴퓨터의 모든 관리 프로세스는 프로파일러로 시작됩니다. 컴퓨터 수준에서 환경 변수를 설정하려면 내 컴퓨터를 마우스 오른쪽 단추로 클릭하고 속성을 클릭하고 고급 탭을 클릭한 다음 환경 변수를 클릭하고 시스템 변수 목록에 변수 를 추가한 다음 컴퓨터를 다시 시작합니다. 다시 시작한 후 변수는 시스템 전체에서 사용할 수 있습니다.

Windows 서비스를 프로파일링하는 경우 환경 변수를 설정하고 프로파일러 DLL을 등록한 후 컴퓨터를 다시 시작해야 합니다. 이러한 고려 사항에 대한 자세한 내용은 Windows 서비스 프로파일링 섹션을 참조하세요.

추가 고려 사항

  • 프로파일러 클래스는 ICorProfilerCallbackICorProfilerCallback2 인터페이스를 구현합니다. .NET Framework 버전 2.0에서는 프로파일러가 .를 구현 ICorProfilerCallback2해야 합니다. 그렇지 ICorProfilerCallback2 않으면 로드되지 않습니다.

  • 지정된 환경에서 한 번에 하나의 프로파일러만 프로세스를 프로파일러할 수 있습니다. 서로 다른 환경에서 두 개의 서로 다른 프로파일러를 등록할 수 있지만 각각은 별도의 프로세스를 프로파일러해야 합니다. 프로파일러가 프로파일링되는 프로세스와 동일한 주소 공간에 매핑되는 In-process COM 서버 DLL로 구현되어야 합니다. 즉, 프로파일러가 프로세스에서 실행됩니다. .NET Framework는 다른 유형의 COM 서버를 지원하지 않습니다. 예를 들어 프로파일러가 원격 컴퓨터에서 애플리케이션을 모니터링하려는 경우 각 컴퓨터에서 수집기 에이전트를 구현해야 합니다. 이러한 에이전트는 결과를 일괄 처리하고 중앙 데이터 수집 컴퓨터에 전달합니다.

  • 프로파일러가 프로세스에서 인스턴스화되는 COM 개체이므로 프로파일러가 있는 각 애플리케이션에는 프로파일러의 자체 복사본이 있습니다. 따라서 단일 프로파일러 인스턴스는 여러 애플리케이션의 데이터를 처리할 필요가 없습니다. 그러나 프로파일러의 로깅 코드에 논리를 추가하여 다른 프로파일된 애플리케이션의 로그 파일 덮어쓰기를 방지해야 합니다.

프로파일러 초기화

두 환경 변수 검사가 모두 통과하면 CLR은 COM CoCreateInstance 함수와 비슷한 방식으로 프로파일러의 인스턴스를 만듭니다. 프로파일러가 직접 호출 CoCreateInstance을 통해 로드되지 않습니다. 따라서 스레딩 모델을 설정해야 하는 호출 CoInitialize은 방지됩니다. 그런 다음 CLR은 프로파일러에서 ICorProfilerCallback::Initialize 메서드를 호출합니다. 이 메서드의 서명은 다음과 같습니다.

HRESULT Initialize(IUnknown *pICorProfilerInfoUnk)

프로파일러는 나중에 프로파일링 중에 추가 정보를 요청할 수 있도록 ICorProfilerInfo 또는 ICorProfilerInfo2 인터페이스 포인터를 쿼리 pICorProfilerInfoUnk 하고 저장해야 합니다.

이벤트 알림 설정

그런 다음 프로파일러는 ICorProfilerInfo::SetEventMask 메서드를 호출하여 관심 있는 알림 범주를 지정합니다. 예를 들어 프로파일러가 함수 Enter 및 Leave 알림 및 가비지 수집 알림에만 관심이 있는 경우 다음을 지정합니다.

ICorProfilerInfo* pInfo;
pICorProfilerInfoUnk->QueryInterface(IID_ICorProfilerInfo, (void**)&pInfo);
pInfo->SetEventMask(COR_PRF_MONITOR_ENTERLEAVE | COR_PRF_MONITOR_GC)

이러한 방식으로 알림 마스크를 설정하면 프로파일러가 수신하는 알림을 제한할 수 있습니다. 이 방법은 사용자가 단순 또는 특수 용도 프로파일러를 빌드하는 데 도움이 됩니다. 또한 프로파일러가 무시한다는 알림을 보내는 데 낭비되는 CPU 시간을 줄입니다.

특정 프로파일러 이벤트는 변경할 수 없습니다. 즉, 이러한 이벤트가 콜백에 ICorProfilerCallback::Initialize 설정되는 즉시 해제할 수 없으며 새 이벤트를 켤 수 없습니다. 변경할 수 없는 이벤트를 변경하려고 하면 실패한 HRESULT가 반환됩니다 ICorProfilerInfo::SetEventMask .

Windows 서비스 프로파일링

Windows 서비스를 프로파일링하는 것은 공용 언어 런타임 애플리케이션을 프로파일링하는 것과 같습니다. 두 프로파일링 작업은 모두 환경 변수를 통해 사용하도록 설정됩니다. 운영 체제가 시작될 때 Windows 서비스가 시작되므로 이 항목의 앞부분에 설명된 환경 변수가 이미 존재하고 시스템이 시작되기 전에 필요한 값으로 설정해야 합니다. 또한 프로파일링 DLL은 시스템에 이미 등록되어 있어야 합니다.

COR_ENABLE_PROFILING 설정하고 환경 변수를 COR_PROFILER 프로파일러 DLL을 등록한 후에는 Windows 서비스에서 해당 변경 내용을 검색할 수 있도록 대상 컴퓨터를 다시 시작해야 합니다.

이러한 변경 내용을 통해 시스템 전체에서 프로파일링을 사용할 수 있습니다. 이후에 실행되는 모든 관리되는 애플리케이션이 프로파일되지 않도록 하려면 대상 컴퓨터를 다시 시작한 후 시스템 환경 변수를 삭제해야 합니다.

또한 이 기술은 모든 CLR 프로세스를 프로파일로 연결합니다. 프로파일러는 ICorProfilerCallback::Initialize 콜백에 논리를 추가하여 현재 프로세스가 관심 있는지 여부를 검색해야 합니다. 그렇지 않은 경우 프로파일러가 초기화를 수행하지 않고 콜백에 실패할 수 있습니다.

참고하십시오