次の方法で共有


ICorProfilerCallback::JITCompilationStarted メソッド

更新 : 2007 年 11 月

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

ライブラリ : CorGuids.lib

.NET Framework のバージョン : 3.5 SP1、3.5、3.0 SP1、3.0、2.0 SP1、2.0

参照

参照

ICorProfilerCallback

ICorProfilerCallback::JITCompilationFinished メソッド