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