20

谁能给我一个快速的概述/指向我检查C程序堆栈(和堆?)的方法的文档?我认为这应该用 GDB 来完成,但如果有其他更直接的替代方案,那也应该没问题。

谢谢。

4

4 回答 4

19

您可以使用“x”命令转储原始内存

因此,如果您想查看堆栈或堆的某些部分,请尝试以下操作

x/10b &stackvar
x/200b &heapvar-20

最后一个将显示从 heapvar 之前的 20 个字节开始的 200 个字节。所以如果你只是 malloced 你也可以看到堆头

于 2010-10-06T17:56:35.153 回答
6

查看堆栈: gdb> backtrace

查看当前堆栈帧: gdb> info frame

查看当前堆栈帧的参数: gdb> info args

查看当前栈帧的局部变量: gdb> info locals

导航到父堆栈帧: gdb> frame 1

检查堆栈

于 2018-02-09T08:13:27.477 回答
3

我使用 GDB 进行调试的第一种方法是设置断点。这样做是这样的:

prompt> gdb ./x_bstree.c
(gdb) #prompt
(gdb) b 123 #break at line 123
(gdb) r #start program

现在您的程序在程序的第 123 行停止。现在您可以使用 . 检查堆栈或堆中的变量print。对于堆栈变量,只需使用print <varname>. 对于堆变量(指针),使用print <*varname>. 不确定检查堆栈/堆变量有什么特别的事情要做吗?

当然,要调试多线程应用程序,您需要使其以单线程模式运行,然后再进行调试,否则很难预测发生了什么。

对于其他任何事情,都有大量的gdb文档,许多站点还提供gdb 备忘单

于 2010-10-06T17:41:32.883 回答
3

尝试使用ddd. ddd手册

行。也许我会详细说明。我像这样使用它。

用调试符号编译我的程序:

gcc -g program.c -o program

运行ddd

ddd program

在 gui 中你可以做各种各样的事情,查看机器码,查看内存等等。看看周围。在手册中还有一段检查堆栈。ddd为您检查C程序提供了良好的界面。

于 2010-10-06T17:42:56.773 回答