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 起可用

另请参阅