Linux开发工具——gdb篇

Linux下调试工具——gdb


文章目录

makefile自动化构建工具

    gdb背景

    gdb的使用

      常用命令

    总结

前言:

  编写代码我们使用vim,编译代码我们使用gcc/g++,但是我们,不能保证代码没问题,所以调试是必不可少的。与gcc/vim一样,Linux下的调试功能也是独立的一个工具——gdb 那么我们话不多说,开启今天的话题!

在这里插入图片描述


✈️ gdb背景

  •  我们知道,程序的发布方式有两种:dubug模式release模式
  •  Linux gcc/g++编译出来的 二进制程序默认是release模式
  •  要使用gdb调试工具,必须在源代码上生成二进制程序的时候,加上 -g 选项。

  为了能够控制在源码生成二进制程序的时候加上-g选项,我们可以在makefile文件中进行操作:

在这里插入图片描述
  我们在windows写代码时,调试工具大家多多少少也都用过,但是为什么还分为debug版本和release版本呢?或者说他们的区别是什么?

区别就是,在debug模式下形成的可执行程序会给我们添加调试信息。在release模式下形成的可执行程序会给我们去掉调试信息
结论release模式下的程序体积更小,性能更好,debug模式下可以进行调试,release模式下不能调试

  一般我们应用是面向广大用户的,用户只是需要使用应用即可,总不能让他们用调试工具来调试吧。所以一般我们给用户的发布版本就是release版本。

  所以默认情况下,gdb是以release版本发布的,那么我们如何让gdb以debug版本发布呢?使用 readelf命令 可以读取可执行程序的格式

在这里插入图片描述
  可以看到,debug的调试信息就出来了,我们再将makefile中目标文件的-d删除:

在这里插入图片描述


✈️ gdb的使用


  通过前面的学习,我们已经知道了gcc/g++的 默认行为

  • 默认是动态链接
  • 默认是release版本发布

  我们将makefile文件更改之后,再次使用make命令所生成的可执行程序就是 带有调试信息的可执行程序,这个时候就可以对程序进行调试了。

  调试方法:

gdb 带有调试信息的可执行程序#进入调试页面

  如果你的Linux下没有gdb调试工具可以用以下指令安装对应的调试工具:

yum -y install gdb#安装gdb调试工具

  为了能够更好地理解gdb调试工具,我们可以结合着windows下的vs的调试来进行比较。


🔎 开始使用

  我们有了带调试信息的可执行程序之后,使用 gdb mybin,进入到调试页面:

在这里插入图片描述

  当我们看到这样的页面,就说明你已经开始调试了,下面我来一一介绍在gdb中对应指令的功能。我们先准备一个.c的源文件:

在这里插入图片描述


  • 📓list(或l)命令

作用: 显示指定行之后的代码(gdb自动记录最近一条指令),每次列10行。
用法: l 行号l 函数名

测试用例:

在这里插入图片描述

  为什么使用list 3不是从第三行开始的?这是因为gdb的list行为是 将要显示的行放在比较靠中间的位置,而不是从所输入的行开始显示。


  • 📓run(或r)命令

作用: 运行程序。

用法: 直接输入r再回车即可。

测试用例:

在这里插入图片描述


  我们在vs下,打断点只需要在左侧边框按一下鼠标左键,取消也仅仅只需要按一下鼠标左键:

在这里插入图片描述
  而我们Linux的gdb只有使用对应的指令才能打断点。

  • 📓breakpoint(或b)命令

作用: 在某一行或者某个函数设置断点。

用法: b 行号b 函数名b 文件名:行号

  • 📓info 命令

作用: 查看断点信息。

用法: info b

测试用例:

在这里插入图片描述

  • 📓d命令

作用: 删除断点。

用法: d 断点编号

测试用例:

在这里插入图片描述
  断点删除 不能根据行号来删除只能根据断点编号来删除


  在vs中,我们也可以禁用断点:

在这里插入图片描述
  禁用断点之后,调试就不会从这里停下来了,在gdb中,我们也有禁用断点的指令。

  • 📓disable/enable命令

作用: 使能(禁用/开启)断点。

用法: disable/enable 断点编号

测试用例:

在这里插入图片描述

  断点禁用之后运行是不会从被禁止断点处停下的。

  如果运行时经过断点,那么在info b的时候,就会显示命中次数

在这里插入图片描述


  在vs中,我们有单步调试逐语句和逐过程的快捷键:

在这里插入图片描述
  那么在Linux下gdb调试工具的单步调试就是:

  • 📓next(或n)命令

作用: 逐过程进行单步调试

用法: 程序在运行时直接输入n回车即可。

测试用例:

在这里插入图片描述

  • 📓step(或s)命令

作用: 逐语句进行单步调试。

用法: 程序在运行时直接输入s回车即可。

测试用例:

在这里插入图片描述


  在vs中,我们可以在调试里的监视窗口对变量的内容或者地址进行显示。

