如何使用gdb来探索堆栈/堆?

时间:2010-10-06 17:03:30

标签: c debugging gdb stack heap

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

感谢。

4 个答案:

答案 0 :(得分:14)

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

所以如果你想查看堆栈或堆的位,请尝试

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

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

答案 1 :(得分:3)

尝试使用dddddd manual

确定。也许我详细说明一下。我这样用它。

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

gcc -g program.c -o program

运行ddd

ddd program

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

答案 2 :(得分:2)

我使用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>。不确定检查堆栈/堆变量有什么特别之处吗?

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

对于其他任何事情,都有大量的gdb&amp;许多网站还提供 gdb cheat sheets

答案 3 :(得分:2)

查看堆栈: gdb> backtrace

查看当前堆栈框架: gdb> info frame

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

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

导航到父堆栈框架: gdb> frame 1

Examining the Stack