前段时间调试摄像头需要debug一下,于是学习了一下Linux环境下的几种debug的方法,其中我最喜欢的是使用GDB调试器进行C代码的调试,这里给大家分享出来供大家学习。

GDB是GNU开源组织发布的一个强大的Linux下的程序调试工具。一般来说,GDB主要帮助你完成下面四个方面的功能:
gdb程序调试的对象是可执行文件,,需在执行gcc指令编译程序时,加上-g参数,指定程序在编译时包含调试信息。调试信息包含程序里的每个变量的类型和在可执行文件里的地址映射以及源代码的行号。gdb 利用这些信息使源代码和机器码相关联。
启动gdb后,可以在命令行制定很多选项,也可以用下面的方式在命令行中指定想要调试的文件名:
$ gdb filename
此时,gdb会装入名为filename的可执行文件,用这种方式运行gdb可以直接指定想要调试的程序。也可以用gdb去检查一个因程序异常终止而产生的core文件,或者与一个正在运行的程序相连。
我们想要使用GDB调试需要首先下载并安装GDB,具体安装方式如下:
下载gdb源码:
https://ftp.gnu.org/gnu/gdb/
编译安装gdb调试工具
sudo apt-get install libgmp-dev
解压文件
tar -vxzf gdb-11.2.tar.gz
创建文件夹(在gdb目录下)
mkdir build output //build存放配置文件 output存放安装文件
配置(切换到/gdb/build目录下)。如果配置错误,直接删除build文件夹,再次创建文件夹,重新配置。
//--build 编译代码的主机
//--host 运行代码的主机
//--target
../configure --build=aarch64-rockchip-linux-gnu --host=aarch64-rockchip-linux-gnu --prefix=/home/forlinx/test/gdb/gdb-11.2/output
编译(在/gdb/build目录下执行)
make
安装 (在/gdb/build目录下执行)
make install //会将文件安装到--prefix=/home/forlinx/test/gdb/gdb-11.2/output指定目录
我们在启动 GDB 的同时,会打印出一堆免责条款。通过添加 --silent(或者 -q、–quiet)选项,可将比部分信息屏蔽掉:
启动GDB:
GDB 调试器提供有大量的调试选项,可满足大部分场景中调试代码的需要。如下图 所示,罗列了几个最常用的调试指令及各自的作用:

如上所示,每一个指令既可以使用全拼,也可以使用其首字母表示。另外,表 1 中罗列的指令仅是冰山一角,GDB 还提供有大量的选项,可以通过 help 选项来查看。
下面给大家演示一下GDB的使用过程,首先使用GDB+文件名的方式启动GDB调试器

进入GDB调试器后我们就可以进行代码的调试了,但是在调试之前我们一般需要对代码进行打断点的操作,我们可以使用 l 命令将我们的代码行号打印出来(小的demo可以这么做,但是大的程序不建议使用该方式)。
如果你的代码量非常的大,那么这种方式肯定不适合你,你可以使用 b+函数名 的方式来打断点。

l 显示带行号的源代码:默认情况下一次只能显示10行,按回车显示后续代码,比较大的代码可以忽略该方式。
我们使用 b+函数名 或 b+行号 的方式进行打断点。

打完断电后我们可以使用 r 命令开始运行程序,程序会自动运行,并在断点位置停下。

到这里我们就可以开始我们自己的操作了,比如我们可以查看某个变量的值,我们可以让代码运行下一句等等操作。
显示变量的值:

单步运行:

当然我们也可以使用 s 实现单步运行,但是两个执行的过程是不一样的,感兴趣的可以去百度一下。
我们可以使用 c 继续运行程序:

q 退出调试:

Enter键,复制上一条命令,单步调试的利器
一块好的调试工具可以让你工作效率翻倍,当然Linux下并不止GDB这一款调试器,大家感兴趣的话可以了解一下其他的调试工具,基本上都大同小异,无非就是打断点、查看变量值、单步运行这些工作,但是有些工具会有些特定功能,大家可以自行百度一下。