在这里插入图片描述

  而在Linux下的gdb中,我们使用如下命令来显示变量内容和地址。

  • 📓p命令

作用: 显示变量的内容和地址

用法: p 变量名

测试用例:

在这里插入图片描述

  • 📓display/undisplay命令

作用: 常显示 变量的内容和地址。

用法: display 变量名/取地址undisplay 编号

测试用例:

在这里插入图片描述


  • 📓continue(或c)命令

作用: 从一个断点运行到下一个断点。

用法: 程序运行时直接输入c回车,从这个断点运行到下个断点。

测试用例:

在这里插入图片描述


  • 📓finish命令

作用: 将一个函数运行结束,就停下来。

用法: 程序运行时直接使用finish命令即可。

测试用例:

在这里插入图片描述


  • 📓until命令

作用: 在一个范围内直接运行到指定行。

用法: until 行号

测试用例:

在这里插入图片描述


  在vs下,我们要想修改变量的值,需要打开源文件,再进行修改,修改完之后再调试,而在Linux下的gdb工具,可以实现 不用退出调试更改变量,使用set var命令即可。

  • 📓set var命令

作用: 修改一个变量的内容。

用法: set var 变量名=修改的值

测试用例:

在这里插入图片描述


  • 📓bt命令

作用: 查看调用堆栈信息。

用法: 直接输入bt回车。

测试用例:

在这里插入图片描述

  以上就是gdb调试的一些常用指令操作了,如果要退出gdb模式只需要 输入q再回车 即可退出gdb模式


✈️ 总结

  • 想要进行调试,需要再makefile文件里生成目标文件时加上-g选项,生成的可执行程序可以使用readelf指令查看是否具有调试信息。
  • 操作理念是具有迁移性的,在windows的os下,我们使用vs进行调试,只不过在Linux下使用命令行的形式来进行调试,但是调试都是一样的。
  • 常用调试指令不用记,只要多使用使用,这些都会接触到。

在这里插入图片描述

  如果这篇文章对你有帮助的话,还望三连支持一下博主~~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python中使用SQLite数据库的方法2-2

3.3.2 创建表单及字段 通过“3.2 创建Cursor类的对象”中创建的Cursor类的对象cur创建表单及字段,代码如图5所示。 图5 创建表单及字段 从图5中可以看出,通过Cursor类的对象cur调用了Cursor类的execute()方法来执行SQL语句。该方法的参数即为要指定的S…

在电商行业中,如何采集电商数据使用数据分析提高业务绩效

数据分析丨知识点丨电商数据采集 福利指路:文章底部领取《数据分析全家桶》 随着电子商务的不断发展,越来越多的企业开始使用数据分析来提高业务绩效。数据分析可以帮助电商企业更好地理解市场和客户,以制定更有针对性的营销策略和产品方案。…

ksuser.dll文件缺失怎么办?软件或游戏无法启动,一键自动修复

很多小伙伴反馈,自己的电脑中了病毒,被杀毒软件清理后,在打开游戏或软件的时候,经常会报错“提示无法找到ksuser.dll文件,建议重新安装软件或游戏”。自己根据提示重装后,还是报错,不知道应该怎…

两向量叉乘值为对应平行四边形面积--公式推导

两向量叉乘值为对应平行四边形面积--公式推导 介绍 介绍

[电磁学]大学物理陈秉乾老师课程笔记

主页有博主其他上万字的精品笔记,都在不断完善ing~ 第一讲 绪论,库仑定律 主要讲解了电磁学中的库伦定律和电场的相关概念,介绍了电荷和电磁相互作用的规律,并讲解了电场强度和电势的概念。 03:14 🎓 库伦定律:电势能与电荷的关…

【JAVA核心知识】分布式事务框架Seata

Seata 基本信息 GitHub:https://github.com/seata/seatastars: 20.6k 最新版本: v1.6.1 Dec 22, 2022 官方文档:http://seata.io/zh-cn/index.html 注意 官方仅仅支持同步调用。 官方在FAQ中表示对于异步框架需要自行支持。 具体的扩展思…

【Maven】<scope>provided</scope>

在Maven中,“provided”是一个常用的依赖范围,它表示某个依赖项在编译和测试阶段是必需的,但在运行时则由外部环境提供,不需要包含在最终的项目包中。下面是对Maven scope “provided”的详细解释: 编译和测试阶段可用…

关于2024年度PMI认证考试计划的通知

尊敬的考生: 经PMI和中国国际人才交流基金会研究决定,2024年度中国大陆地区计划举办四次PMI认证考试,3月、6月、8月、11月各举办一次,具体考试日期另行公布。如遇特殊情况需变更考试计划的,将提前另行通知。 PMI&#…

Ubuntu安装K8S(1.28版本,基于containrd)

