【Linux】调试器gdb的使用

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

👉什么是gdb👈


在实际开发过程汇总,C / C++ 的代码除了符合最基本的语法规范之外,还必须符合设计者的逻辑意图,如果发现生成的可执行程序的运行结果不对,则可以通过相应的调试环境来跟踪调试,Linux 提供了一个称为 gdb 的调试程序,其是 GNU 开发并发布的 UNIX / Linux 下的程序调试工具,能在运行时观察程序的内部结构和内存的使用情况,主要提供以下一些功能:


监视程序中变量的值

设置断点以使程序在指定的代买行上停止执行

一行一行地执行代码


gdb 是一个功能强大的调试器,其支持的调试命令十分丰富,可以实现不同的功能。这些命令包括从简单的问价装入到允许检查所调用的堆栈内容的复杂命令。


那我想问:gdb 调试器的使用和 在 Visual Studio 上的调试有什么区别呢?其实在调试思路上,没有什么区别;而在调试的操作方法上肯定是有所区别的,Visual Studio 上的调试是通过图形化界面加快捷键来实现的,而 gdb 的调试是纯命令行的。


👉gdb的使用👈


为了介绍 gdb 常用的命令,我们写一份 0 到 100 之和的代码且故意将其写错。


04e1b1784bb649e68e7acd530771d04b.png


time 函数返回当前时间的时间戳


4c40bf7854bd4a42a7fcdf53718a6f74.png


写好 Makefile,然后开始编译并运行我们的代码。


596094df4b684409871cea73bb31782e.png


可以看到,运行结果并不是我们想要的。所以我们需要借助调试器 gdb 来帮我们找出错误。


sudo yum install -y gdb #安装gdb


94cfb02160034e78ab5babf7ba43879c.png


通过上图可以看到,我们的程序里没有调试信息。因为在 Linux 中,用 gcc / g++ 生成的可执行程序默认是 release 版本的,而 release 版本是没有调试信息的,只有 debug 版本才会有调试信息。那么,我们就需要让 gcc 生成 debug 版本的可执行程序,而我们只需要修改 Makefile 就行了。


079fb21b403c4ba5bc2743e043462039.png


注:"-g"选项在可执行程序中加入调试信息,方便进行程序的调试。


为什么软件有 debug 版本和 release 版本呢?debug 版本的软件是让程序员进行调试的,程序员调试完成后才会有 release 版本的软件。release 版本的软件是给用户使用的,该软件不需要加入任何的调试信息,因为用户根本就不会关系这些,用户只关注软件怎么用和好不好用。因为 debug 版本中带有调试信息,所以 debug 版本的软件体积一定是大于 release 版本的。


a2f0af991dc94ff49eaa20012c418aa4.png

补充知识:可执行程序是 elf 格式的,我们可以使用 readelf 来查看可执行程序的相关信息。


readelf -S 可执行程序 #查看可执行程序的相关信息


如果用 readelf 工具来查看 debug 版本和 release 版本的软件,我们会发现 debug 版本的软件多了一些调试信息。


ebc7eff41c6845ccb3313e9e26f91296.png


注:要用 gdb 调试代码,首先要进行给编译器 gcc 添加 “-g” 选项标识以 debug 的版本进行发布。


查看代码


gdb 可执行程序名 #进入调试
l #显示代码
l 0 #从第一行开始显示代码
list 0 #从第一行开始显示代码
q #退出调试


注:输入l 0命令显示代码时,不需要再次输入命令,可以直接摁下回车键,就可以显示剩下的代码。因为 gdb 会记住曾经的命令。

00c417795cf44b38967513cfc2c24b9d.png


设置断点


b 行号 #在该行设置断点
break 行号 #在该行设置断点

0dcc2c4c9da344f89a4907789ea07d91.png


查看断点


info b #查看断点
info break #查看断点


db65baf95a784ca182c51b148c01c9b6.png


删除断点


d 断点编号 #删除该断点

c996f0a994df469f806e9bef866a98e7.png


执行当前被调试的程序


r / run #执行当前被调试的程序

80434bee15b948b8b07ddd0972a26345.png


逐过程调试代码


n / next #逐过程调试代码(执行一行源代码但不进入函数内部)


a4fdfb0343114f82882277dbc3c26116.png


逐语句调试代码


s / step #逐语句调试代码(执行一行源代码且进入函数内部)


691ecc4dbc784ed8b10b66a6fe5fefb2.png

