- 什么是GDB?
GDB是一个由 GNU 开源组织发布的、UNIX/LINUX 操作系统下的、基于命令行的、功能强大的程序调试工具。
GDB 中的命令固然很多,但我们只需掌握其中十个左右的命令,就大致可以完成日常的基本的程序调试工作。
GDB 是 linux 下调试程序的神器,做为 linux 程序员,如果不能熟练的使用 GDB 进行程序调试,那将是很失败的事情,会让你在工作中对于程序的调试煞费苦心,不仅工作效率低下,并且写满到处的 printf更是让人苦不堪言…所以 GDB 也渐渐的成为了 linux 程序员的一个必备软件技能。
- GDB的使用
1.开启程序的gdb调试
程序编译阶段,需添加-g 选项,产生符号调试工具(GNU 的 gdb)所必要的符号信息。
例如:
编译:
运行:
程序出现了段错误,段错误因为并非在程序编译阶段出错,因此排查起来比较麻烦,程序短小时候,还可以使用 printf 函数多加调试信息即可排查,当代码量大的时候,将是以间头疼的事情,这时候就需要用到 gdb 调试工具来协助排查。
2.进入gbd调试
进入gdb调试方式:
3.开始gdb调试
开始调试有2中方式:
a) r(run) 开始运行程序,可携带参数
b)s(start) 单步调试
s(step):如果当前步是函数,则跟进函数内部,逐步调试
n(next):不管当前步是否为函数,不跟进函数,仅逐步调试当前程序。
4.排查错误位置
r 命令后,程序开始运行,出错
bt 命令(查看堆栈信息)
我们可以从上边的信息中看到错误好像是 memcpy 部分的问题,应该是内存拷贝出问题了,这时候需要 bt 命令来查看以下堆栈信息。
从打印信息来看,错误似乎是在init.c的10行出错。
b 命令(添加断点)
这时候我们需要在 init.c 文件的 10 行添加断点,来看看到底是否是这里出的问题。
添加断点成功后,我们重新 r 命令运行程序
l 命令(查看调试附近代码)
当程序重新走到 210行的时候,遇到断点,暂停运行,这时候我们如果想查看 10行附近代码的话,可以使用 l 命令 。
p 命令(打印变量信息)
程序走到10行并没有出错,这时需要查看变量的内容是不是出问题了。
可以看出该变量没有问题。从头逐步调试的话,不难发现,实际上是因为我们p1变量是一个字符常量,但是使用了memcpy,因此出错。
i 命令(查看信息)
d 命令(删除断点)
q 命令(退出 gdb 调试)