次の方法で共有


ICorProfilerCallback::JITCompilationStarted メソッド

Just-in-time (JIT) コンパイラで関数のコンパイルが開始されたことをプロファイラーに通知します。

構文

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 ブロックを使用する可能性があります。

2 つのスレッドが同時にコールバックを実行する場合、プロファイラーは JIT コールバックのシーケンスをサポートする必要があります。 たとえば、スレッド A が JITCompilationStarted を呼び出すとします。 ただし、スレッド A で JITCompilationFinished を呼び出す前に、スレッド B で、スレッド A の JITCompilationStarted コールバックからの関数 ID を使用して、ICorProfilerCallback::ExceptionSearchFunctionEnter を呼び出します。 JITCompilationFinished の呼び出しが、プロファイラーによってまだ受信されていないため、関数 ID がまだ有効ではないように見えるかもしれません。 ただし、このような場合、関数 ID は有効です。

必要条件

:システム要件」を参照してください。

ヘッダー : CorProf.idl、CorProf.h

ライブラリ: CorGuids.lib

.NET Framework のバージョン: 2.0 以降で使用可能

関連項目