【Linux从入门到精通】gdb调式技巧大全

  

  本篇文章会对开发工具:gdb调试器的使用进行讲解。希望本篇文章会对你有所帮助。

目录

一、gdb简单介绍 

二、gdb 调试

2、1 加入调试信息

2、2 调试命令

2、2、1 gdb+可执行程序——进入调式

2、2、2 l+行号/函数名——显示代码

2、2、3 b+行号/函数名——打断点

2、2、4 info+b——查看断点

2、2、5 disable/enable+节点编号——禁用/启用断点

2、2、6 b/ b+节点编号——删除断点

2、2、7 r——运行

2、2、8 n——逐过程、s——逐语句

2、2、9 finish——执行函数返回

2、2、10 until+n——跳转到第n行

2、2、11 c——跳转到下一个断点

2、2、12 p/display+变量名——打印变量值

2、2、13 undisplay+编号——取消变量值显示

2、2、14 bt——查看各级函数调用

2、2、15 set var+变量名=新值——修改变量值

2、2、16 q——退出调试

三、总结


🙋‍♂️ 作者:@Ggggggtm 🙋‍♂️

👀 专栏:Linux从入门到精通  👀

💥 标题:gdb调试💥

 ❣️ 寄语:与其忙着诉苦,不如低头赶路,奋路前行,终将遇到一番好风景 ❣️  

一、gdb简单介绍 

  我们平常在Windows下编译器进行编辑、运行、调试代码。例如,使用Visual Studio。Visual Studio 提供了强大的集成开发环境,除了调试工具外,还包括代码编辑器、编译器、版本控制等功能。同时,Visual Studio 提供了图形用户界面(GUI)使得开发人员可以使用可视化的工具和选项进行调试。

  而gdb是一个基于命令行的调试器,主要用于Linux和UNIX系统,支持多种编程语言,如C、C++、Java等。相比 Visual Studio 之下,gdb主要通过命令行界面进行操作,需要开发人员熟悉一些特定的命令和参数。相对来说,gdb调试并没有那么方便。但是在Linux下开发有是必不可少的一个工具。废话不多说,我们直接进入学习。

二、gdb 调试

2、1 加入调试信息

  在Linux下,gcc/g++编译生成的程序是二进制程序,默认是release模式。而release模式下并没有调试信息。我们在编译时,应该加上 -g 选项,这样会编译生成的debug模式。在debug模式下,就加入了调试信息,我们才可使用gdb调试器进行调试。

  其中一个最明显的区别就是,加入调试信息后(debug模式)生成的可执行程序所占空间会更大,如下图:

   我们也可通过指令:readelf -S 二进制文件 可读取可执行程序的二进制信息。其中我们就可找到有debug_info。如下图:

2、2 调试命令

2、2、1 gdb+可执行程序——进入调式

  我们可通过:gdb+可执行程序 进入调试模式。例如:gdb myproc_debg。如下图:

2、2、2 l+行号/函数名——显示代码

  我们在调试时,必须需要根据代码进行调试。当我们处于调试状态时,我们可通过:l +行号/函数名 来显示对应区域的代码。具体如下图:

  我们所需显示的行号、函数名都会位于中间位置出现,且上下共十行gdb也会默认记住我们最近的一条命令,所以后面我们只需要回车就可持续输出显示代码。具体如下:

2、2、3 b+行号/函数名——打断点

  调试的时候,断点必不可少。我们在gdb下,可通过:b+行号/函数名 进行打断点。如下图:

2、2、4 info+b——查看断点

  我们可通过:info b 来查看断点。具体如下图:

   上图所显示的断点正是我们刚刚所设置的断点。

2、2、5 disable/enable+节点编号——禁用/启用断点

  我们在不用某个断点,且不想删除断点时,可采用:disable+节点编号 对断点禁用。禁用断点后,调试时,就会自动忽略该断点。当然,我们也可通过:enable+节点编号 再次启用该断点。具体如下:

