2011-05-24 95 views
3

我遇到了堆栈溢出的问题,并希望看到堆栈中的内容是什么。检查堆栈

How can I examine the stack frame with GDB?是一种相同的问题,但info locals看起来很好(很少变量,其中大多数std :: vectors和std :: maps),所以我不希望堆栈溢出。此外,我已经将堆栈限制设置为32MB,所以这应该足够多,并且不使用递归函数。

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

+1

这听起来像你实际上没有堆栈溢出。你认为你做了什么? – 2011-05-24 21:24:45

+0

@Neil:请看看我的相关问题:http://stackoverflow.com/questions/6084901/stackoverflow-and-function-pointers。增加堆栈大小有助于确实,但并不能真正解决问题的根源 – bbtrb 2011-05-25 00:27:43

回答

5

堆栈溢出更容易被特殊分析器捕获,而不是手动查看gdb中的变量。更有可能你有缓冲区溢出而不是堆栈溢出。在这两种情况下,这里是一些廓线仪,可以帮助你指出问题的列表:

祝你好运!

+0

喜欢在该列表中添加“电子围栏”http://en.wikipedia.org/wiki/Electric_Fence – 2011-05-24 22:02:06

+0

@Fredrik:已添加。谢谢。 – 2011-05-24 23:28:51

+0

谢谢,我会看看这些... – bbtrb 2011-05-25 00:28:14

0

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

1

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

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

+0

谢谢你的提示,但不幸的是我没有看到这样的事情... – bbtrb 2011-05-25 00:28:55

0

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