다음을 통해 공유


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의 MSIL(Microsoft intermediate language) 코드를 대체하려면 두 JITCompilationStarted 이벤트 모두에 대해 이 작업을 수행해야 하지만 사용하는 MSIL 블록은 두 경우 모두 동일할 수 있습니다.

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

요구 사항

플랫폼: .NET Framework 시스템 요구 사항 참조

헤더: CorProf.idl, CorProf.h

라이브러리: CorGuids.lib

.NET Framework 버전: 4, 3.5 SP1, 3.5, 3.0 SP1, 3.0, 2.0 SP1, 2.0

참고 항목

참조

ICorProfilerCallback 인터페이스

ICorProfilerCallback::JITCompilationFinished 메서드