StackWalk函数提供了一种用于获取堆栈跟踪的便携式方法。
BOOL StackWalk(
IN DWORD【MachineType】, | |
IN HANDLE【hProcess】, | |
IN HANDLE【hThread】, | |
IN OUT LPSTACKFRAME【StackFrame】, | |
IN OUT LPVOID【ContextRecord】, | |
IN PREAD_PROCESS_MEMORY_ROUTINE【ReadMemoryRoutine】, | |
IN PFUNCTION_TABLE_ACCESS_ROUTINE【FunctionTableAccessRoutine】, | |
IN PGET_MODULE_BASE_ROUTINE【GetModuleBaseRoutine】, | |
IN PTRANSLATE_ADDRESS_ROUTINE【TranslateAddress】 | |
); |
参数
【MachineType】
生成堆栈跟踪的机器的体系结构类型。这可以是以下值之一:
*IMAGE_FILE_MACHINE_I386
*IMAGE_FILE_MACHINE_R4000
*IMAGE_FILE_MACHINE_R10000
*IMAGE_FILE_MACHINE_ALPHA
*IMAGE_FILE_MACHINE_POWERPC
【hProcess】
生成堆栈跟踪的进程句柄。如果调用者为【ReadMemoryRoutine】提供了一个有效的回调指针,则该值不一定是有效的Win32进程句柄。对于StackWalk函数的所有调用,它可以是唯一且一致的令牌。如果IMAGEHLP的符号处理程序与StackWalk一起使用,则对每个函数的调用使用的过程句柄应该相同。
【hThread】
生成堆栈跟踪的线程句柄。如果调用者为【ReadMemoryRoutine】提供了一个有效的回调指针,则该值不一定是有效的Win32线程句柄。它可以是对StackWalk函数的所有调用都是唯一的,一致的令牌。
【StackFrame】
指向STACKFRAME结构的指针。如果函数调用成功,则该结构将填充下一帧的信息。
【ContextRecord】
指向CONTEXT记录的指针。仅当【不】等于IMAGE_FILE_MACHINE_I386时,才需要此参数。
【ReadMemoryRoutine】
指向提供内存读取服务的回调例程的指针。当StackWalk功能需要从进程的地址空间读取内存时,将使用此回调。如果通过NULL,则使用Win32 ReadProcessMemory函数。在这种情况下,【hProcess】参数【必须】是有效的Win32进程句柄。
【FunctionTableAccessRoutine】
指向回调例程的指针,该例程为进程提供对运行时功能表的访问。对于RISC机器,此函数访问【PDATA】表,而在X86计算机上,此函数访问【FPO】表。此参数是必需的,因为StackWalk功能无法访问进程的运行时功能表。
IMAGEHLP中的符号处理程序提供加载和访问运行时表的功能。如果使用这些功能,则可以将【SymFunctionTableAccess】作为有效参数传递。
【GetModuleBaseRoutine】
指向回调例程的指针,为任何给定的虚拟地址提供模块基础。此参数是必需的。IMAGEHLP中的符号处理程序提供加载和维护模块信息的功能。如果使用这些功能,则可以将【SymGetModuleBase】作为有效参数传递。
【TranslateAddress】
一个指向回调例程的指针,为16位地址提供地址转换。大多数(如果不是全部),StackWalk的呼叫者可以安全地为此参数传递NULL。
返回值
如果函数成功,返回值为TRUE。
如果函数失败,则返回值为FALSE。要检索扩展错误信息,请调用GetLastError.
备注
StackWalk函数提供了一种用于获取堆栈跟踪的便携式方法。所有Microsoft Win32调试器和需要堆栈跟踪功能的工具都使用此函数。建议使用IMAGEHLP的StackWalk函数编写自己的函数,因为在各种Win32平台上与堆栈行走有关的所有复杂性。另外,导致堆栈出现不同的各种编译器选项,这取决于模块的编译方式,使问题更加复杂。通过使用此函数,您的应用程序具有可移植的堆栈跟踪,当编译器和操作系统更改时,它将继续工作。