2010-10-06 58 views
14

任何人都可以给我一个快速的概述/指向我的文件的方式来检查C程序的堆栈(和堆?)?我认为这应该用GDB来完成,但是如果还有其他更直接的选择,那也应该是好的。如何使用gdb来探索堆栈/堆?

谢谢。

+0

你用什么操作系统? – 2010-10-06 17:11:38

+0

啊,对不起,是的:操作系统:Ubuntu Linux,编译器:GCC。 – 2010-10-06 17:13:22

回答

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 &许多网站大量的文档还提供gdb cheat sheets

3

尝试使用dddddd manual

好的。也许我稍微说一下。我这样使用它。

编好的程序编译与调试符号:

gcc -g program.c -o program 

运行ddd

ddd program 

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

+0

我以为ddd只是gdb的前端,不是吗? – 2010-10-06 18:19:25

+0

我发现它比gdb更方便。在gui中,您可以一次查看几件事情。在gdb中,我一直在回滚。 – 2010-10-06 18:40:14

+0

这只是gdb的前端,请参见[更新的手动位置](http://www.gnu.org/software/ddd/manual/html_mono/ddd.html)。但是,对于某些类型的工作流程而言,它可以比仅用于控制台的工具更直接。 – starturtle 2016-08-03 12:15:28

12

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

所以如果你想看看堆栈位或堆尝试像

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

事情最后一个会告诉你200个字节从heapvar之前的20个字节开始。所以,如果你只是malloced,你可以看到堆头太

+0

我喜欢你的方法!是否有任何好的gdb插件允许检查堆显示它的块数据,标题,使用位等?我刚刚找到[gdb-heap](https://fedorahosted.org/gdb-heap/)。不幸的是,它看起来很不合时宜,无人维护。 – rc0r 2015-08-25 06:02:46

0

查看堆栈: gdb> backtrace

查看当前栈帧: gdb> info frame

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

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

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

Examining the Stack