基础gdb操作【Linux】

基础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操作【Linux】_第1张图片
如果显示了版本号就代表自带gdb了。

但是如果没有的话也没事

sudo yum install gdb

直接安装即可
基础gdb操作【Linux】_第2张图片

我因为自带所以就不用安装了。

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模式编译代码。
基础gdb操作【Linux】_第3张图片

这里发现-g加不加没有啥变化,但是如果用

readelf -S 文件名 | grep -i debug

来查看调试信息
基础gdb操作【Linux】_第4张图片

就会发现多出了很多debug的文件

我们来看看不加-g的结果是怎么样的
在这里插入图片描述
这里会发现grep没有在test中查找出具有debug的文件。

1.3.3 进入gdb调试模式

这里在确保自己的可执行文件是debug版本
就可以进入gdb的调试模式了

gdb 文件名

即可基础gdb操作【Linux】_第5张图片

二.基础操作

这里为了方便进行操作,所以在test.c中特地写了一段简单的循环
基础gdb操作【Linux】_第6张图片

2.0 list 行号和 r

2.0.1 list 行号

基础gdb操作【Linux】_第7张图片
进入gdb后第一个疑问就是没有代码。
调试肯定是要看到源代码的啊
所以我们便来了第一个指令
list/l 行号
基础gdb操作【Linux】_第8张图片
l后跟了一个1,代表显示从第一行开始的十行
但是这里我们发现程序没有显示完全。

但是我们只要再按一次回车即可
因为gdb记住了上个指令,l 1执行完以后显示到10行,所以接下来直接按回车,
linux程序会自动执行l 11的指令
.

基础gdb操作【Linux】_第9张图片
所以这里只需要按一次回车即可

基础gdb操作【Linux】_第10张图片
不带 数字的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:行数/函数名称   
  文件名   文件名中的行数或者函数名称

这个可以在另一个文件上进行添加断点的操作。
基础gdb操作【Linux】_第11张图片

2.1.1 查看断点信息

这里打了断点后,我们发现这边代码上并没有进行标注哪里有断点。
基础gdb操作【Linux】_第12张图片
所以想要查看断电信息


info b

在这里插入图片描述
这里我们能看到打的断点信息

num是断点序号
type就是类型
enb就是断点是否开启
address就是断点地址
what就是断点位于程序的位置

2.1.2 删除断点

这里我们通过上面的info b,能发现多了一个相同行号的断点

我们可以通过

d 断点序号

来进行删除,断点序号就是info b中的num属性
基础gdb操作【Linux】_第13张图片
这里就能看见完成了对断点的删除

2.1.2 断点开关闭

disable 断点序号 设置断点关闭
enable 断点序号 设置断点开启

断点开关闭,就是控制断点是否有效。
就是info b中的enb属性

基础gdb操作【Linux】_第14张图片
这里我们关闭了断点,可以发现2号断点enb变成了no

2.2 程序执行操作

打了断点以后我们就可以进行程序的运行测试了。

我们打了断点后,不能直接用以下指令
我们首先需要用r将代码跑起来,才能使用下列指令

2.2.1 n 逐过程

2.2.2 s 逐语句

基础gdb操作【Linux】_第15张图片
这里能发现程序左边的数字,代表的是程序运行到了哪一行,并且会显示当前运行的代码

2.2.3 finish:直接跑完函数

2.2.4 c:从一个断点处运行到下一个断点

这里就不进行演示了,因为效果大差不差。

2.3 其他指令

我们能打断点了,能进行一步一步运行代码了。
现在差的就是显示当前行的变量值了。

2.3.1 display 变量名:展示变量

基础gdb操作【Linux】_第16张图片
这里我们能用display让程序恒显示对应的变量
基础gdb操作【Linux】_第17张图片

2.3.3 info locals:本地变量

基础gdb操作【Linux】_第18张图片
这个指令可以用来显示当前本文件中的所有本地变量的当前值

2.3.4 bt:查看从开始到现在的调用堆栈

在这里插入图片描述
bt是用来显示调用堆栈的,在递归中有明显的表现。
基础gdb操作【Linux】_第19张图片
这里随便写了个递归来测试。
基础gdb操作【Linux】_第20张图片
这里还是十分明显的

2.3.5 ctrl+d/q退出gdb

用当前快捷键可以直接推出gdb模式。

你可能感兴趣的:(linux)