Linux:GDB的使用(08)

259 阅读3分钟

1.GDB基本介绍

(1)什么是GDB

用于调试C、C++的调试器,通过对程序运行时状态的深度监控,提供对代码行为的精确控制与观测能力。

其目的是用于调试程序中的Bug

2.GDB的使用步骤

(1)调试准备

这里使用简单的小项目来说明调试的步骤,项目的结构如下所示: image.png

Makefile文件展示:这里使用Makefile和make进行项目的编译,以减少手动编译的复杂程序,其Makefile文件如下: image.png 对Makefile不了解的同志可以参考文章:juejin.cn/post/747000…

编译项目:make(执行Makefile文件中的命令) image.png image.png

查看生成的可执行文件app是否包含调试信息: image.png with debug_info表示该可执行文件包含调试信息

(2)启用和退出GDB调试

进入调试模式: gdb app(请确保app包含调试信息) image.png gdb app之后,可执行程序是没有被执行的,需要使用start/run命令来执行app程序

gdb中启动程序: start/run

start命令和run命令的区别:run(简写为r)命令执行到程序的第一个断点处,如果程序没有设置断点,那么程序就执行完毕;start命令会阻塞在main函数,等待其他gdb命令。 start命令:

image.png

gdb的退出: exitquit命令 image.png

(3)查看代码

list(简写l)用于查看对应文件的代码,常见的使用方法有两种:一种是查看main函数所在的文件代码,另一种是查看指定文件代码 image.png 通过上面的截图我们发现:list默认显示10行代码,这显然很令人沮丧,幸运的是,我们可以通过修改listsize变量来修改显示的代码行数:set listsize 20: image.png 还可以查看指定文件的代码哟,其格式是:list file:n image.png

(4)断点操作

使用list查看代码的主要目的就是让我们自主设置在哪个文件的哪行代码设置断点;关于断点的操作无非就是增删改查嘛,咱一个一个聊...

在非当前文件的某一行上设置断点:

break 文件名: 行号

break 文件名: 函数名

增加断点:break file: n && break file: 函数名 image.png image.png

查看断点:info breakinfo b image.png

删除断点: delete 断点编号d 断点编号 image.png 一次性删除多个断点: delete 1 2 3 4 等价于delete 1-4

修改断点信息:disable 断点编号 enable 断点编号 如果想让断点暂时失效,可以使用disable和enable命令来设置断点的状态(有效或无效) 局部截取_20250212_141237.png

(5)调试命令

执行命令:

step、next、finish和continue命令的区别:

step和next都是用于单步执行的调试命令,step会进入到函数内部,而next不会进入到函数内部,如果step调试进入到函数的内部,可以使用finish命令跳出该函数

continue用于直接跳转到下一个断点处

打印信息:

手动打印信息: print和ptype,分别用于打印对象信息和对象类型 image.png

自动打印信息: display和undisplay 局部截取_20250212_142907.png 局部截取_20250212_143058.png

*禁用自动打印:*disable display 编号 局部截取_20250212_143414.png

设置变量值

在调试时,我们如果希望程序的某个变量等于指定的值,通过程序运行让这个变量等于指定的值又比较困难,那么我们可以通过set var 变量名=值来设置;此外在循环中,可以设置循环因子的值,让程序跳出循环