怀疑StackWalker代码

时间:2010-12-30 14:21:01

标签: winapi

这是项目页面 http://www.codeproject.com/KB/threads/StackWalker.aspx

[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!");
}

我的问题是这个条件什么时候能满足? s.AddrPC.Offset,s.AddrReturn.Offset包含哪些地址? 堆栈中最后一帧中的返回地址是否为0?

1 个答案:

答案 0 :(得分:1)

希望永远不会,但这是一个基本的健全性检查,以防堆栈框架被踩踏。当您尝试在由AccessViolation等令人讨厌的硬件异常触发的异常处理程序中遍历堆栈时,这不是不可能的。如果没有检查,代码将进入无限循环,不断找回相同的堆栈帧。

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