1. Linux下gdb介绍:
虽然 Linux系统下,读者编写 C/C++代码的IDE可以自由选择,但调试生成的 C/C++ 程序一定是直接或者间接使用gdb调试器。调试是开发流程中一个非常重要的环节,因此,对于从事 Linux C/C++ 的开发人员,熟练使用gdb 调试是一项基本要求。
2. Linux下C代码的编译:
gdb调试器的主要功能,就是监控程序的执行流程。Linux发行版中,经常使用gcc编译 C、C++ 程序。但需要注意的是,仅使用 gcc(或 g++)命令编译生成的可执行文件,是无法借助gdb进行调试的。
gcc编译器的优化选项:
gcc编译器支持 -O(等于同 -O1,优化生成的目标文件)和 -g 一起参与编译。GCC 编译过程对进行优化的程度可分为 5 个等级,分别为 O0~O4,O0 表示不优化(默认选项),从 O1 ~ O4 优化级别越来越高,O4 最高。
所谓优化,例如省略掉代码中从未使用过的变量、直接将常量表达式用结果值代替等等,这些操作会缩减目标文件所包含的代码量,提高最终生成的可执行文件的运行效率。
而相对于 -O -g 选项,对 GDB 调试器更友好的是 -Og 选项,-Og 对代码所做的优化程序介于 O0 ~ O1 之间,真正可做到“在保持快速编译和良好调试体验的同时,提供较为合理的优化级别”。
(1) 不带调试信息的代码的编译:
Linux下一般编译C/C++代码时,编译命令为gcc debug_test1.c -o debug_test1,则生成的debug_test1即为可运行程序,该程序是不带调试信息的程序。
(2) 带调试信息的代码的编译:
如果我们需要对生成的可执行程序进行gdb调试,则在编译时需要加上-g选项,加上-g选项即向编译器表明,该程序需要编译成可以gdb调试的代码,加上编译信息,生成的执行文件是带调式信息的程序(比如各行代码所在的行号、包含程序中所有变量名称的列表(又称为符号表)等),生成的可执行程序文件大小也会变大。
终端输入编译命令:gcc -g debug_test1.c -o debug_test1
如果通过Makefile文件进行编译,则在Makefile文件中 -o 编译时添加 -g选项即可。
3. Linux下gdb调试方法
(1) 判断Linux系统是否安装gdb:
一般我们安装了gcc编译器,就默认同时安装了gdb调试器。
判断当前Linux系统是否安装有gdb,终端输入命令:gdb -v,如果已安装gdb工具,显示如下:
如果没有安装gdb调试器,则可通过输入命令: sudo apt-get install gdb,即可安装,如下所示:
sudo apt-get install gdb
(2) 启动gdb时不显示提示信息
gdb在开始调试程序时,会打印一些免责条款信息。如下所示:
通过添加 --silent(或者 -q、--quiet)选项,即可关闭免责条款信息的打印。开启gdb命令时同时加上该选项。如输入如下命令 :
gdb ./debug_test1 -silent 或
gdb ./debug_test1 -quiet 或
gdb ./debug_test1 -q 命令。
以上命令任选一,即可关闭gdb的免责打印信息。如下所示: