ICorProfilerCallback::JITCompilationStarted 메서드

JIT(Just-In-Time) 컴파일러가 함수 컴파일을 시작했음을 프로파일러에 알립니다.

구문

HRESULT JITCompilationStarted(
    [in] FunctionID functionId,
    [in] BOOL       fIsSafeToBlock);

매개 변수

functionId [in] 컴파일이 시작되는 함수의 ID입니다.

fIsSafeToBlock [in] 차단이 런타임 작업에 영향을 줄지 여부를 프로파일러에 나타내는 값입니다. 차단으로 인해 런타임이 호출 스레드가 이 콜백에서 반환될 때까지 기다릴 수 있는 경우 이 값은 true이며, 그렇지 않으면 false입니다.

true 값은 런타임에 해를 끼치지 않지만 프로파일링 결과를 왜곡할 수 있습니다.

설명

런타임이 클래스 생성자를 처리하는 방식 때문에 각 함수에 대해 JITCompilationStartedICorProfilerCallback::JITCompilationFinished 호출 쌍을 두 개 이상 받을 수 있습니다. 예를 들어 런타임은 메서드 A를 JIT 컴파일하기 시작하지만 클래스 B에 대한 클래스 생성자를 실행해야 합니다. 따라서 런타임은 클래스 B에 대한 생성자를 JIT 컴파일하고 실행합니다. 생성자가 실행되는 동안 메서드 A를 호출하여 메서드 A가 JIT 컴파일되도록 합니다. 이 시나리오에서는 메서드 A의 첫 번째 JIT 컴파일이 중지됩니다. 그러나 메서드 A를 JIT 컴파일하려는 두 시도 모두 JIT 컴파일 이벤트와 함께 보고됩니다. 프로파일러가 ICorProfilerInfo::SetILFunctionBody 메서드를 호출하여 메서드 A에 대한 CIL(공용 중간 언어) 코드를 바꾸려는 경우 두 이벤트 모두 JITCompilationStarted 에 대해 동일한 CIL 블록을 사용할 수 있습니다.

프로파일러는 두 스레드가 동시에 콜백을 생성하는 경우 JIT 콜백 시퀀스를 지원해야 합니다. 예를 들어 스레드 A는 JITCompilationStarted를 호출합니다. 그러나 스레드 A가 JITCompilationFinished를 호출하기 전에 스레드 B는 스레드 A의 JITCompilationStarted 콜백에서 함수 ID를 사용하여 ICorProfilerCallback::ExceptionSearchFunctionEnter를 호출합니다. 프로파일러에서 JITCompilationFinished에 대한 호출을 아직 받지 않았기 때문에 함수 ID가 아직 유효하지 않은 것처럼 보일 수 있습니다. 그러나 이와 같은 경우 함수 ID는 유효합니다.

요구 사항

플랫폼:시스템 요구 사항을 참조하세요.

헤더: CorProf.idl, CorProf.h

라이브러리: CorGuids.lib

.NET Framework 버전: 2.0부터 사용 가능

참고 항목