次の方法で共有


ICorProfilerCallback::JITCompilationStarted メソッド

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

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

パラメーター

  • functionId
    [入力] コンパイルが開始される関数の ID。

  • fIsSafeToBlock
    [入力] ブロッキングがランタイムの動作に影響するかどうかをプロファイラーに示す値。 ブロッキングにより、呼び出し元スレッドがこのコールバックから制御が戻るのをランタイムが待機するようになる場合は、値は true です。それ以外の場合は false です。

    true の値がランタイムを破壊することはありませんが、プロファイル結果が偏る可能性があります。

解説

ランタイムがクラス コンストラクターを処理する方法により、関数ごとに JITCompilationStartedICorProfilerCallback::JITCompilationFinished の呼び出しの複数の組み合わせを受け取ることができます。 たとえば、ランタイムは JIT コンパイル メソッド A を開始しますが、クラス B のクラス コンストラクターを実行する必要があります。 したがって、ランタイムはクラス B のコンストラクターの JIT コンパイルを実行し、コンストラクターを実行します。 コンストラクターの実行中に、メソッド A が呼び出され、メソッド A の JIT コンパイルが再び実行されます。 この場合、メソッド A の最初の JIT コンパイルが中断されます。 ただし、メソッド A の両方の JIT コンパイルが、JIT コンパイル イベントで報告されます。 プロファイラーが ICorProfilerInfo::SetILFunctionBody メソッドを呼び出すことで、メソッドの Microsoft Intermediate Language (MSIL) コードを置換する場合、両方の JITCompilationStarted イベントに対して置換する必要がありますが、両方に同じ MSIL ブロックが使用される可能性があります。

2 つのスレッドが同時にコールバックを行う場合、プロファイラーは 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 メソッド