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

23

请问有没有人能够快速概述或者提供一些文档,告诉我如何检查C程序的堆栈(和堆)?我认为这应该使用GDB来完成,但如果有其他更简单的替代方案,那也可以。

谢谢。


你使用什么操作系统? - Karel Petranek
啊,抱歉,是的:操作系统:Ubuntu Linux,编译器:GCC。 - Dervin Thunk
5个回答

19

你可以使用 'x' 命令来转储原始内存。

因此,如果想要查看堆栈或堆的位,请尝试以下操作:

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

最后一个将显示从heapvar之前20个字节开始的200个字节。因此,如果您刚刚malloc了它,您还可以看到堆头


我喜欢你的方法!有没有好的gdb插件可以检查堆并显示其块数据、头部、使用位等等?我刚刚发现了gdb-heap。不幸的是,它似乎相当过时且未维护。 - rc0r

6

查看调用堆栈:

gdb> backtrace

查看当前堆栈帧:

gdb> info frame

查看当前堆栈帧的参数:

gdb> info args

查看当前堆栈帧的局部变量:

gdb> info locals

导航至父堆栈帧:

gdb> frame 1

检查堆栈


没有显示原始内存内容。 - Max Power

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速查表

2
尝试使用 dddddd手册 好的,也许我可以稍微解释一下。我这样使用它。
编译我的程序时带有调试符号:
gcc -g program.c -o program

运行ddd

ddd program

在GUI中,您可以执行各种操作,如查看机器代码、查看内存等等。浏览一下。 在手册中还有一个检查堆栈的部分。ddd为您提供了一个很好的界面来检查C程序。


我以为DDD只是GDB的前端界面,不是吗? - Dervin Thunk
我发现它比gdb更方便。在GUI中,您可以同时查看多个内容。在gdb中,我一直在不停地滚动。 - Casual Coder
它只是GDB的前端,参见更新的手册位置。然而,对于某些类型的工作流程,它可能比仅限控制台的工具更为直接。 - starturtle

0

core_analyzer 包含 gdb 插件和独立工具。
最新版本只包含 gdb 插件。

gdb 插件 命令显示内存统计信息。

(gdb)
heap  [/verbose or /v]  [/leak or /l]
heap  [/block or /b]  [/cluster or /c]  <addr_exp>
heap  [/usage or /u]  <var_exp>
heap  [/topblock or /tb]  [/topuser or /tu]  <num>

独立工具有水平搜索和垂直搜索功能,可能符合您的期望。

[0] Print General Core Information
[1] Find References to an Object (horizontal search)
[2] What Is This Address and Underlying Object Type (vertical search)
[3] Objects Shared Between Threads
[4] Memory Pattern Analysis
[5] Query Heap Memory Block
[6] Page Walk (check the integrity of surrounding memory blocks)
[7] Heap Walk (check the whole heap for corruption and memory usage)
[8] Biggest heap memory blocks
[9] Biggest Heap Memory Owners (variables)
[10] Heap Memory Leak Candidates
[11] Quit

在我的情况下,我无法从core_analyzer获得预期结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接