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

Posted

技术标签:

【中文标题】如何使用 gdb 探索堆栈/堆?【英文标题】:how to use gdb to explore the stack/heap? 【发布时间】:2011-04-21 23:06:28 【问题描述】:

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

谢谢。

【问题讨论】:

你使用什么操作系统? 啊,对不起,是的:操作系统:Ubuntu Linux,编译器:GCC。 【参考方案1】:

我使用 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 cheat sheets

【讨论】:

【参考方案2】:

尝试使用ddd。 ddd manual

好的。也许我会详细说明。我就是这样用的。

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

gcc -g program.c -o program

运行ddd:

ddd program

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

【讨论】:

我以为 ddd 只是 gdb 的前端,不是吗? 我发现它比 gdb 更方便。在 gui 中,您可以同时查看几件事情。在 gdb 中,我一直在回滚。 它只是 gdb 的前端,请参阅 updated manual location。但是,对于某些类型的工作流来说,它比仅控制台的工具要简单得多。【参考方案3】:

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

因此,如果您想查看堆栈或堆的位,请尝试类似

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

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

【讨论】:

我喜欢你的方法!是否有任何好的 gdb 插件可以检查堆显示它的块数据、标题、使用中的位等?我刚刚找到gdb-heap。不幸的是,它似乎已经过时且无人维护。【参考方案4】:

查看堆栈: gdb> backtrace

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

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

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

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

Examining the Stack

【讨论】:

以上是关于如何使用 gdb 探索堆栈/堆?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 GDB 检查堆栈帧?

比较 2 个 GDB 核心转储

如何获取 gdb 调用堆栈跟踪?

GDB 损坏的堆栈帧 - 如何调试?

使用 GDB 在堆栈上打印符号

谁知道如何查看Windows下正在运行的程序堆栈,Linux可以用gdb,windows下该用啥