如何使用gdb调试代码(一、A Globla view of GDB )

本文介绍了GDB的历史及其在全球视角下的作用。在启动GDB之前,需使用`-g`选项编译代码以创建符号表。GDB启动时会执行`~/.gdbinit`和当前目录的`.gdbinit`文件进行初始化。文章还提及了.eversible debugging的概念,并预告了后续将讨论如何设置断点。
摘要由CSDN通过智能技术生成

在前面的文章如何使用emacs阅读源代码中提到了打算写一篇如何使用gdb调试源代码 这样的文章,近日又刚好闲了下来,便挽起袖子,关门沏茶,一把ssh过去,便开工了。

History of GDB

GDB被用来调试代码,如果你习惯了用IDE来做那么一连串的事情,你可以尝试着从IDE中 解脱出来,看看IDE之外的世界。 RMS爷爷于1986年写了gdb的第一个版本,之后以GPL发布。现在gdb仍被一堆自由软件热爱 者捣鼓着。2006年左右gdb开始着手于实现"eversible debugging", 现在不知道进展 到了什么程度。什么是eversible debugging,说白了就是你执行下一步下一步正高兴着 呢突然发现执行过了现场跑了怎么办?那就靠神奇的eversible debugging来执行一条 称之为"上一步"的指令。于是,一切便重演了。

A Global View of GDB

before GDB start

在gdb启动之前,需要在编译源代码的时候加上-g选项。
gcc -g test.c -o test
对于我们而言,在代码中有函数名fancy_abort,变量名i等,但对于计算机来讲, 可能便是0x3993930a,0x3929ffce等。因此,我们需要提供给gdb一张符号表。 gcc的-g选项便提供了这个功能。事实上-g选项会告诉gdb两件事情: 1. 如何将一个 符号地址和源代码中的名称联系起来 2. 如何将一条机器码的地址和一行源代码联系起来。

启动gdb:

gdb test
(gdb) run
Starting program: /home/okidogi/blog/how_to_debug_with_gdb/src/test

Program exited normally.
(gdb)

其中run可带参数执行,即run arg0 arg1。便是程序的命令行参数。

GDB启动时候所做的事情

作为一个全局的大致性的了解,我会粗略解释gdb配置文件的格式及功能,详细的说明 会在合适的时候出现。一般来讲,gdb在初始化的时候大致做了以下几件事情。(注:这 个列表是不完整了,我略去了几条看起来不大重要的部分)。

  1. 执行~/.gdbinit文件。初始化一些命令,参数。
  2. 解析命令行参数。
  3. 执行当前工作目录下面的.gdbinit文件。 因为启动时先执行1再执行2,因此你不能在~/.gdbinit中设置断点等操作(还没有读取你要调试 的文件),当然你可以把一些使gdb用起来很舒服的设置放在这儿。当前工作目录下的.gdbinit文件 是一个良好的对各个工程可以分别对待的配置文件。这儿你可以做设置断点,写自己的函数等一系列 的事情。
    .gdbinit文件

.gdbinit文件在gdb初始化的时候对gdb进行配置。我不打算很详细的在这里将如何写这样的文件, 我抽取了gcc中gdb配置文件(gdbinit.in)的一部分来做为例子,做大致的说明:

define ptn
output $.type.name->decl_minimal.name->identifier.id.str
echo /n
end

document ptn
Print the name of the type-node that is $.
end

# Put breakpoints at exit and fancy_abort in case abort is mapped
# to either fprintf/exit or fancy_abort.
b fancy_abort

# Put a breakpoint on internal_error to help with debugging ICEs.
b internal_error

set complaints 0

在这个配置文件中,define可以用来定义自己的命令,这些命令可以在gdb中调用。define 和end block标识了一个用户自定义函数的完整定义。document end block则表述了对于定义函数 ptn的说明文档。在gdb中调用help ptn便会打印字符串"Print the name of the type-node that is $."。b fancy_abort即在调试代码中的fancy_abort函数处设置断点。b internal_error亦是同理。set complaints 0则是设置gdb为no complaints。

在下一节,大约会写写关于如何设置断点方面的内容。敬请关注:D

 

本文为我在yo2的博客的镜像,转载请注明出处。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值