次の方法で共有


StackSnapshotCallback 関数

スタック ウォーク中に、スタック上の各マネージ フレームおよびアンマネージ フレームの各実行に関する情報をプロファイラーに提供します。これは、ICorProfilerInfo2::DoStackSnapshot メソッドによって開始されます。

HRESULT __stdcall StackSnapshotCallback (
    [in] FunctionID funcId,
    [in] UINT_PTR ip,
    [in] COR_PRF_FRAME_INFO frameInfo,
    [in] ULONG32 contextSize,
    [in] BYTE context[],
    [in] void *clientData
);

パラメーター

  • funcId
    [入力] この値がゼロの場合、このコールバックはアンマネージ フレームの実行用です。それ以外の場合はマネージ関数の識別子であり、このコールバックはマネージ フレーム用です。

  • ip
    [入力] フレーム内のネイティブ コードの命令ポインターの値。

  • frameInfo
    [入力] スタック フレームに関する情報を参照する COR_PRF_FRAME_INFO 値。 この値は、このコールバック内でのみ使用できます。

  • contextSize
    [入力] CONTEXT 構造体のサイズ。context パラメーターによって参照されます。

  • context
    [入力] このフレームの CPU の状態を表す Win32 CONTEXT 構造体へのポインター。

    context パラメーターは、COR_PRF_SNAPSHOT_CONTEXT フラグが ICorProfilerInfo2::DoStackSnapshot に渡される場合のみ有効です。

  • clientData
    [入力] クライアント データへのポインター。ICorProfilerInfo2::DoStackSnapshot から直接渡されます。

解説

StackSnapshotCallback 関数は、プロファイラーの作成者によって実装されます。 StackSnapshotCallback で実行される作業の複雑性を制限する必要があります。 たとえば、ICorProfilerInfo2::DoStackSnapshot を非同期で使用すると、対象スレッドがロックを保持している場合があります。 StackSnapshotCallback 内のコードが同じロックを要求した場合、デッドロックが発生します。

ICorProfilerInfo2::DoStackSnapshot メソッドは、マネージ フレームごとに 1 度、またはアンマネージ フレームが実行されるたびに 1 度、StackSnapshotCallback 関数を呼び出します。 アンマネージ フレームの実行に対して StackSnapshotCallback が呼び出された場合、プロファイラーは、context パラメーターによって参照されるレジスタ コンテキストを使用して、独自のアンマネージ スタック ウォークを実行できます。 この場合、Win32 CONTEXT 構造体は、アンマネージ フレームの実行中に、最後にプッシュされたフレームの CPU 状態を表します。 Win32 CONTEXT 構造体にはすべてのレジスタの値が含まれていますが、スタック ポインター レジスタ、フレーム ポインター レジスタ、命令ポインター レジスタ、および不揮発 (つまり、保持された) 整数レジスタの値だけを信頼してください。

必要条件

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

ヘッダー: CorProf.idl

ライブラリ: CorGuids.lib

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

参照

参照

ICorProfilerInfo2::DoStackSnapshot メソッド

その他の技術情報

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