StackWalkEx 函数 (dbghelp.h)
获取堆栈跟踪。
语法
BOOL IMAGEAPI StackWalkEx(
[in] DWORD MachineType,
[in] HANDLE hProcess,
[in] HANDLE hThread,
[in, out] LPSTACKFRAME_EX StackFrame,
[in, out] PVOID ContextRecord,
[in, optional] PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine,
[in, optional] PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine,
[in, optional] PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine,
[in, optional] PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress,
[in] DWORD Flags
);
参数
[in] MachineType
为其生成堆栈跟踪的计算机的体系结构类型。 此参数的取值可为下列值之一:
值 | 含义 |
---|---|
|
Intel x86 |
|
Intel Itanium |
|
x64 (AMD64 或 EM64T) |
[in] hProcess
为其生成堆栈跟踪的进程句柄。 如果调用方为 ReadMemoryRoutine 参数提供有效的回调指针,则此值不必是有效的进程句柄。 它可以是一个唯一的令牌,并且对于所有 对 StackWalkEx 函数的调用一致。 如果符号处理程序与 StackWalkEx 一起使用,则对每个函数的调用使用相同的进程句柄。
[in] hThread
为其生成堆栈跟踪的线程的句柄。 如果调用方为 ReadMemoryRoutine 参数提供有效的回调指针,则此值不必是有效的线程句柄。 它可以是一个唯一的令牌,并且对于所有 对 StackWalkEx 函数的调用一致。
[in, out] StackFrame
指向 STACKFRAME_EX 结构的指针。 如果函数调用成功,则此结构接收下一帧的信息。
[in, out] ContextRecord
指向 CONTEXT 结构的指针。 仅当不IMAGE_FILE_MACHINE_I386MachineType 参数时,此参数才是必需的。 但是,建议此参数包含有效的上下文记录。 这使 StackWalkEx 能够处理多种情况。
可以修改此上下文,因此不要传递不应修改的上下文记录。
[in, optional] ReadMemoryRoutine
提供内存读取服务的回调例程。 当 StackWalkEx 函数需要从进程的地址空间读取内存时,将使用 ReadProcessMemoryProc64 回调。
如果此参数为 NULL,则该函数使用默认例程。 在这种情况下, hProcess 参数必须是有效的进程句柄。
如果此参数不为 NULL,则应用程序应实现并注册处理 CBA_READ_MEMORY的符号处理程序回调函数。
[in, optional] FunctionTableAccessRoutine
一个回调例程,它为进程提供对运行时函数表的访问。 此参数是必需的,因为 StackWalkEx 函数无权访问进程的运行时函数表。 有关详细信息,请参阅 FunctionTableAccessProc64。
符号处理程序提供加载和访问运行时表的函数。 如果使用这些函数,则可以将 SymFunctionTableAccess64 作为有效参数传递。
[in, optional] GetModuleBaseRoutine
为任何给定虚拟地址提供模块基的回调例程。 此参数是必需的。 有关详细信息,请参阅 GetModuleBaseProc64。
符号处理程序提供加载和维护模块信息的函数。 如果使用这些函数,则可以将 SymGetModuleBase64 作为有效参数传递。
[in, optional] TranslateAddress
为 16 位地址提供地址转换的回调例程。 有关详细信息,请参阅 TranslateAddressProc64。
StackWalkEx 的大多数调用方都可以安全地为此参数传递 NULL。
[in] Flags
零个或多个标志的组合。
SYM_STKWALK_DEFAULT (0)
SYM_STKWALK_FORCE_FRAMEPTR (1)
返回值
如果函数成功,则返回值为 TRUE。
如果函数失败,则返回值为 FALSE。 请注意, StackWalkEx 通常不会设置最后一个错误代码。
注解
StackWalkEx 函数提供了一种用于获取堆栈跟踪的可移植方法。 建议在编写自己的函数时使用 StackWalkEx 函数,因为与平台上的堆栈行走相关的所有复杂性。 此外,还有一些编译器选项会导致堆栈以不同的方式显示,具体取决于模块的编译方式。 通过使用此函数,应用程序具有可移植堆栈跟踪,该跟踪可继续随着编译器和操作系统的变化而工作。
如果 AddrPC,则对此函数的第一次调用将失败,
不会初始化在 StackFrame 参数中传递的 STACKFRAME64 结构的 AddrFrame 和 AddrStack 成员。
所有 DbgHelp 函数(例如此函数)都是单线程的。 因此,从多个线程调用此函数可能会导致意外行为或内存损坏。 若要避免这种情况,必须将多个线程中的所有并发调用同步到此函数。
要求
要求 | 值 |
---|---|
目标平台 | Windows |
标头 | dbghelp.h |
Library | DbgHelp.lib |
DLL | DbgHelp.dll |
可再发行组件 | DbgHelp.dll 6.2 或更高版本 |