2、2、6 b/ b+节点编号——删除断点

  我们可通过:b+断点编号 对断点进行删除。断点编号是什么呢?我们看如下图:

  最左边的就是断点的编号。我们现在通过:b 2 对编号2的断点进行删除。结果如下图:

  当我们只输入 d 时,就是删除所有断点,结果如下:

2、2、7 r——运行

  当我们知道怎么设置断点后,我们就要开始进行运行调试了。我们可通过:r 来开始运行调试。 r是从开始连续而非单步执行程序。当没有断点时,会直接运行完整个程序,结果如下图:

  当我们设置了断点后,会执行到main函数的第一个断点处。具体如下图:

2、2、8 n——逐过程、s——逐语句

  我们也可通过  n  或  s  进行往下调试。n 是逐过程,s是逐语句,两者是有所区别的。n 是逐过程遇到函数时,并不会进入函数內部,把函数当作一个过程直接运行完函数。s是逐语句遇到函数时,会跳转到函数内部,并且一句一句执行完毕。具体如下图:

2、2、9 finish——执行函数返回

  当我们不小心逐语句进入函数时,我们想快速运行完函数并返回,我们可通过:finish 来完成。具体如下图:

2、2、10 until+n——跳转到第n行

  当我们进入for循环后,假如循环有很多次,我们也并不需要查看循环过程,我们就可通过: until+n 跳转到第n行,跨过循环。具体如下图:

2、2、11 c——跳转到下一个断点

  当我们设置了多个断点,我们可通过:c 快速跳转到下个断点。具体如下图:

2、2、12 p/display+变量名——打印变量值

  我们在调试时, 还需要不断监管变量值的变化。我们可通过:p + 变量名 打印变量值。但是p + 变量名 所打印的变量值只会显示一次。再往下调试,就不会再显示了。而display +变量名 就会在调试的过程中一直显示变量值。我们看如下实例:

2、2、13 undisplay+编号——取消变量值显示

  当我们设置完变量值显示后,我们不需要观察某个变量值了。我们可通过:undisplay+编号 来取消显示变量值。具体如下:

  上图,左边红框内就是显示变量值的编号。 

2、2、14 bt——查看各级函数调用

  有时候我们也需要查看查看各级函数调用,我们可通过:bt 查看各级函数调用。具体如下图:

2、2、15 set var+变量名=新值——修改变量值

  当我们在调试的时候,大概知道某个变量值会在一定的范围内出错,我们就可通过:set var+变量名=新值 修改变量的值。具体如下:

2、2、16 q——退出调试

  当我们调试结束时,可以通过:q 推出调试。具体如下:

三、总结

  以上就是gdb下常用的调试命令。上述命令基本上可完成所有调试。我们应该熟练掌握上述命令。不仅仅要记住指令,更是要熟练运用!

  本篇文章就讲解到这里。感谢观看ovo~ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/18617.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

书法vr实景授课极大丰富了艺术家的表现语言

为了加强新形势下中华优秀传统文化教育,探索现代科学技术与传统文化的结合。VR公司深圳华锐视点不断创新VR虚拟现实技术在传统文化方面的体验活动,激发学生对传统文化的学习兴趣,树立民族文化自信!搭建书法授课VR虚拟场景,为学生创…

vue3 处理elementPlus的Tree树状结构的选中和编辑数据回显

<!-- 添加角色 请求菜单:props"{ children: children, label: name }" children:后端返回的子集结构的key label&#xff1a;name后端返回的名字&#xff1a;data"menus" menus是后端返回的菜单权限列表--><el-treeref"elTreeRef":dat…

uniapp App强制更新

需要使用DClound插件市场的一个插件挺好用的&#xff01;app升级、整包更新和热更新组件 支持vue3 支持打开安卓、苹果应用市场&#xff0c;wgt静默更新https://ext.dcloud.net.cn/plugin?id7286 开始贴代码 // /utils/method.js/*** 获取当前app最新版本* param number ver…

