更新 : 2007 年 11 月
関数が呼び出し元に戻る直前であることをプロファイラに通知し、スタック フレームと関数の戻り値に関する情報を提供します。
void FunctionLeave2 (
[in] FunctionID funcId,
[in] UINT_PTR clientData,
[in] COR_PRF_FRAME_INFO func,
[in] COR_PRF_FUNCTION_ARGUMENT_RANGE *retvalRange
);
パラメータ
funcId
[入力] 戻ろうとしている関数の ID。clientData
[入力] 以前にプロファイラが FunctionIDMapper 関数で指定した、再マップされた関数 ID。func
[入力] スタック フレームに関する情報を指す COR_PRF_FRAME_INFO 値。プロファイラは、これを、ICorProfilerInfo2::GetFunctionInfo2 メソッドで実行エンジンに戻すことができる不透明ハンドルとして扱う必要があります。
retvalRange
[入力] 関数の戻り値のメモリ位置を指定する COR_PRF_FUNCTION_ARGUMENT_RANGE 構造体へのポインタ。戻り値の情報にアクセスするには、COR_PRF_ENABLE_FUNCTION_RETVAL フラグを設定する必要があります。プロファイラは ICorProfilerInfo::SetEventMask メソッドを使用してイベント フラグを設定します。
解説
func パラメータおよび retvalRange パラメータの値は、FunctionLeave2 関数から制御が戻った後は、変更または破棄されている可能性があるため、有効ではありません。
FunctionLeave2 関数はコールバックですが、ユーザー自身で実装する必要があります。実装では、__declspec(naked) ストレージ クラス属性を使用する必要があります。
この関数を呼び出すまで、実行エンジンはレジスタをまったく保存しません。
エントリ時に、使用するすべてのレジスタを、浮動小数点ユニット (FPU) のレジスタも含めて保存する必要があります。
終了時に、呼び出し元によってプッシュされたすべてのパラメータをポップすることで、スタックを復元する必要があります。
ガベージ コレクションが遅延するので、FunctionLeave2 の実装ではブロックを行わないでください。スタックがガベージ コレクションできる状態とは限らないので、実装ではガベージ コレクションを実行しないでください。ガベージ コレクションが試行された場合、ランタイムは、FunctionLeave2 から制御が戻るまでブロックを行います。
さらに、FunctionLeave2 関数では、マネージ コードを呼び出さないようにする必要があります。呼び出すと、マネージ メモリの割り当てが実行されます。
必要条件
プラットフォーム : 「.NET Framework システム要件」を参照
ヘッダー : CorProf.idl
ライブラリ : CorGuids.lib
.NET Framework のバージョン : 3.5 SP1、3.5、3.0 SP1、3.0、2.0 SP1、2.0
参照
参照
ICorProfilerInfo2::SetEnterLeaveFunctionHooks2 メソッド