다음을 통해 공유


프로파일링 API 정보

업데이트: 2007년 11월

프로파일러는 다른 응용 프로그램의 실행 상태를 모니터링하는 도구입니다. CLR(공용 언어 런타임) 프로파일러는 프로파일링 API를 사용하여 CLR과 메시지를 주고받는 함수로 이루어진 DLL(동적 연결 라이브러리)입니다. 프로파일러 DLL은 런타임에 CLR에서 로드됩니다.

일반적인 프로파일링 도구에서는 주로 응용 프로그램 실행을 측정합니다. 즉 각 함수에 사용된 시간이나 응용 프로그램의 메모리 사용량을 시간 경과에 따라 측정합니다. 프로파일링 API에서는 코드 검사 유틸리티 및 고급 디버깅 지원과 같은 다양한 진단 도구를 대상으로 합니다. 이러한 도구는 기본적으로 모두 진단을 위해 사용됩니다. 프로파일링 API에서는 응용 프로그램의 실행을 측정할 뿐 아니라 모니터링하기도 합니다. 따라서 프로파일링 API를 응용 프로그램 자체에서 사용하면 안 되며 응용 프로그램의 실행이 프로파일러에 종속되거나 프로파일러의 영향을 받아서는 안 됩니다.

CLR 응용 프로그램을 프로파일링하려면 기존의 컴파일된 기계어 코드를 프로파일링하는 것 이상의 지원이 필요합니다. 이는 CLR에 응용 프로그램 도메인, 가비지 수집, 관리되는 예외 처리, 코드의 JIT(Just-In-Time ) 컴파일(MSIL(Microsoft Intermediate Language) 코드를 네이티브 기계어 코드로 변환) 등과 같은 개념이 새로 추가되었기 때문입니다. 기존의 프로파일링 메커니즘에서는 이러한 기능에 대한 유용한 정보를 식별하거나 제공할 수 없습니다. 프로파일링 API에서는 이러한 누락된 정보를 효율적으로 제공하면서도 CLR 및 프로파일링된 응용 프로그램의 성능에 미치는 영향을 최소화합니다.

런타임에 JIT 컴파일을 사용하면 프로파일링을 효율적으로 수행할 수 있습니다. 프로파일링 API를 사용하면 프로파일러에서 루틴이 JIT 컴파일되기 전에 루틴의 메모리 내 MSIL 코드 스트림을 변경할 수 있습니다. 이러한 방식으로 프로파일러는 더 세부적인 조사가 필요한 특정 루틴에 계측 코드를 동적으로 추가할 수 있습니다. 이러한 방법은 기존 시나리오에서도 가능하지만 CLR에서 프로파일링 API를 사용하여 구현하는 것이 훨씬 간단합니다.

프로파일링 API

일반적으로 프로파일링 API는 관리되는 응용 프로그램의 실행을 모니터링하는 프로그램인 코드 프로파일러를 작성하는 데 사용됩니다.

프로파일링 API는 프로파일링되는 응용 프로그램과 같은 프로세스로 로드되는 프로파일러 DLL에서 사용됩니다. 프로파일러 DLL에서는 콜백 인터페이스(.NET Framework 버전 1.0 및 1.1의 경우 ICorProfilerCallback, 버전 2.0의 경우 ICorProfilerCallback2)를 구현합니다. CLR에서는 해당 인터페이스의 메서드를 호출하여 프로파일링된 프로세스의 이벤트에 대해 프로파일러에 알려 줍니다. 프로파일러는 ICorProfilerInfoICorProfilerInfo2 인터페이스의 메서드를 통해 런타임으로 다시 호출하여 프로파일링된 응용 프로그램의 상태에 대한 정보를 가져올 수 있습니다.

참고

프로파일러 솔루션의 데이터 수집 부분만 프로파일링된 응용 프로그램과 같은 프로세스에서 실행되고 있어야 합니다. 모든 사용자 인터페이스 및 데이터 분석은 별도의 프로세스에서 수행되어야 합니다.

다음 그림에서는 프로파일러 DLL이 프로파일링되는 응용 프로그램 및 CLR과 상호 작용하는 방법을 보여 줍니다.

프로파일링 아키텍처

프로파일링 아키텍처

알림 인터페이스

ICorProfilerCallbackICorProfilerCallback2는 알림 인터페이스라고 할 수 있습니다. 이러한 인터페이스는 ClassLoadStarted, ClassLoadFinishedJITCompilationStarted와 같은 메서드로 구성됩니다. CLR에서는 클래스를 로드 또는 언로드하고 함수를 컴파일하는 등의 작업을 수행할 때마다 프로파일러의 ICorProfilerCallback 또는 ICorProfilerCallback2 인터페이스에서 해당하는 메서드를 호출합니다.

예를 들어 프로파일러에서는 FunctionEnter2FunctionLeave2라는 두 가지 알림 함수를 통해 코드 성능을 측정할 수 있습니다. 여기서는 단지 각 알림에 타임스탬프를 기록하고, 결과를 누적하며, 응용 프로그램 실행 동안 가장 많은 CPU 또는 벽 시계 시간(wall-clock time)을 사용한 함수를 나타내는 목록을 출력합니다.

정보 검색 인터페이스

프로파일링과 관련된 다른 주요 인터페이스는 ICorProfilerInfoICorProfilerInfo2입니다. 프로파일러에서는 필요에 따라 이러한 인터페이스를 호출하여 분석에 도움이 되는 추가 정보를 가져옵니다. 예를 들어 CLR에서는 FunctionEnter2 함수를 호출할 때마다 함수 식별자를 제공합니다. 프로파일러에서는 ICorProfilerInfo2::GetFunctionInfo2 메서드를 호출하여 함수의 부모 클래스, 이름 등을 검색함으로써 해당 함수에 대한 추가 정보를 가져올 수 있습니다.

참고 항목

기타 리소스

.NET Framework에서 프로파일링

프로파일링 개요