博客质量分计算——发布 version 5.0

目录 1. 背景2. 质量分 version 5.02.1 version 4 存在问题分析2.2 version 5.0 改进2.3 消融分析2.3.1 正向积极得分消融实验2.3.2 正向累积得分单变量实验2.3.3 非高分文章消融实验 2.4 V4 和 V5.0 版本质量分分布对比 3. 总结4. 参考 1. 背景 博客质量分顾名思义是用于衡量…

Debezium系列之:prometheus采集debezium的jmx数据,grafana通过dashboard展示debezium的jmx数据

Debezium系列之:prometheus采集debezium的jmx数据,grafana通过dashboard展示debezium的jmx数据 一、需求背景二、实现的效果三、导出debezium jmx四、debezium jmx重要指标五、部署prometheus和grafana六、Debezium MySQL Connector的dashboard七、debezium-dashboard.json八…

【单片机】msp430f5529 万年历,数字时钟,矩阵键盘修改时间,7针OLED显示,内部温度读取

文章目录 功能实物图原理图一些程序片段矩阵键盘内部温度读取将年月日转为星期 功能 1 显示万年历&#xff0c;利用内部RTC模块 2 按键修改时间 3 显示芯片内部的温度数值 实物图 原理图 一些程序片段 矩阵键盘 https://qq742971636.blog.csdn.net/article/details/1316505…

【新版系统架构】第十八章-安全架构设计理论与实践

信息安全体系架构设计 信息系统安全设计重点考虑&#xff1a;系统安全保障体系&#xff0c;信息安全体系架构 系统安全保障体系&#xff1a; 安全区域策略的确定&#xff0c;根据安全区域的划分&#xff0c;主管部门应制定针对性的安全策略统一配置和管理防病毒系统&#xff…

【Linux系统编程】Linux下的编译器——gcc/g++的使用 及 动态库和静态库的认识

文章目录 1. 概念2. gcc 的使用2.1 预处理&#xff08;预编译&#xff09;2.2 编译2.3 汇编2.4 链接 3. 动态库和静态库3.1 动静态库的理解3.2 默认是动态链接&#xff0c;我们如何进行静态 这篇文章我们继续学习Linux中的开发工具&#xff0c;今天要学的是&#xff1a; Linux下…

数据备份与恢复

目录 数据备份 1、备份单个数据库中的所有表 2、备份数据库中的某些表 3、备份所有数据库 4、只备份emp表结构 数据库恢复 方法1:使用mysql 命令恢复 方法2:进入数据库&#xff0c;使用source加载备份文件恢复 MySQL表的导入导出 数据备份 MySQLdump备份数据库语句的…

对RAM和ROM的理解

什么是RAM、ROM&#xff1f; RAM(Random Access Memory)随机存取存储器 ROM(Read Only Memory)只读存储器 先记住一件事 RAM断电将失去数据 ROM断电仍会保留数据 RAM、ROM、Flash、内存条、硬盘、SD卡到底怎么归类&#xff1f; 我们先来看下计算机的原理和计算机的需求 …

国网技术学院MySQL课堂练习

一、数据库的安装和配置 在虚拟机中安装WINDOWS7操作系统 正常安装&#xff0c;查询安装教程即可安装必备组件和MYSQL5.7数据库 正常安装&#xff0c;查询安装教程即可修改my.ini配置文件中关于character_set的相关设置 直接补下面的代码即可&#xff0c;作用为设置默认的内…

SpringBoot集成Flowable工作流

SpringBoot集成Flowable工作流 Flowable是什么&#xff1f;一、添加依赖二、flowable配置三、定义流程文件1.使用流程文件定义工作流2.idea使用插件来定义流程图1.安装插件2.创建bpmn文件并画流程图3.右击流程用模型设计器打开文件 四、测试controller Flowable是什么&#xff…