【Linux】第十站:git和gdb的基本使用(下)

简介: 【Linux】第十站:git和gdb的基本使用

二、Linux调试器—gdb

1.背景

程序的发布方式有两种,debug模式和release模式

Linux gcc/g++出来的二进制程序,默认是release模式

要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项

比如如下的代码中

我们如果直接编译的话,其实是release版本的

我们可以使用这个命令来查看

readelf -S test | grep -i debug

可见没有找到任何调试信息

如果我们是dubug编译的话,加上g就可以了

我们可以发现,如果是debug下的话会有debug信息的

如果要被gdb调试,必须是debug形式的

2.gdb安装、进入与退出

我们先来安装gdb,它的安装命令为

sudo yum -y install gdb.x86_64

我们先让代码如下所示

当我们想要进入gdb的时候,我们可以直接

gdb test

当我们想要退出的时候

我们可以输入quit或者q指令来退出

3.list/l

这条指令的作用是显示出源代码,每次列10行

如果它后面跟一个数字,那么会显示以该数字为中心的10行代码,如果后面跟一个函数,则显示该函数的代码

如果我们上一条指令是list/l的话,那么我们下一次就可以不用再继续输入list/l,直接回车,就会再次弹出list/l这条指令的效果。即gdb会记住最近一次的指令

4.r/run运行程序

这条指令的作用是运行程序。当程序没有断点的时候,它就会直接运行到结尾,它如同vs2022中的F5

如果程序有断点,则直接运行到下一个断点处(仅限刚开始)

5. break/b 打断点

这个指令需要在其后面加上一个数字或者一个函数名

如果是数字的话,那么会在该行上面打上断点,如果是函数名则会在该函数开头打上断点

如果是多文件的话,我们需要指定文件去打断点

6.info/i b 查看断点

我们刚刚已经打好了断点,可是现在的问题是,我们直接使用list的话,是看不到断点的

所以我们就需要使用这条指令去查找我们当前已有的断点

这个第一列表示的是断点的编号,Enb下面的这一行代表的是这个断点是否起作用

Address代表的是该断点的地址。

What代表的是该断点是第多少行

7.delete/d (n)删除(第n行的)断点

该指令的作用是如果不加n,则删除所有断点,如果加n,则删除编号为n的断点,注意必须是按照编号进行删除

注意对于断点,如果我们使用q退出了调试,那么之前的断点都会消失

当我们将断点打好以后,再去运行的话,那么这个程序它就会跑到断点处停止,因为这个r的操作就是一个类似于F5的操作

8. n/next逐过程

它就类似于vs2022中的F10功能一样,可以逐过程的执行

当我们一直使用n调完了以后,那么如果我们继续查看断点的话,还会显示出断点的执行次数

9. s/step逐语句

这里就相当于vs2022的F11

我们可以使用F11进入到函数内部

10. p 监视

这个指令就类似于vs2022的监视窗口,它可以监视某一个变量的值

11.display 常显示

这个指令和p的差不多,不过弥补了p的一些缺陷,那就是p它当执行下一步的时候又需要重新去调用查看了。而这个常显示是不会这样的

12.undisplay (n) 取消常显示

这个命令的作用是取消常显示

不过要注意的是这个n它代表的是这个编号,而不是这个变量名

13.until n跳到第n行

在前面,我们会发现,我们已经陷入了一个循环了,并且不是很容易就能退出的,所以我们需要使用until n指令,直接跳转到第n行

14.finish 结束当前函数

有时候,我们会希望可以直接的结束当前的函数,我们当然可以用until,不过finish是更加方便的

15.continue/c 从当前开始连续执行

这个命令的意思是从当前开始连续进行,直到遇到下一个断点

16.disable/enable breakpoints 禁用/使能断点

当我们有一个断点不想要删除且我们暂时还不想用它的时候,我们可以将它禁用

禁用以后它就看上去不存在,但是还是有这个断点的

17.set var:修改变量的值

如下所示,这个可以在调试环境下直接修改某个变量的值

18.breaktrace(或bt):查看各级函数调用及参数

我们将代码改为如下

它就类似于栈帧一样,当我们有五层栈帧的时候,bt显示如下

19.info(i) locals:查看当前栈帧局部变量的值

如下所示,当我们处于该层栈帧的时候,可以看到当前的局部变量的值

也可以使用i来代替

三、gdb调试器总结

  • list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。
  • list/l 函数名:列出某个函数的源代码。
  • r或run:运行程序。
  • n 或 next:单条执行。
  • s或step:进入函数调用
  • break(b) 行号:在某一行设置断点
  • break 函数名:在某个函数开头设置断点
  • info break :查看断点信息。
  • finish:执行到当前函数返回,然后挺下来等待命令
  • print§:打印表达式的值,通过表达式可以修改变量的值或者调用函数
  • p 变量:打印变量值。
  • set var:修改变量的值
  • continue(或c):从当前位置开始连续而非单步执行程序
  • run(或r):从开始连续而非单步执行程序
  • delete breakpoints:删除所有断点
  • delete breakpoints n:删除序号为n的断点
  • disable breakpoints:禁用断点
  • enable breakpoints:启用断点
  • info(或i) breakpoints:参看当前设置了哪些断点
  • display 变量名:跟踪查看一个变量,每次停下来都显示它的值
  • undisplay:取消对先前设置的那些变量的跟踪
  • until X行号:跳至X行
  • breaktrace(或bt):查看各级函数调用及参数
  • info(i) locals:查看当前栈帧局部变量的值
  • quit:退出gdb
相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
9天前
|
Linux 开发工具 C语言
Linux的学习之路:7、yum与git
Linux的学习之路:7、yum与git
11 0
|
24天前
|
NoSQL Linux 测试技术
Linux开发工具——gdb篇
Linux开发工具——gdb篇
|
8天前
|
Linux 开发工具 C语言
【linux基础(七)】Linux中的开发工具(下)--make/makefile和git
【linux基础(七)】Linux中的开发工具(下)--make/makefile和git
|
9天前
|
NoSQL IDE Linux
Linux的学习之路:8、Linux调试器-gdb使用
Linux的学习之路:8、Linux调试器-gdb使用
20 0
|
22天前
|
Linux Shell 开发工具
linux 搭建git仓库 git代码仓库 (小团队内部合作)
linux 搭建git仓库 git代码仓库 (小团队内部合作)
30 1
|
24天前
|
数据可视化 小程序 Linux
【Linux】6. 实现进度条和git基本认识和使用
【Linux】6. 实现进度条和git基本认识和使用
30 4
|
24天前
|
NoSQL Linux 开发工具
【Linux】5. 开发工具的使用(gcc/gdb/makefile)
【Linux】5. 开发工具的使用(gcc/gdb/makefile)
26 2
|
1月前
|
Linux 开发工具 Perl
Linux系统之fc命令的基本使用
Linux系统之fc命令的基本使用
29 2
Linux系统之fc命令的基本使用
|
2月前
|
NoSQL 搜索推荐 openCL
【C/C++ 调试 GDB指南 】gdb调试基本操作
【C/C++ 调试 GDB指南 】gdb调试基本操作
62 2
|
4月前
|
NoSQL Linux 开发工具
【深入解析git和gdb:版本控制与调试利器的终极指南】(下)
【深入解析git和gdb:版本控制与调试利器的终极指南】