【发布时间】:2012-07-24 22:19:12
【问题描述】:
有没有办法在 Visual Studio 中监控调用堆栈大小?运行时提供调用堆栈窗口,但不显示堆栈的大小。我正在使用 C++ 并面临堆栈溢出问题。我知道我正在使用的一些递归函数可能有问题,但在解决这些问题之前,我想监控调用堆栈大小以查看发生了什么。
【问题讨论】:
标签: c++ visual-studio-2008 monitoring stack-overflow callstack
有没有办法在 Visual Studio 中监控调用堆栈大小?运行时提供调用堆栈窗口,但不显示堆栈的大小。我正在使用 C++ 并面临堆栈溢出问题。我知道我正在使用的一些递归函数可能有问题,但在解决这些问题之前,我想监控调用堆栈大小以查看发生了什么。
【问题讨论】:
标签: c++ visual-studio-2008 monitoring stack-overflow callstack
在这里使用数据断点会很有帮助。无论您碰巧在代码中的哪个位置,只要您在正确的线程上都没关系,使用 Debug + New Breakpoint + New Data Breakpoint。在地址框中输入@esp - 250000。按 F5 继续运行,当使用了四分之一的可用堆栈空间时,它将在递归内部的某个地方中断。与 esp 的确切偏移并不重要。
【讨论】:
rsp。
有几种方法:
@esp 来做到这一点。将此与流程开始时的 ESP 进行比较。请注意,堆栈通常是向后分配的,因此随着堆栈的增长,ESP 会越来越小。
【讨论】:
“Microsoft 推荐的本机规则”代码分析可以查看您的代码并发现您的代码可能会溢出堆栈的问题。我不确定找到递归问题有多好,但它确实在我的代码中发现了一个问题,我使用了一个非常大(1MB)的类的本地实例。在运行时,唯一的错误是堆栈溢出。当然,在堆栈上使用大对象是个坏主意。您应该只使用小物件和将大部分脏衣服堆放在一起的物件。
在VS2012中,右键点击项目Properties,选择Code Analysis,然后点击复选框Enable Code Analysis。运行需要几分钟。
【讨论】: