调试之剑

跟踪调试:GDB
gdb 是由 GNU 软件系统社区提供的调试器,同 gcc 配套组成了一套完整的开发环境,可移植性很好,支持非常多的体系结构并被移植到各种系统中(包括各种类 Unix 系统与 Windows 系统里的 MinGW 和 Cygwin )。此外,除了 C 语言之外,gcc/gdb 还支持包括 C++、Objective-C、Ada 和 Pascal 等各种语言后端的编译和调试。 gcc/gdb 是 Linux 和许多类 Unix 系统中的标准开发环境,Linux 内核也是专门针对 gcc 进行编码的。

通常,在为调试而编译时,我们会(在尽量不影响程序行为的情况下)关掉编译器的优化选项(-O), 并打开调试选项(-g)。另外,-Wall 选项打开所有 warning,也可以发现许多问题,避免一些不必要的 bug:

$ gcc -g -Wall program.c -o program
-g选项的作用是在可执行文件中加入源代码的信息,比如可执行文件中第几条机器指令对应源代码的第几行,但并不是把整个源文件嵌入到可执行文件中,所以在调试时必须保证gdb能找到源文件。

如果使用Makefile进行编译,可以在执行make时使用CFLAGS=-g选项,将可以为每次编译都添加-g选项。详见直接在命令行定义Makefile变量

在 GDB SHELL 中调试
编译好之后用 gdb 启动要调试的程序:
$ gdb program
之后会出现 gdb 的 shell,输入
run args
即可启动程序,args 是传递给程序的命令行参数。当然,在启动之前,通常会先设置断点,并熟悉一下相关的命令。

常用命令

以下列出一些常用的命令(括号里的字符表示缩写,具体语法请参见帮助文档):

命令 描述
backtrace(或bt) 查看各级函数调用及参数,与where命令等效。
break(或b) 设置断点。break if 可以设置断点在满足某个条件时才激活,如break 9 if num != 0。
delete(或d) delete是一系列命令,最常用的是删除断点 delete breakpoints 断点号,不加断点号则提问是否删除所有断点。
disabledelete相似,但只是禁用而不是删除。
condition 为断点指定条件。例如,cond 1 argc==1 为编号为 1 的断点设置条件 argc==1。
continue(或c)连续运行直到下个断点
finish 连续运行到当前函数返回为止,然后停下来等待命令
frame(或f) 帧编号 选择栈帧
info(或i) info 是一系列命令,其中最常用的是列出所有断点的 info breakpoints 和查看当前栈帧局部变量的 info locals
list(或l) 列出源代码,接着上次的位置往下列,每次列10行
list行号 列出从第几行开始的源代码
list 函数名 列出某个函数的源代码
next(或n) 单步执行下一行语句
print(或p) 打印表达式的值,通过表达式可以修改变量的值或者调用函数
quit(或q) 退出gdb调试环境
set var 修改变量的值
start 开始执行程序,停在main函数第一行语句前面等待命令
step(或s) 单步执行下一行语句,如果有函数调用则进入到函数中
quit(或q) 退出调试器。
run(或r) 启动程序,可以给程序传递命令行参数,也支持重定向操作
display 变量名 跟踪查看某个变量,每次停下来都显示它的值。
undisplay 跟踪显示号 可以取消跟踪显示。
watch 设置观察点。
x 从某个位置开始打印存储单元的内容,全部当成字节来看,而不区分哪个字节属于哪个变量
一个典型的 gdb 调试的过程是启动程序,run 运行,程序出错退出,用 where 查到出错的位置,设置断点,重新运行程序,然后在出错的附件使用 next 和 step 单步跟踪,并查出问题所在。

GDB 之歌

这是一首改编自经典儿歌 ABC 的歌曲,出自GNU。不仅有趣,而且还介绍了 run、print、set、quit 几个有用的功能。不过个人觉得D和B两句歌词的后半句应该对换,你觉得呢?;-)

Let’s start at the very beginning, a very good place to start,
When you’re learning to sing, its Do, Re, Mi;
When you’re learning to code, its G, D, B.
(background) G, D, B.
The first three letters just happen to be, G, D, B.
(background) G, D, B.
(Chorus)
G!,
GNU!, it’s Stallman’s hope,
D,
a

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值