StackWalk

【勇芳软件工作室】汉化HomePreviousNext

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平台上与堆栈行走有关的所有复杂性。另外,导致堆栈出现不同的各种编译器选项,这取决于模块的编译方式,使问题更加复杂。通过使用此函数,您的应用程序具有可移植的堆栈跟踪,当编译器和操作系统更改时,它将继续工作。