我是从递归函数远程调试堆栈溢出。 Visual Studio IDE只显示了前1000帧(所有功能相同),但我还需要进一步查看原因。
有人知道如何让VS在堆栈列表中“向上移动”吗?
感谢。
答案 0 :(得分:2)
我不相信有办法通过UI(甚至是注册表黑客)来做到这一点。我猜的原因是显示堆栈溢出情况下的所有帧都会对性能产生非常不利的影响。
大多数堆栈帧都是错误递归的结果。如果是这种情况,您可以在目标函数上设置条件断点。仅在命中计数达到某个级别时将其设置为中断。我的开始数大约是1000。您可能需要进行一些实验以获得正确的计数,但不应该花费多少次尝试。
答案 1 :(得分:1)
我建议更换你的调试方法并使用日志来处理这样的问题。您可能会发现它更有效率,您只需要仔细选择要打印的内容和时间
分析几千行文本的任何方式都比上几千个堆栈帧快得多。恕我直言。
并且您可以使用David's建议来控制要打印的数据量(即将相关信息从一个递归周期传递到另一个递归周期)
答案 2 :(得分:1)
您也可以尝试WinDbg。它不是那么友好,但它有时适用于VC调试器没有的地方。
答案 3 :(得分:1)
我偶尔遇到这个,我做的是将以下行添加到递归调用的函数中:
static int nest; if (++nest == 100) *(char*)0 = 0;
数字100是任意的,通常只有10个可以工作。这限制了递归,以seg错误结束。然后调试器应该显示开始递归的帧。
答案 4 :(得分:0)
您可以向函数添加临时递归计数参数,并在超过最大值时断言。给它一个默认值,你不需要编辑任何其他来源
void f(int rcount /* = 0 */ )
{
Assert(rcount < 1000);
f(count+1);
}
答案 5 :(得分:0)
你试图以错误的方式解决这个问题。
应该有足够的堆栈帧来显示定期呼叫模式。您应该已经提供了足够的推理数据,以确定如何发生无限循环的调用。
另一个黑客的想法可能是大幅减少你的堆栈大小或人为地增加每个框架的大小...