Linux开发工具【gdb】
程序的发布方式有两种,debug
模式(调试版本)和release
模式(发布版本)。Linux
下gcc/g++
出来的二进制程序,默认是release
模式。无法保证我们的代码有时候会出现问题,这时就要使用Linux
的调试器gdb
进行调试,下面我们就来讲讲gdb
的使用
1. 可调试文件
上面说过gcc/g++
默认会生成release
版本的可执行程序,我们可以使用指令来查看可执行程序中是否有调试信息
readelf -S 可执行程序 | grep -i debug //查看可执行程序中的调试信息
这里我们会发现什么信息都没查到
要使用gdb
调试,必须在源代码生成二进制程序的时候, 加上 -g
选项
完成这一操作直接在Makefile文件中做出修改即可
再次生成可执行程序就可以看到调试信息了
2. gdb调试操作
没有gdb
的话可以自行下载
sudo yum install -y gdb //安装gdb
2.1 进入与退出调试
生成可调试文件后,使用指令gdb 可调试文件名
即可进入调试
gdb 可调试文件名 //进入调试
出现(gdb)
标志了就表示进入gdb
了
使用q
指令就可以直接退出gdb
调试
q //退出gdb调试
2.2 查看代码
通过l/list
指令查看代码,查看代码的时候不会影响到其他调试指令
l/list //默认查看代码中间的十行
l/list 1 //从代码第一行开始查看其前后十行
还可以使用指令list/l
函数名来列出该函数的源代码
==注意:==所有查看内容的指令并不会影响调试的指令
2.3 运行和断点
指令r/run
可以运行程序,没有断点的话程序会直接运行出结果
r/run //运行程序
使用指令b/break 行号/函数名
可以在程序中设置断点
b/break 行号 //在指定行号设置断点
b/break 函数名 //在指定函数设置断点
使用指令info b/break
可以查看所有断点信息
info b/break //查看所有断点信息
Num
这一列就是表示断点的编号,它会一直累加,直到调试结束
使用指令d 断点编号
可以取消断点
d 断点编号 //取消指定断点
有了运行和断点下面我们就可以进行调试了
2.4 单行和单步调试
使用指令n/next
进行单行调试,单行调试就是逐过程调试,向下调试的时候不会进入函数内部
n/next //单行调试
使用指令s/step
进行单步调试,单行调试就是逐语句调试,向下调试的时候会进入函数内部
s/step //单步调试
2.5 常用调试指令
gdb
的使用门槛较高,需要多加练习,下面附上一些gdb
常用调试指令,没列举到的大家可以自行查阅资料,希望能给大家带来帮助
list/l 行号 //显示源代码,接着上次的位置每次十行往下列
list/l 函数名 //列出某个函数的源代码
r/run //运行程序
s/step //逐语句(进入函数)
n/next //逐过程(不进入函数)
break/b 行号 //在改行设置断点
info break //查看断点信息
d/delete n //删除序号为n的断点
d/delete //删除所有断点
disable breakpoint n //禁用序号为n的断点
enable breakpoint n //启用序号为n的断点
breaktrace/bt //查看各级函数调用及参数
p 变量名 //打印变量值
set var 表达式(比如:i = 100) //修改变量的值
display 变量名 //跟踪查看一个变量,每次停下来都显示它的值(长显示)
undisplay 序号 //取消序号对应的变量的跟踪
until 行号 //跳转到对应的行号所在行,执行完区间代码
finish //进入一个函数执行完该函数就停下来
continue/c //从一个断点处直接运行至下一个断点处
q/quit //退出gdb调试器
Linux开发工具gdb,到这里就介绍结束了,本篇文章对你由帮助的话,期待大佬们的三连,你们的支持是我最大的动力!
文章有写的不足或是错误的地方,欢迎评论或私信指出,我会在第一时间改正