【问题标题】:Examining the Stack检查堆栈
【发布时间】:2011-09-01 07:07:07
【问题描述】:

我遇到了堆栈溢出问题,想看看堆栈上的内容到底是什么。

How can I examine the stack frame with GDB? 是同一个问题,但是 info locals 在这里看起来不错(变量很少,大部分是 std::vectors 和 std::maps),所以我不希望堆栈会从这里溢出.此外,我已经将堆栈限制设置为 32MB,所以这应该足够了,并且没有使用递归函数。

是否有工具可以显示堆栈的完整内容,可能按大小排序?

【问题讨论】:

  • 听起来你实际上没有堆栈溢出。是什么让你认为你这样做了?
  • @Neil:请看我的相关问题:stackoverflow.com/questions/6084901/…。增加堆栈大小确实有帮助,但并不能真正解决问题的根源

标签: c++ c stack stack-overflow


【解决方案1】:

堆栈溢出最好由特殊分析器捕获,而不是手动查看gdb 中的变量。更有可能是缓冲区溢出而不是堆栈溢出。无论哪种情况,以下是一些分析器的列表,可以帮助您指出问题:

祝你好运!

【讨论】:

【解决方案2】:

即使您没有调用自身的函数,您也可能创建了两个或多个函数相互递归的情况。

一个好的起点不是检查当前堆栈帧,而是检查堆栈帧列表,使用“backtrace”(或简称“bt”)命令。如果你看到两个或多个函数相互调用的重复模式,那么你就有了相互递归。

【讨论】:

    【解决方案3】:

    您可以使用 backtrace 命令检查当前堆栈帧。

    【讨论】:

      【解决方案4】:

      您还可以在 gdb 中获取当前堆栈指针(例如,通过运行“信息寄存器”),然后使用检查(或“x”)命令转储该位置周围的内存。请注意堆栈指针指向堆栈下方,因此您需要从堆栈指针-N 开始转储以查看堆栈上的前N 个字节。

      【讨论】:

        猜你喜欢
        • 2010-10-15
        • 1970-01-01
        • 2011-04-30
        • 2020-12-19
        • 2011-02-15
        • 2011-02-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多