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