【问题标题】:Monitoring call stack size in Visual Studio在 Visual Studio 中监视调用堆栈大小
【发布时间】:2012-07-24 22:19:12
【问题描述】:

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

【问题讨论】:

    标签: c++ visual-studio-2008 monitoring stack-overflow callstack


    【解决方案1】:

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

    【讨论】:

    • @esp - 250000 它总是保证消耗四分之一的可用堆栈空间吗?我的意思是我的设置可能有不同的堆栈大小。那么,同样的工作也适用于我吗?有什么地方可以查到这些信息吗?。
    • 在 64 位机器上,寄存器被称为rsp
    【解决方案2】:

    有几种方法:

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

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

    【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-07-14
      • 1970-01-01
      • 2017-06-26
      • 2020-08-28
      • 2011-01-22
      • 1970-01-01
      • 2016-02-13
      • 2011-01-02
      • 2016-10-06
      相关资源
      最近更新 更多