基础gdb操作【Linux】

一.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模式。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想学c啊啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值