Winapi StackWalker码中的疑问

Winapi StackWalker码中的疑问,winapi,Winapi,这是项目页面 我的问题是,这一条件何时才能得到满足?s.AddrPC.Offset、s.AddrReturn.Offset包含哪些地址? 堆栈上最后一帧中的返回地址=0吗?希望永远不会,但这是一个基本的健全性检查,以防堆栈帧被踩踏。当您尝试在异常处理程序中遍历堆栈时,这是不太可能的,异常处理程序由严重的硬件异常(如AccessViolation)触发。如果没有这个检查,代码将进入一个无止境的循环,不断地找到相同的堆栈帧 AddrPC是调用指令的地址,AddrReturn是返回地址,前一条调用指

这是项目页面

我的问题是,这一条件何时才能得到满足?s.AddrPC.Offset、s.AddrReturn.Offset包含哪些地址?
堆栈上最后一帧中的返回地址=0吗?

希望永远不会,但这是一个基本的健全性检查,以防堆栈帧被踩踏。当您尝试在异常处理程序中遍历堆栈时,这是不太可能的,异常处理程序由严重的硬件异常(如AccessViolation)触发。如果没有这个检查,代码将进入一个无止境的循环,不断地找到相同的堆栈帧


AddrPC是调用指令的地址,AddrReturn是返回地址,前一条调用指令的地址(+5)。不确定“堆栈0”可能是什么意思。

希望永远不会,但这是一个基本的健全性检查,以防堆栈帧被踩到。当您尝试在异常处理程序中遍历堆栈时,这是不太可能的,异常处理程序由严重的硬件异常(如AccessViolation)触发。如果没有这个检查,代码将进入一个无止境的循环,不断地找到相同的堆栈帧


AddrPC是调用指令的地址,AddrReturn是返回地址,前一条调用指令的地址(+5)。不确定“堆栈0”可能是什么意思。

Oops!我想你在标题中拼错了StackWalker。@Corey:谢谢你纠正它!哦,哎呀,我忘了我能做到:大便!我想你在标题中拼错了StackWalker。@Corey:谢谢你纠正它!哎呀,我忘了我能做到:P@Hans:谢谢你的回复。我在问堆栈最底层的帧是否有0的返回地址?@Hans:假设我们有像| a | B |一样的堆栈,其中a是堆栈的顶部。AddrPC将指向A的第一条指令,AddrReturn将指向B中的返回地址?AddrPC是A中当前指令的地址。当线程挂起时,无论它发生在何处,很少出现第一条指令。AddrReturn指向B,即调用A后的指令。如果我分别将s.AddrPC.Offset传递给SymGetLineFromAddr64()和SymGetSymFromAddr64(),IMAGEHLP_LINE64.address和IMAGEHLP_SYMBOL64.address将包含什么地址?我在日志文件AddrPC:4241369,函数名:Func5,完整文件名,路径:c:\xxxx\stackwalker\main.cpp,行号:31,模块名称:stackwalker,loadedImageName:c:\xxxx\xxxx\WIN2000\u DEBUG\stackwalker.exe模块的基址:4194304 IMAGEHLP\u LINE64。地址:4241296 IMAGEHLP\u SYMBOL64:4241296@Hans:谢谢你的回复。我在问堆栈最底层的帧是否有0的返回地址?@Hans:假设我们有像| a | B |一样的堆栈,其中a是堆栈的顶部。AddrPC将指向A的第一条指令,AddrReturn将指向B中的返回地址?AddrPC是A中当前指令的地址。当线程挂起时,无论它发生在何处,很少出现第一条指令。AddrReturn指向B,即调用A后的指令。如果我分别将s.AddrPC.Offset传递给SymGetLineFromAddr64()和SymGetSymFromAddr64(),IMAGEHLP_LINE64.address和IMAGEHLP_SYMBOL64.address将包含什么地址?我在日志文件AddrPC:4241369,函数名:Func5,完整文件名,路径:c:\xxxx\stackwalker\main.cpp,行号:31,模块名称:stackwalker,loadedImageName:c:\xxxx\xxxx\WIN2000\u DEBUG\stackwalker.exe模块的基址:4194304 IMAGEHLP\u LINE64。地址:4241296 IMAGEHLP\u SYMBOL64:4241296
[STACKFRAME64][1] s;

//s contains the current stack frame filled by calling [StackWalk64][2] WinAPI

if (s.AddrPC.Offset == s.AddrReturn.Offset)
{
  printf("StackWalk64-Endless-Callstack!");
}