C++ 如何调试堆栈溢出异常?

C++ 如何调试堆栈溢出异常?,c++,debugging,stack-overflow,C++,Debugging,Stack Overflow,我正在做一个游戏,一切都很好,直到我添加了一些功能。我在这个特性上工作了大约一个月,不幸的是我没有足够的智慧来测试代码的较小部分,所以我添加了许多代码,现在我得到了这个错误 Unhandled exception at 0x77555098 (ntdll.dll) in SFML setup.exe: 0xC00000FD: Stack overflow (parameters: 0x00000001, 0x006D2FA8). 我的代码很大,要检查每个函数将非常困难。在调试器调用堆栈中,此

我正在做一个游戏,一切都很好,直到我添加了一些功能。我在这个特性上工作了大约一个月,不幸的是我没有足够的智慧来测试代码的较小部分,所以我添加了许多代码,现在我得到了这个错误

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-缺陷可复制?如果是,请继续
2-使用windbg(或ollydbg或任何其他)连接/打开您的流程
3-触发您的异常
4-参见寄存器的内容(特别是(对于32位)
eip
ebp

5-转储
esp
以检查堆栈帧
应该是这样的:

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

您可以在第一步找到一个非常好且详细的解释:以下哪种可能性适用?a) 节点X的子节点(或…X的子节点的子节点)是X本身。b) 一些错误代码插入了大量嵌套子项,但子项不应该存在。c) 数据正常,堆栈确实太小。Prime怀疑:
command.action(*this,dt)
调用此函数,或
mChild
的一个元素。查看调试器中调用堆栈上的
this
指针,查看节点树中是否有循环。根据提供的信息无法回答此问题。请提供一个演示错误的最小工作示例。创建一个最小的工作示例通常有助于您确定问题。@shayan如果a和B不适用,则为C。C表示这不是您的错,解决方案是设置适当的编译器选项或完全删除新功能。。。(我的第一条评论和这条评论也假设数据和
child->onCommand(command,dt);
是问题所在。如果
.action
以某种方式再次调用此函数,从技术上讲,这是C,即数据正常,但仍然是您的错)您必须编写可调试代码才能诊断问题。您需要一个静态int来度量递归深度,在调用者中将其设置为0。命令类型需要一个已访问的变量,以便您可以检测指向父级的子级。