让 VC 调试器在堆栈溢出中显示更多帧

Posted

技术标签:

【中文标题】让 VC 调试器在堆栈溢出中显示更多帧【英文标题】:get VC debugger to show more frames in a stack overflow 【发布时间】:2008-11-14 05:39:38 【问题描述】:

我正在远程调试递归函数的堆栈溢出。 Visual Studio IDE 只显示了前 1,000 帧(都是相同的功能),但我还需要进一步了解原因。

有人知道如何让 VS 在堆栈列表中“向上移动”吗?

谢谢。

【问题讨论】:

【参考方案1】:

我不相信有办法通过 UI(甚至是注册表黑客)来做到这一点。我猜测原因是在堆栈溢出情况下显示所有帧可能会对性能产生非常负面的影响。

大多数堆栈帧是错误递归的结果。如果是这种情况,您可能会在目标函数上设置条件断点。将其设置为仅在命中数达到一定水平时才中断。我会从大约 1,000 开始计数。您可能需要进行一些试验才能获得正确的计数,但不应超过几次尝试。

【讨论】:

【参考方案2】:

我建议更换您的调试方法并使用日志记录来处理此类问题。您可能会发现它更有效率,您只需要仔细选择打印的内容和时间。 任何分析几千行文本的方法都比上几千行堆栈帧要快得多。恕我直言。 并且您可以使用David's 建议来控制要打印的数据量(即将相关信息从一个递归循环传递到另一个)

【讨论】:

【参考方案3】:

您也可以试试WinDbg。它不是那么友好,但它有时可以在 VC 调试器不支持的地方工作。

【讨论】:

【参考方案4】:

我不时遇到这个问题,我所做的就是将以下行添加到递归调用的函数中:

static int nest; if (++nest == 100) *(char*)0 = 0;

数字 100 是任意的,通常只有 10 个可以。这限制了递归,以段错误结束。然后调试器应该向您显示开始递归的帧。

【讨论】:

【参考方案5】:

您可以在函数中添加一个临时递归计数参数,并在它超过最大值时断言。给它一个默认值,你不需要编辑任何其他来源

void f(int rcount /* = 0 */ )

 Assert(rcount < 1000);
 f(count+1);

【讨论】:

【参考方案6】:

你试图以错误的方式解决这个问题。

应该有足够的堆栈帧来显示重复调用模式。应该已经为您提供了足够的推理数据来弄清楚无限循环的调用是如何发生的。

另一个 hack 想法可能是大幅减少堆栈大小或人为增加每个帧的大小...

【讨论】:

以上是关于让 VC 调试器在堆栈溢出中显示更多帧的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 中调试堆栈溢出?

傻程序中的堆栈溢出异常

实时调试堆栈溢出

Java堆栈溢出的机制与原理

堆栈溢出

堆栈溢出一般是由啥原因导致的?