原文网址:Ubuntu安装K8S(1.28版本,基于containrd)-CSDN博客 简介 本文介绍Ubuntu安装K8S的方法。 官网文档:这里 1.安装K8S 1.让apt支持SSL传输 sudo apt-get update sudo apt-get -y install apt-transport-https ca-certi…

超声波清洗机实测!北柏、希亦、洁盟超声波清洗机哪款清洁强?

眼镜清洗其实是一件非常重要的事情,一定不要忽视,表面看眼镜已经清洗干净了,实际眼镜缝隙中的杂污渍还没清洁到位,时间一长就会非常容易滋生细菌以及长螨虫!为了杜绝这种情况发生,大家务必重视起清洗眼镜&a…

SpringBoot2.7.12整合Knife4j

SpringBoot2.7.12整合Knife4j 是什么 Knife4j是一个集Swagger2 和 OpenAPI3为一体的增强解决方案 添加依赖 <!--引入Knife4j的官方start包,该指南选择Spring Boot版本<3.0,开发者需要注意--> <dependency><groupId>com.github.xiaoymin</groupId>&l…

Zookeeper-Zookeeper特性与节点数据类型详解

1.Zookeeper介绍 ZooKeeper 是一个开源的分布式协调框架&#xff0c;是Apache Hadoop 的一个子项目&#xff0c;主要用来解决分布式集群中应用系统的一致性问题。Zookeeper 的设计目标是将那些复杂目容易出错的分布式一致性服务封装起来&#xff0c;构成一高效可靠的原语集&…

如何本地搭建FastDFS文件服务器并实现远程访问【内网穿透】

文章目录 前言1. 本地搭建FastDFS文件系统1.1 环境安装1.2 安装libfastcommon1.3 安装FastDFS1.4 配置Tracker1.5 配置Storage1.6 测试上传下载1.7 与Nginx整合1.8 安装Nginx1.9 配置Nginx 2. 局域网测试访问FastDFS3. 安装cpolar内网穿透4. 配置公网访问地址5. 固定公网地址5.…

交换两个数字的三种方法-LeetCode做题总结 344

344. 反转字符串 题解Java知识点交换两个数字的三种方法1、temp2、异或3、 题解 class Solution {public void reverseString(char[] s) {char temp;for(int i0,js.length-1; i<j; i,j--) {temp s[i];s[i] s[j];s[j] temp;}} }Java知识点 交换两个数字的三种方法 1、t…

Flutter BottomSheet 拖动分两段展示

第一段 第二段 实现思路 通过 GestureDetector 的 Drag 方法&#xff0c;动态改变Dialog的高度&#xff0c;通过设置一个最大高度和最小高度分成两层进行展示 实现 常用的展示BottomSheet的方法为 showModalBottomSheet /// 设置最高最好以高度的比例进行设置&#xff0c;方…

3、Git分支操作与团队协作

Git分支操作 1.什么是分支2. 分支的好处3. 分支的操作3.1 查看分支3.2 创建分支3.3 切换分支3.4 修改分支3.5 合并分支3.6 产生和解决冲突 4. 创建分支和切换分支图解5. Git团队协作机制团队内协作跨团队协作 均在git bash中进行操作。事先建好本地工作库 1.什么是分支 在版本…

使用Robot Framework实现多平台自动化测试

基于Robot Framework、Jenkins、Appium、Selenium、Requests、AutoIt等开源框架和技术&#xff0c;成功打造了通用自动化测试持续集成管理平台&#xff08;以下简称“平台”&#xff09;&#xff0c;显著提高了测试质量和测试用例的执行效率。 01、设计目标 平台通用且支持不同…

3D展2D数学原理

今年早些时候&#xff0c;我为 MAKE 杂志写了一篇教程&#xff0c;介绍如何制作视频游戏角色的毛绒动物。 该技术采用给定的角色 3D 模型及其纹理&#xff0c;并以编程方式生成缝纫图案。 虽然我已经编写了一般摘要并将源代码上传到 GitHub&#xff0c;但我在这里编写了对使这一…

【强化学习】基于蒙特卡洛MC与时序差分TD的简易21点游戏应用

1. 本文将强化学习方法&#xff08;MC、Sarsa、Q learning&#xff09;应用于“S21点的简单纸牌游戏”。 类似于Sutton和Barto的21点游戏示例&#xff0c;但请注意&#xff0c;纸牌游戏的规则是不同且非标准的。 2. 为方便描述&#xff0c;过程使用代码截图&#xff0c;文末附链…

三天吃透Spring面试八股文

目录&#xff1a; Spring的优点Spring 用到了哪些设计模式&#xff1f;什么是AOP&#xff1f;AOP有哪些实现方式&#xff1f;Spring AOP的实现原理JDK动态代理和CGLIB动态代理的区别&#xff1f;Spring AOP相关术语Spring通知有哪些类型&#xff1f;什么是IOC&#xff1f;IOC的…