本文已收录至《Linux知识与编程》专栏!
作者:ARMCSKGT
演示环境:CentOS 7
目录
前言
正文
下载gdb
生成可调式文件
进入gdb
gdb常用指令
查看代码 l
运行程序 r
断点设置 b
显示信息 info
查看断点 info b
删除断点 d
禁用断点 disable breakpoints
启用断点 enable breakpoints
逐过程调试 n
逐语句调试 s
查询变量 p
查询变量值常显示 display
取消变量常显示 undisplay
查询变量类型 ptype
修改变量值 set var
逐断点运行 c
执行到当前函数的return后停下 finish
跳转到指定代码行 until
查看调用堆栈 bt
查询当前栈帧中各变量参数 info locals
退出gdb指令 quit
部分指令的简写和全称
最后
前面我们介绍了gcc/g++的使用,我们知道在VS平台下编写代码是可以调试的,调试是我们经常使用的纠错手段,在Linux平台下也有相关的调试工具,那就是gdb,调试是我们必须掌握的技能,没有调试项目的错误就无法快速解决!
下载gdb
有些纯净Linux系统默认没有gdb,需要手动安装!
指令:
sudo yum -y install gdb
生成可调式文件
程序的发布方式有两种,debug模式和release模式,Linux工具gcc/g++出来的二进制程序默认是release模式,要使用gdb调试,必须在源代码生成二进制程序的时候加上 -g 选项!
指令:
gcc -g [编译文件] //g++操作与此相同
进入gdb
指令:
gdb [可执行程序]
gdb常用指令
在gdb中,输入一个指令后,下次不输入指令回车执行的是上一条指令,所以调试时如果接下来将长时间使用一条指令,则一直回车即可!
查看代码 l
l //查看第一行到第十行的代码(第一次执行时) l [行号] //查看程序从该行开始的前后五行代码(如果前面没有代码则向后显示十行) l [函数名] //显示该函数位置的前后五行代码(共十行)
说明:gdb在执行l指令后,再次回车会展示后十行代码!
运行程序 r
r //启动程序(有断点则运行到第一个断点处停下,没有则直接运行到结束)
说明:一般使用gdb都是先展示代码,然后运行程序,这样可以对照代码检查运行结果,在gdb中对于死循环的程序仍然可以使用CTRL+c退出程序,但不会退出gdb!
断点设置 b
b [行号] //在该行打下断点 b [函数名] //在该函数行打下断点
注意:对函数名打断点,断点会落在该函数执行的第一条语句!
显示信息 info
info [gdb指令] //部分指令可以通过info查看详细信息 i [gdb指令] //简写为i
说明:直接输入info指令会显示该指令的所有可操作选项!
查看断点 info b
//查看所有断点信息 info b //简写 info breakpoints info break
在gdb中info b指令是经常使用的查看断点的指令,当然info也不止于此!
在断点信息中我们会发现有Num一行编号,这个编号是让我们更好的对断点进行区分,当我们删除1号断点再次添加断点时,新断点为3号,断点顺序并未修改!当我们退出gdb时所有断点信息才会失效!
而且这些编号在进行关于断点的其他操作时,也会用到,例如删除断点需要这些编号指定!
删除断点 d
d [断点编号] //删除该编号断点 d //删除所有断点 d breakponits //删除所有断点
禁用断点 disable breakpoints
disable breakpoints [断点编号]
说明:有时候在进行大项目测试时,我们会打许多断点,我们不想让程序运行到某就停下断点,但是也不想删除断点,这时可以禁用断点!
启用断点 enable breakpoints
enable breakpoints [断点编号]
说明:当我们想使用被禁用的断点时,使用该指令可以启用断点!
逐过程调试 n
n //从断点处开始进行逐过程调试
逐过程调试不会进入函数,直接返回函数执行完的结果!
逐语句调试 s
s //从断点处开始逐语句调试
逐语句调试会进入函数中,将每一条语句运行展示!
查询变量 p
p [变量] //查看变量值 p(变量) print [变量] print(变量)
查看变量的方式可以简写,也可以通过括号将需要查询的变量括起来!
查询变量值常显示 display
display [变量] //让变量值随查询的运行一直更新显示
添加常显示后,程序每走一步(或一句)都会显示变量的常显示变量的变化!
说明:常显示中的变量前的编号与取消该变量的显示操作相关!常显示列表中的编号只会随着添加越来越大,并不会一直以1为开始!
取消变量常显示 undisplay
undisplay [常显示列表编号] //取消变量在列表中的常显示
说明:取消常显示并不是指定变量,而是指定其在常显示中的编号!因为在C++中,不同类和不同遇可能有相同的变量,此时会混淆!
查询变量类型 ptype
ptype [变量]
因为我们查询变量值时只能获取变量的值,如果需要获取变量的类型则可以使用这个指令!
修改变量值 set var
set var [变量] = [设置的值]
在程序运行时可能我们想一次性迭代到某数值,使用set var就能完成!
逐断点运行 c
c //逐断点按顺序跳转执行
当我们想在断点之间运行时,直接使用该指令即可,相当于VS的F5快捷键!
执行到当前函数的return后停下 finish
finish //让程序执行return语句后停下
指令要求:必须在有返回值的函数中运行且必须让程序先运行起来!
跳转到指定代码行 until
until [代码行号] //让执行位置跳转到指定行
当我们想要去某一条语句查看运行情况时可以使用此指令跳转!
说明:如果前面有未执行的代码该指令会运行到指定代码行号然后停下,如果是跳转到执行过的代码,则会从该行开始继续执行!
查看调用堆栈 bt
bt //查看函数调用,以栈的顺序显示
当我们需要查看函数相互之间的调用时可以使用该指令!该指令需要先运行程序才能查看,因为程序运行时会先为函数建立栈帧,没有运行程序就没有栈帧!
查询当前栈帧中各变量参数 info locals
info locals
当我们正在某一函数中调试时,通过该指令可以查看该函数中所有变量的值!
退出gdb指令 quit
quit //或使用 CTRL+d 也可以! q //也可以使用简写形式
退出gdb只需要输入q(quit)即可,或者使用快捷键CTRL+d,如果有程序正在调试没有退出,则gdb会先询问!
l | list |
r | run |
n |
next |
s | step |
b | break |
i b | info break |
f | finish |
p | |
c | continue |
d | delete breakpoints |
u | until |
bt | breaktrace |
q | quit |
Linux调试器gdb的介绍到这里就结束了,相信gdb的学习可以助力你在Linux相同上更顺利的构建大型工程,从容的面对各种bug,虽然在使用上与VS还有些差异,但是配合Linux上的其他工具一定可以使效率有一定的提升!
本次Linux调试器gdb的基本知识就介绍到这里啦,希望能够尽可能帮助到大家。
如果文章中有瑕疵,还请各位大佬细心点评和留言,我将立即修补错误,谢谢!
其他文章阅读推荐
Linux编辑器vim-CSDN博客
Linux 编译器 gcc/g++-CSDN博客
Linux项目自动化构建工具make/Makefile-CSDN博客
欢迎读者多多浏览多多支持!