【Linux】调试工具gdb的使用

简介: 【Linux】调试工具gdb的使用

前言


在前文,我们已经讲解了vim工具以及gcc/g++的使用,我们可以进行编写代码以及编译代码了,但是还没有学习如何在Linux下对代码进行调试,通过本章的学习,将学会如何使用gdb对代码进行调试。


gdb的安装:sudo yum install -y gdb(没有配置sudo的可以在root身份下输入 yum install -y gdb)


gdb的使用


debug与release

我们知道,程序的发布有两个版本,Debug与Release版本。


Debug:调试版本

Release:发行版本(编译器会对我们的代码进行优化)

而我们一般都是在Debug下进行调试,但是Linux下gcc/g++生成的二进制程序时Release版本的,在此版本下我们无法进行调试


1.png


所以我们要在gcc编译时加上-g,这样生成的二进制程序就是Debug版了(我们可以输入指令:readelf -S 可执行程序,来查看该程序是否生成调试信息),在此版本下我们输入相关指令便可以进行调试。


2.png


gdb的启动与退出(q)

我们在生成debug的可执行程序后,直接输入指令gdb 可执行程序名 就可以进入调试状态,对该程序进行调试,输入q(或者quit、ctrl d)进行退出gdb。


gdb 可执行程序:进入调试


q/quit/ctrl d:退出调试


3.png


代码的查看(l)

我们在这种无图形化界面的Linux下调试时,如何看到我们的代码呢?很简单,只需要输入l(或者list),就可以查看我们的代码,这里我们简单写了一个排序代码,来研究gdb的使用。


输入l(list):显示我们的代码(默认从中间显示),我们在l后面加个数字,便可以从指定位置显示。


4.png


(当然,我们后续不用再输入指令,直接按回车键,依然会继续衔接上面的,往后打印10行。)当我们所有的代码显示全后,再次显示,则会出现这种情况,告知我们以及显示完了。


5.png


断点操作(b)

首先,假如我们没有设置断点,我们输入r(run),此时程序则会从开始,一直运行到结束。假如我们设置了断点,程序则会运行到断点处进行停止。


打断点


r: 运行程序,无断点的话,直接运行到结束,有断点运行到最近的断点处停止(r不能在断点间移动,即运行到最近断点处后,再次输入r,则会重新再次运行)

b(break) 行号 :在某一行设置断点

b(break) 函数名 :在该函数处设置断点


6.png


查看断点信息(info)

输入info b指令可以查看所有的断点详细信息


7.png


这里需要注意,断点的编号是逐渐累加的,也就是说,假如我们将该断点取消,再次进行设置,那么断点的编号就变成了2,除非退出gdb,否则一直累加。


那么问题来了,如何取消断点呢?


也很简单,d 断点编号 即可取消该断点


8.png


逐过程与逐语句调试(n\s)

所谓逐过程调试,就是对应着vs里的f10,即遇到函数不会进入。而逐语句调试对应着vs里的f11,遇到函数会进入函数内部。


n: 逐过程调试(不会进入函数)

s: 逐语句调试(会进入函数)


9.png


监视窗口(查看变量信息)(p)

这里我用换一个简单的代码,来方便我们进行观察。首先是观察我们的变量信息,指令:p 变量:即可观察我们指定的变量。


10.png


不过这样有些傻傻的,就是我们每次查看变量,还得需要输入指令,太麻烦了,此时我们便可以使用指令display 变量:查看变量信息,并常显示。当然,使用undisplay 编号 即可取消常显示。


p 变量 :查看变量信息

display 变量 :常显示变量信息

undisplay 变量编号 :取消常显示


调用堆栈查看(bt)


我们知道,我们在进入main函数之前,main函数的函数栈帧是已经创建好了的,同样我们在Linux下也可以查看堆栈调用情况,输入指令bt即可

11.png


VS里main函数函数栈帧的创建


12.png

Linux下使用gdb调试bt命令观察所调用堆栈


跳转指定行(until)

在vs中,我们在调试时要想跳转至指定行号的地方,我们通常都是f9打断点,f5直接运行到该断点,来实现跳转,但是在gdb中,我们可以在不打断点的情况下跳转至我们指定的行号位置。


until 行号:不打断点情况下,直接跳转至指定行数


13.png


查看变量类型(ptype)


我们可以使用命令ptype 变量来查看该变量的类型。


14.png


断点之间跳转(c)


我们知道vs下可以使用f5来进行断点之间的切换,gdb中也可以,命令为c(vs中的f5)(vs中使用f5都是处于调试状态下,因此gdb也是如此)


15.png


关于gdb的其它一些指令



gdb的指令还有很多,以上主要讲了几个比较常用的,下面我将一些指令也都罗列出来,大家感兴趣的可以自己来亲自试验一下:


