GDB调试复杂数据结构的几个技巧

使用GDB调试时,经常会遇到一些非常复杂的数据结构。当我们需要查看它的内容时,GDB虽然可以正确输出它各个字段的值,但它的显示结果却不那么友好,甚至十分混乱。

我们看一个例子。

实例:GDB打印复杂数据结构

测试程序如下图所示:

编译一下:

gcc -g struct.c -o struct

然后用GDB进行调试:

gdb ./struct

为了照顾对GDB不熟悉的童鞋,让他们了解GDB的基本调试命令,我简单介绍下操作步骤:

  1. b(break的缩写)命令在main()函数入口设置断点
  2. r(run的缩写)命令开始执行程序,程序执行到main函数时,触发断点。
  3. n(next的缩写)命令进行单步执行。
  4. 等程序完成变量var的初始化之后,使用p(print的缩写)命令打印变量var的内容。

具体操作如下图所示:

GDB确实把变量var的每个字段都正确打印了出来,但看着这个格式,是不是觉得比较混乱呢?如何解决呢?很简单,一个简单的命令就可以搞定!

GDB pretty-print

GDB内置了pretty-print的功能,能够以更加直观的方式打印数据结构。

不过,GDB的这个功能是默认关闭的,我们现在把它打开,看一下效果。

用下面这条GDB命令:

set print pretty on

效果如下图所示:

现在,看上去是不是清爽多了呢?每个字段都一目了然。

但是,还不够完美。

如图中所示,var中有两个数组类型的字段,GDB按照顺序把每个元素逐个打印了出来。但是,却很难把某个具体的值和数组索引对应起来。试想一下,如果数组有上百个元素,要找到其中某个特定索引的元素的值,岂不是要从头开始一个一个地数过去?

不用担心,GDB也提前帮我们准备了解决方案。

GDB 打印数组索引

GDB的print命令支持打印数组索引的功能,不过,这个功能也是默认关闭的。

用下面的命令可以打开:

set print array-indexes on

效果如下:

现在一切都清晰多了吧!

到此为止,关于数据结构的打印,已经足够清晰了。

接下来,再补充一个与打印无关的小技巧。

还你一个清爽的启动界面

作为程序员,很多童鞋都是“完美主义者”,有着各种代码洁癖,对工具的使用上,也极力追求简单实用。

你没有注意过,GDB每次启动时,都要打印一大段信息呢?如下图所示:

主要是版本和版权信息,以及一些常规性的帮助提示。绝大多数情况下,对调试没有实际作用,反而还很影响视觉。你每次看到这些信息的时候,有没有觉得很不爽呢?

其实,GDB启动的时候,加上“-q”命令即可去掉这些无用信息。

现在是不是更加清爽了?

GDB启动脚本.gdbinit

我们前面介绍了在使用GDB调试时,通过执行命令打开GDB的pretty-print和打印数组索引的功能。虽然这些命令比较简单易用,但如果每次调试都要执行一遍,还是稍显麻烦的。

我们可以利用GDB的启动脚本.gdbinit来解决这个问题。GDB每次启动时,在开始真正地调试程序之前,都会先执行.gdbinit里面的配置信息。

现在,在home目录中创建一个.gdbinit文件:

vi ~/.gdbinit

然后,把我们前面介绍的命令输入进去:

保存即可。

然后,为了每次启动GDB的时候去掉那些版本信息,我们可以给GDB设置一个命令别名:

vi ~/.bashrc

在文件的最后面,添加如下信息:

alias gdb="gdb -q"

然后保存退出,再执行:

source ~/.bashrc

现在就全部完成了。

我们看下最终的效果吧:


欢迎关注微信公众号:【原点技术】,分享真正有用的东西!

进技术交流群,欢迎添加作者微信:CreCoding

原创文章,未经允许禁止转载,转载请联系作者:CreCoding

  • 19
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值