linux环境下进行C、C++开发系列,前面已经发了三篇博客,分别是系统选择和环境搭建、编译工具cmake简介、以及vim-plus开发日常使用指令简介。本篇将向读者讲述如何在linux下进行使用gdb工具进行代码调试。代码调试我认为是每个程序员必备的技能,在某种程度上甚至超越编码本身,毕竟没有程序员在代码生涯中不会产生bug,调试就是找到bug产生原因,并解决bug的最佳手段。本篇将向读者讲述gdb的使用,和常用的gdb调试指令。
1. 生成debug版可执行文件
在编码过程中时常需要检查我们编写的代码是否符合我们的预定目的,倘若偏离了预定目的这个时候就需要我们进行代码的调试来找到问题点和原因,加以解决。一般的在测试阶段我们都会生成debug版本的可执行文件便于代码的调试。前篇讲述cmake使用的博客中,有过关于该选项的描述,本篇考虑到完整性再次进行讲解。生成debug版的可执行文件,在编写CMakeLists.txt时就需要指定编译类型以及其他设定,以便在生成可执行文件之后,可以使用gdb来进行代码的调试。具体设定如下:
#指定生成debug版本,以便于使用gdb进行调试
SET(CMAKE_BUILD_TYPE "Debug")
SET(CMAKE_CXX_FLAGG_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
如需生成debug版可执行文件,需要在CMakeLists.txt中加上以上设置即可,设定了编译的类型,以及指定编译时加入调试信息,如需查看cmake其它相关信息,请翻阅本系列博客相关篇章。
2. 执行编译
a. 使用cmake 指令生成makefile。
b. 使用make 指令生成可执行文件。
c. 利用cd指令进入可执行文件目录。
3. 使用gdb进行代码调试大致过程
a. 启动gdb开始调试。命令为:gdb 可执行文件名 回车后,即可进入gdb。如下图所示:
b. 进入gdb后,即可在需要的代码处设置断点。设置断点命令为:break、或者是简化命令 b 本小节旨在说明gdb代码调试的大致流程,具体常用的调试命令详见下一节。
c. 设置好断点后,就可以运行程序了,使用命令:run 回车后,程序开始执行,会在断点处停止下来,等待你其他调试命令。
d. 查看变量值,使用命令: print、display 等命令查看相关变量值。
e. 单步跟踪,使用命令:step、next 根据需要可选择这两个命令中的其中一个进行单步跟踪。
f. 如果断点间代码行数较多,且不需要单步跟踪,使用命令跳过无关代码行:continue 跳过无关代码行。
g. 找到问题点及bug产生原因后,一路执行完毕,使用命令:quit 退出gdb。
一般代码调试大致流程基本如上所述,设置断点、查看变量、单步跟踪,几个步骤循环重复下来,基本能定位问题点,找到原因,常用这些命令可以满足大多数调试要求,具体命令说明,如下所述。
4. 常用调试命令说明
a. 运行代码命令。:run 该命令可以开始运行程序,直到遇到第一个断点, 会在第一个断点处停下。如果需要在程序运行第一行就停下,可以使用:start 命令,将会在第一行代码处停止。
b. 显示当前代码。:list 该命令可以显示当前执行处的具体源代码。
c. 断点设置命令。:break 或简写 b 这个命令有多个版本参数,每类版本作用各不相同。
break 行号
break 文件名:行号
break 文件名:函数名
以上三类可以根据当时环境设置断点。
d. 显示变量值。
print 变量; print {变量1, 变量2}
display 变量;display {变量1, 变量2}
print和display量命令区别在于,print在设置后,执行代码只显示一次值,display是一直显示值。
e. 单步跟踪。
step 该命令在遇到子函数时,将进入子函数。
next 该命令在遇到子函数时,将不进入子函数。
f. 设置运行时变量值
set var 变量=值 在调试中也许需要在运行时动态修改某些变量的值,已达到我们的预设目的,可以使用该命令。
g. 删除断点
delete 删除所有断点
delete 断点ID 删除指定ID断点
clear 删除所有断点
clear 文件名:行号 删除指定文件,行号的断点
clear 文件名:函数名 删除指定文件,函数名的断点
h. 其他命令
continue 继续执行至下一个断点
总结:如上简介了gdb调试代码的大致流程和在调试中常用的命令,通过这些命令我们可以查看变量值,可以单步跟踪执行,加上分析,基本可以解决绝大多数的问题。当然该篇也仅仅是初学者的基础篇,gdb的强大之处绝不仅仅只这点功能,其他诸如可以附加到某进程调试、可以进行崩溃core文件分析、配合gdbserver进行远程调试等等,本篇都未涉及,如需要更为详细和深入使用的各位同行请自行查找资料。由于本人也是初学,水平有限难免有所纰漏,如各位读者在文中发现问题请留言指出,以免误导他人,如想一起探讨问题共同进步的朋友,请留言与我互动一起成长。