bfae519fdbb149f3a962e97daf9d94ed.png


跳转到下一个断点


为了演示这个指令,我们在原来的代码中增加一些代码。

bd835ba5c75a4fe897f2e861a1a5f0b1.png

c / continue #跳转到下一个断点

ed46a072022f4ed4b282ecc04e4fc077.png


查看函数调用堆栈


562b8baf2c5f4afe9c4ea9f8e9b9b7d7.png


将函数直接执行完(重点)


finish #将整个函数直接执行完,不是逐语句也不是逐过程地执行


3396b70ef3f247db91351c28211a2380.png


注:该命令比较重要,如果将该函数直接跑完且返回结果有误,则错误出现在该函数内。这样,我们就可以快速地将错误定位到该函数了。


查看变量的值和地址


p 变量名 #查看变量的值
p &变量名 #查看变量的地址
display 变量名 #将变量加入显示窗口中
undisplag 编号 #将变量移出显示窗口

c9cb9f80db004720b0bb69551b155cb8.png


7c107ed513184002900abbc3a3881391.png


跳转至某一行


until 行号 #跳转至指定行

23dba9a683094b9a9dbd6b880bcd2a66.png


注:如果指定行没有有效的代码,其会跳转到下一句有效代码处。


设置变量的值


set var 变量名=数字 #将变量的值设置为指定值


c4ef0e43fbe1470fac10145dec2d14c8.png


注:将变量的值设置为指定值后,代码的运行结果可能会不正确。


查看当前栈帧局部变量的值


info locals #查看当前函数栈帧的局部变量的值


8cefcae949a54a08b3fc1caa4ef9f0ee.png


使能断点


disable breakpoints 断点编号 #使该断点失效
enable 断点编号 #使该断点生效


583444fa9f9b4dc89fe6b509f0cbb52c.png



👉总结👈


本篇博客主要讲解了什么是 gbd以及 gdb 的常见命令。那么以上就是本篇博客的全部内容了,如果大家觉得有收获的话,可以点个三连支持一下!谢谢大家!💖💝❣️












相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
4月前
|
NoSQL Linux C语言
Linux GDB 调试
Linux GDB 调试
66 10
|
4月前
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
105 3
|
4月前
|
NoSQL Linux 编译器
内核实验(一):使用QEMU+GDB断点调试Linux内核代码
如何配置环境并使用QEMU虚拟机结合GDB进行Linux内核代码的断点调试,包括安装QEMU、交叉编译工具链,编译内核以及通过GDB远程连接进行调试的详细步骤。
169 0
内核实验(一):使用QEMU+GDB断点调试Linux内核代码
|
6月前
|
NoSQL Linux C语言
GDB:强大的GNU调试器
GDB:强大的GNU调试器
|
6月前
|
NoSQL 编译器 Linux
【Linux】--- Linux编译器-gcc/g++、调试器-gdb、项目自动化构建工具-make/Makefile 使用
【Linux】--- Linux编译器-gcc/g++、调试器-gdb、项目自动化构建工具-make/Makefile 使用
91 0
|
7月前
|
NoSQL 搜索推荐 openCL
【C/C++ 调试 GDB指南 】gdb调试基本操作
【C/C++ 调试 GDB指南 】gdb调试基本操作
399 2
|
7月前
|
NoSQL Linux 开发工具
【深入解析git和gdb:版本控制与调试利器的终极指南】(下)
【深入解析git和gdb:版本控制与调试利器的终极指南】
|
4月前
|
NoSQL
技术分享:如何使用GDB调试不带调试信息的可执行程序
【8月更文挑战第27天】在软件开发和调试过程中,我们有时会遇到需要调试没有调试信息的可执行程序的情况。这可能是由于程序在编译时没有加入调试信息,或者调试信息被剥离了。然而,即使面对这样的挑战,GDB(GNU Debugger)仍然提供了一些方法和技术来帮助我们进行调试。以下将详细介绍如何使用GDB调试不带调试信息的可执行程序。
111 0
|
6月前
|
NoSQL Linux C语言
Linux gdb调试的时候没有对应的c调试信息库怎么办?
Linux gdb调试的时候没有对应的c调试信息库怎么办?
45 1
|
6月前
|
NoSQL Linux C语言
Linux gdb调试的时候没有对应的c调试信息库怎么办?
Linux gdb调试的时候没有对应的c调试信息库怎么办?
34 0