8

有没有办法监控 Visual Studio 中的调用堆栈大小?运行时提供调用堆栈窗口,但不显示堆栈的大小。我正在使用 C++ 并面临堆栈溢出问题。我知道我正在使用的某些递归函数可能有问题,但在解决这些问题之前,我想监控调用堆栈大小以查看发生了什么。

4

3 回答 3

7

在这里使用数据断点会很有帮助。无论您碰巧在代码中的哪个位置,只要您在正确的线程上都没关系,使用 Debug + New Breakpoint + New Data Breakpoint。在地址框中输入@esp - 250000. 按 F5 继续运行,当使用了四分之一的可用堆栈空间时,它将在递归内部的某个地方中断。与 esp 的确切偏移并不重要。

于 2012-07-26T11:00:56.060 回答
4

有几种方法:

  1. 在监视窗口中检查 ESP。您可以通过@esp在监视窗口中观看来做到这一点。将此与流程开始时的 ESP 进行比较。
  2. 同样,检查第一个/最后一个堆栈帧中堆栈分配变量的地址。

请注意,堆栈通常是向后分配的,因此随着堆栈的增长,ESP 变得越来越小。

于 2012-07-26T10:45:55.270 回答
1

“Microsoft 推荐的本机规则”代码分析可以查看您的代码并发现您的代码可能会溢出堆栈的问题。我不确定它在找到递归问题方面有多好,但它确实在我的代码中发现了一个问题,我使用了一个非常大 (1MB) 的类的本地实例。在运行时,唯一的错误是堆栈溢出。当然,在堆栈上使用大对象是个坏主意。您应该只使用小物件和将大部分脏衣服堆放在堆上的物件。

在 VS2012 中,右键单击项目Properties,然后选择Code Analysis,然后单击复选框以Enable Code Analysis。运行需要几分钟。

于 2015-03-07T02:15:57.180 回答