我遇到堆栈溢出问题,想要确切了解堆栈中的内容是什么。
How can I examine the stack frame with GDB?是一个相同的问题,但info locals
在这里看起来很好(很少变量,大多数是std :: vectors和std :: maps),所以我不希望堆栈从这里溢出来。此外,我已将堆栈限制设置为32MB,因此这应该是充足的,并且不使用递归函数。
是否有工具可以显示堆栈的完整内容,可能按大小排序?
答案 0 :(得分:5)
特殊的分析器可以更好地捕获堆栈溢出,而不是手动查看gdb
中的变量。您更有可能是缓冲区溢出而不是堆栈溢出。在任何一种情况下,这里都列出了一些可以帮助您指出问题的分析器:
答案 1 :(得分:1)
即使你没有自己调用的函数,你也可能创建了一个两个或多个函数相互递归的情况。
一个好的起点是使用“backtrace”(或简称“bt”)命令检查当前堆栈帧,而不是堆栈帧列表。如果您看到两个或多个函数的重复模式相互调用,那么您将进行相互递归。
答案 2 :(得分:0)
您可以使用backtrace命令检查当前堆栈帧。
答案 3 :(得分:0)
您还可以在gdb中获取当前堆栈指针(例如,通过运行'info registers'),然后使用examine(或'x')命令将内存转储到该位置。请注意堆栈指针将指向堆栈,因此您需要从堆栈指针 - N开始转储以查看堆栈中的前N个字节。