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] 如果此值为零,则此回叫用于运行非托管帧;否则,它是托管函数的标识符,并且此回叫用于托管帧。
ip
[in] 帧中本机代码指令指针的值。
frameInfo
[in] 引用堆栈帧相关信息的 COR_PRF_FRAME_INFO
值。 此值仅在此回叫期间有效。
contextSize
[in] CONTEXT
结构的大小,由 context
参数引用。
context
[in] 指向 Win32 CONTEXT
结构的指针,表示此帧的 CPU 状态。
COR_PRF_SNAPSHOT_CONTEXT 标志传入 ICorProfilerInfo2::DoStackSnapshot
时,context
参数才有效。
clientData
[in] 指向客户端数据的指针,直接传递自 ICorProfilerInfo2::DoStackSnapshot
。
注解
StackSnapshotCallback
函数由探查器编写器实现。 必须降低 StackSnapshotCallback
中所进行的工作的复杂性。 例如,以异步方式使用 ICorProfilerInfo2::DoStackSnapshot
时,目标线程可能正在持有锁。 如果 StackSnapshotCallback
中的代码需要相同的锁,则可能会发生死锁。
ICorProfilerInfo2::DoStackSnapshot
方法对每个托管帧或在每次运行非托管帧时调用一次 StackSnapshotCallback
函数。 如果为运行非托管帧调用 StackSnapshotCallback
,则探查器可以使用寄存器上下文(由 context
参数引用)来执行自己的非托管堆栈遍历。 在这种情况下,Win32 CONTEXT
结构表示非托管帧运行时最近推送的帧的 CPU 状态。 尽管 Win32 CONTEXT
结构包含所有寄存器的值,但你应只使用堆栈指针寄存器、帧指针寄存器、指令指针寄存器和非易失性(即保留的)整数寄存器的值。
要求
平台:请参阅系统要求。
标头:CorProf.idl
库:CorGuids.lib
.NET Framework 版本:自 1.0 起可用