想必大家应该都在Linux中写过代码,没写过的应该也不会点进这篇博客了。
(毕竟没写过也用不上gdb)
gdb是linux中的一种调试工具,可以帮我们进行断点,逐语句,逐过程的调试。
让我们在Linux中也能体会到在WIN中码代码的感觉。
了解了gdb后,那想要使用gdb第一件事肯定是安装gdb了。
先进行检查是否系统是否自带gdb
gdb --version
但是如果没有的话也没事
sudo yum install gdb
我因为自带所以就不用安装了。
现在既然装好了gdb,那就是如何使用了。
还记得我们之前码代码的时候,代码有两种模式:
debug/release
release是发行版本
debug是调试版本
我们想用gdb对代码进行调试,那首先的要求就是代码可以被进行调试
所以我们要将代码设置成debug模式。
所以这个时候就要在编译代码的时候将其设置为debug模式
gcc test.c -o test -g
这里发现-g加不加没有啥变化,但是如果用
readelf -S 文件名 | grep -i debug
就会发现多出了很多debug的文件
我们来看看不加-g的结果是怎么样的
这里会发现grep没有在test中查找出具有debug的文件。
这里在确保自己的可执行文件是debug版本后
就可以进入gdb的调试模式了
gdb 文件名
这里为了方便进行操作,所以在test.c中特地写了一段简单的循环
进入gdb后第一个疑问就是没有代码。
调试肯定是要看到源代码的啊
所以我们便来了第一个指令:
list/l 行号
l后跟了一个1,代表显示从第一行开始的十行
但是这里我们发现程序没有显示完全。
但是我们只要再按一次回车即可
因为gdb记住了上个指令,l 1执行完以后显示到10行,所以接下来直接按回车,
linux程序会自动执行l 11的指令.
不带 数字的l,第一次默认从零开始
但是如果不是第一次,那就默认从上次记忆的l位置处执行
所以:想要最快显示全部代码,打个l,不停按回车即可
r算是即显示代码之后最基础的指令了
r是run的缩写,所以毫无疑问就是执行代码的意思
b/break
b是break的缩写。
b 行号
很明显,代表的意思是在行号上打个断点
b 函数名称
代表的在函数上打断点
b test.c:行数/函数名称
文件名 文件名中的行数或者函数名称
这里打了断点后,我们发现这边代码上并没有进行标注哪里有断点。
所以想要查看断电信息
info b
num是断点序号
type就是类型
enb就是断点是否开启
address就是断点地址
what就是断点位于程序的位置
这里我们通过上面的info b,能发现多了一个相同行号的断点
我们可以通过
d 断点序号
来进行删除,断点序号就是info b中的num属性
这里就能看见完成了对断点的删除
disable 断点序号 设置断点关闭
enable 断点序号 设置断点开启
断点开关闭,就是控制断点是否有效。
就是info b中的enb属性
这里我们关闭了断点,可以发现2号断点enb变成了no
打了断点以后我们就可以进行程序的运行测试了。
我们打了断点后,不能直接用以下指令
我们首先需要用r将代码跑起来,才能使用下列指令
这里能发现程序左边的数字,代表的是程序运行到了哪一行,并且会显示当前运行的代码
这里就不进行演示了,因为效果大差不差。
我们能打断点了,能进行一步一步运行代码了。
现在差的就是显示当前行的变量值了。
bt是用来显示调用堆栈的,在递归中有明显的表现。
这里随便写了个递归来测试。
这里还是十分明显的
用当前快捷键可以直接推出gdb模式。