次の方法で共有


FunctionLeave2 関数

更新 : 2010 年 10 月

関数が呼び出し元に戻る直前であることをプロファイラーに通知し、スタック フレームと関数の戻り値に関する情報を提供します。

void __stdcall 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: Floating-Point Unit) のレジスタも含めて保存する必要があります。

  • 終了時に、呼び出し元によってプッシュされたすべてのパラメーターをポップすることで、スタックを復元する必要があります。

ガベージ コレクションが遅延するので、FunctionLeave2 の実装ではブロックを行わないでください。 スタックがガベージ コレクションできる状態とは限らないので、実装ではガベージ コレクションを実行しないでください。 ガベージ コレクションが試行された場合、ランタイムは、FunctionLeave2 から制御が戻るまでブロックを行います。

さらに、FunctionLeave2 関数では、マネージ コードを呼び出さないようにする必要があります。呼び出すと、マネージ メモリの割り当てが実行されます。

必要条件

プラットフォーム : 「.NET Framework システム要件」を参照

ヘッダー: CorProf.idl

ライブラリ: CorGuids.lib

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

参照

参照

FunctionEnter2 関数

FunctionTailcall2 関数

ICorProfilerInfo2::SetEnterLeaveFunctionHooks2 メソッド

その他の技術情報

グローバル静的関数のプロファイル

履歴の変更

日付

履歴

理由

2010 年 10 月

__stdcall を構文に追加。

カスタマー フィードバック