fifinish :执行到当前函数返回,然后挺下来等待命令

print(p) :打印表达式的值,通过表达式可以修改变量的值或者调用函数

set var :修改变量的值

delete breakpoints :删除所有断点

disable breakpoints :禁用断点

enable breakpoints :启用断点

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


相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
7月前
|
NoSQL Linux 编译器
GDB符号表概念和在Linux下获取符号表的方法
通过掌握这些关于GDB符号表的知识,你可以更好地管理和理解你的程序,希望这些知识可以帮助你更有效地进行调试工作。
340 16
|
6月前
|
NoSQL Linux 开发工具
Linux环境基础开发工具的使用(yum、vim、gcc、g++、gdb、make/Makefile)
本文介绍了yum 包管理工具、Vim 编辑器、gcc/g++ 编译器、gdb 调试器、编译原理及 Makefile 的使用,同时还配备了如何使用,以及图解。旨在帮助读者更好地理解和应用这些工具与技术。
349 0
|
NoSQL Linux C语言
Linux GDB 调试
Linux GDB 调试
229 10
|
NoSQL Linux 编译器
内核实验(一):使用QEMU+GDB断点调试Linux内核代码
如何配置环境并使用QEMU虚拟机结合GDB进行Linux内核代码的断点调试,包括安装QEMU、交叉编译工具链,编译内核以及通过GDB远程连接进行调试的详细步骤。
1347 0
内核实验(一):使用QEMU+GDB断点调试Linux内核代码
|
3月前
|
Linux 应用服务中间件 Shell
二、Linux文本处理与文件操作核心命令
熟悉了Linux的基本“行走”后,就该拿起真正的“工具”干活了。用grep这个“放大镜”在文件里搜索内容,用find这个“探测器”在系统中寻找文件,再用tar把东西打包带走。最关键的是要学会使用管道符|,它像一条流水线,能把这些命令串联起来,让简单工具组合出强大的功能,比如 ps -ef | grep 'nginx' 就能快速找出nginx进程。
472 1
二、Linux文本处理与文件操作核心命令
|
3月前
|
Linux
linux命令—stat
`stat` 是 Linux 系统中用于查看文件或文件系统详细状态信息的命令。相比 `ls -l`,它提供更全面的信息,包括文件大小、权限、所有者、时间戳(最后访问、修改、状态变更时间)、inode 号、设备信息等。其常用选项包括 `-f` 查看文件系统状态、`-t` 以简洁格式输出、`-L` 跟踪符号链接,以及 `-c` 或 `--format` 自定义输出格式。通过这些选项,用户可以灵活获取所需信息,适用于系统调试、权限检查、磁盘管理等场景。
325 137
|
3月前
|
安全 Ubuntu Unix
一、初识 Linux 与基本命令
玩转Linux命令行,就像探索一座新城市。首先要熟悉它的“地图”,也就是/根目录下/etc(放配置)、/home(住家)这些核心区域。然后掌握几个“生存口令”:用ls看周围,cd去别处,mkdir建新房,cp/mv搬东西,再用cat或tail看文件内容。最后,别忘了随时按Tab键,它能帮你自动补全命令和路径,是提高效率的第一神器。
754 57
|
6月前
|
JSON 自然语言处理 Linux
linux命令—tree
tree是一款强大的Linux命令行工具,用于以树状结构递归展示目录和文件,直观呈现层级关系。支持多种功能,如过滤、排序、权限显示及格式化输出等。安装方法因系统而异常用场景包括:基础用法(显示当前或指定目录结构)、核心参数应用(如层级控制-L、隐藏文件显示-a、完整路径输出-f)以及进阶操作(如磁盘空间分析--du、结合grep过滤内容、生成JSON格式列表-J等)。此外,还可生成网站目录结构图并导出为HTML文件。注意事项:使用Tab键补全路径避免错误;超大目录建议限制遍历层数;脚本中推荐禁用统计信息以优化性能。更多详情可查阅手册mantree。
581 143
linux命令—tree
|
2月前
|
存储 安全 Linux
Linux卡在emergency mode怎么办?xfs_repair 命令轻松解决
Linux虚拟机遇紧急模式?别慌!多因磁盘挂载失败。本文教你通过日志定位问题,用`xfs_repair`等工具修复文件系统,三步快速恢复。掌握查日志、修磁盘、验重启,轻松应对紧急模式,保障系统稳定运行。
539 2
|
3月前
|
缓存 监控 Linux
Linux内存问题排查命令详解
Linux服务器卡顿?可能是内存问题。掌握free、vmstat、sar三大命令,快速排查内存使用情况。free查看实时内存,vmstat诊断系统整体性能瓶颈,sar实现长期监控,三者结合,高效定位并解决内存问题。
341 0
Linux内存问题排查命令详解