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

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

谢谢。

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

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

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

当然,要调试multithreading应用程序,您需要使其以单线程模式运行,然后再调整,否则很难预测正在发生的事情。

对于其他任何东西,有大量的gdb文档,许多网站也提供gdb备忘单

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

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

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

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

尝试使用ddd 。 ddd手册

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

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

 gcc -g program.c -o program 

运行ddd

 ddd program 

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

查看堆栈: gdb> backtrace

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

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

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

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

检查堆栈