次の方法で共有


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
[in] この値が 0 の場合、このコールバックはアンマネージド フレームの実行用です。それ以外の場合、これはマネージド関数の識別子で、このコールバックはマネージド フレーム用です。

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

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

contextSize
[in] context パラメーターによって参照される CONTEXT 構造体のサイズ。

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

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

clientData
[in] ICorProfilerInfo2::DoStackSnapshot から直接渡されるクライアント データへのポインター。

解説

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

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

必要条件

:システム要件」を参照してください。

ヘッダー: CorProf.idl

ライブラリ: CorGuids.lib

.NET Framework のバージョン: 1.0 以降で使用可能

関連項目