在堆栈审核过程中向探查器提供有关堆栈上每个托管帧以及非托管帧的每次运行的信息,堆栈审核是由 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 结构包括所有寄存器的值,但您应当只信赖堆栈指针寄存器、帧指针寄存器、指令指针寄存器和非易失(即保留的)整数寄存器的值。
要求
**平台:**请参见 .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 方法