次の方法で共有


StackSnapshotCallback 関数

更新 : 2007 年 11 月

スタック ウォーク中に、スタック上の各マネージ フレームとアンマネージ フレームの各実行に関する情報をプロファイラに提供します。これは、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 のバージョン : 3.5 SP1、3.5、3.0 SP1、3.0、2.0 SP1、2.0、1.1、1.0

参照

参照

ICorProfilerInfo2::DoStackSnapshot メソッド

その他の技術情報

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