如何调试堆栈溢出异常

How to debug a stack overflow exception?

本文关键字:堆栈 栈溢出 异常 调试 何调试      更新时间:2023-10-16

我正在制作一款游戏,一切都很好,直到我添加了一些功能。我在这个特性上花了大约一个月的时间,不幸的是,我不够聪明,无法测试代码的一小部分,所以我添加了许多代码,现在我得到了这个错误。

Unhandled exception at 0x77555098 (ntdll.dll) in SFML setup.exe: 0xC00000FD: Stack overflow (parameters: 0x00000001, 0x006D2FA8). 

我的代码很大,检查每个函数真的很难。在调试器调用堆栈中,这个特定的函数被重复很多次。

void SceneNode::onCommand(const Command &command, sf::Time dt)
{
   if (command.category.at(getCategory()))
      command.action(*this, dt);
   for(const Ptr& child : mChild)
   {
      child->onCommand(command, dt);
   }
}

SceneNode是树形结构,并且有一些子结构。这个函数尝试遍历树,以查看哪些节点可以接受特定的命令。

我回答这个问题:"如何调试堆栈溢出异常?"
1- Bug可复制?如果是,继续
2-使用windbg(或ollydbg或任何其他)附加/打开进程
触发你的异常
4-参见寄存器的内容(特别是(32位)eip, ebp)
5- dump esp以检查堆栈帧
它应该是这样的:

{ Local Var -> Saved EBP -> Saved EIP -> Params -> Address of Exception Handler }

你可以在这个链接找到一个非常好的和详细的解释