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下使用命令行的形式来进行调试,但是调试都是一样的。
  • 常用调试指令不用记,只要多使用使用,这些都会接触到。

在这里插入图片描述

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

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

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

相关文章

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取相机当前实时帧率(C++)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取相机当前实时帧率(C) Baumer工业相机Baumer工业相机的帧率的技术背景Baumer工业相机的帧率获取方式CameraExplorer如何查看相机帧率信息在NEOAPI SDK里通过函数获取相机帧率(C) …

从方程到预测:数学在深度学习中的作用

图片来源 一、说明 深度学习通常被认为是人工智能的巅峰之作,它的成功很大程度上归功于数学,尤其是线性代数和微积分。本文将探讨深度学习与数学之间的深刻联系,阐明为什么数学概念是该领域的核心。 二、数学框架 从本质上讲,深度…

水经微图IOS版即将发布!

我们从上周开始,已经在着手提交产品到苹果商店等相关工作,但又恰逢“圣诞节”,据说这会导致延长审核周期。 正所谓行百里者半九十,我们现在只需要耐心等待审核通过,到时大家就可以在苹果商店中下载安装了。 IOS版功能…

echarts半圆进度条半圆饼图

drawmonthproduce(){this.monthproduce echarts.init(document.getElementById(monthproduce));var data 60; //数值大小var max 100; //满刻度大小this.monthproduce.setOption({title: [{text: data %, left: 50%,top: 70%,textAlign: center,textStyle: {// fontWeight…

C语言rand函数,srand函数,time函数实现随机数,及猜数字小游戏

怀心之所爱,奔赴山河 前言 最近在复习c的知识,想起之前写过一个猜数字小游戏,所以今天就把自己关于随机数的使用经验分享一下,希望对大家有帮助。 一.rand函数 1.函数的声明如下 可以看到,返回值是int类型&#xff…

人工智能的基础-深度学习

什么是深度学习? 深度学习是机器学习领域中一个新的研究方向,它被引入机器学习使其更接近于人工智能。 深度学习是机器学习领域中一个新的研究方向,它被引入机器学习使其更接近于最初的目标——人工智能。 深度学习是学习样本数据的内在规律和表示层次&…

优维携手深职大共建“中国高校‘双碳’技能仿真操作系统”!

优维“双碳”战略合作高校 优维科技与深圳职业技术大学碳中和技术研究院(深职碳研院)签署战略合作协议,深化产学研,聚力创新“双碳”发展。在“双碳”目标大背景下,优维科技和深职碳研院将携手共同开发中国高校“双碳…

主动红外探测器,预计到2026年将达到16 亿美元

主动红外探测器,也称为运动传感器,是一种通过发射红外辐射并检测反射来检测移动物体存在的电子设备。它们广泛用于安全系统、自动门、照明控制和其他需要运动检测的应用。近年来,由于对安全系统的需求不断增加以及智能家居和建筑的发展&#…

C++标准模板库(STL)

标准模板库(STL)是一组C模板类,提供常见的编程数据结构和函数,如列表、堆栈、数组等。它是一个容器类、算法和迭代器的库。它是一个通用库,因此,它的组件是参数化的。模板类的相关知识是使用STL的先决条件。…

使用Jenkins和单个模板部署多个Kubernetes组件

前言 在持续集成和部署中,我们通常需要部署多个实例或组件到Kubernetes集群中。通过Jenkins的管道脚本,我们可以自动化这个过程。在本文中,我将演示如何使用Jenkins Pipeline及单个YAML模板文件(.tpl)来部署多个类似的…

【Mars3d】官网示例与项目仓库的历史版本下载

【Mars3d】官网示例与项目仓库的历史版本下载 1.进入官网仓库&#xff1a; mars3d-vue-example: mars3d功能示例&#xff0c;Vue版本 2.以下载3.4.26版本的历史示例为例 <一>建议先 git clone https://gitee.com/marsgis/mars3d-vue-example.git <二>使用vsco…

Unity | 快速修复Animation missing错误

目录 一、背景 二、效果 三、解决办法 一、背景 最近在做2D 骨骼动画相关的Demo&#xff0c;我自己使用Unity引擎进行骨骼绑定并创建了anim后&#xff0c;一切正常&#xff0c;anim也能播放。但是昨天我修改Obj及子物体的名称&#xff08;由中文改为英文&#xff0c;如&…

svg学习

概念 svg 可缩放矢量图形 svg 使用xml格式定义图像 svg 形状 矩形 <rect> <?xml version"1.0" standalone"no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd&q…

OpenCV入门01:图像处理简介/图像的基础操作

项目开源&#xff0c;地址&#xff1a;https://gitee.com/zccbbg/opencv_study 文章目录 图像处理简介灰度图像二值图像彩色图 opencv 介绍图像基础操作图像读取与显示绘制几何图形图像的属性其他操作算数操作加法混合 图像色彩空间转换 图像处理简介 灰度图像 ● 灰度图像是…

VIOOVI干货分享:生产标准工时的计算与观测次数确认

在制造业中&#xff0c;生产标准工时是一个关键指标&#xff0c;它可以帮助企业确定生产效率、评估员工绩效以及优化生产流程。本文将介绍生产标准工时的计算方法&#xff0c;并探讨如何确认观测次数&#xff0c;以充分利用ECRS工时分析软件。 一、生产标准工时的计算 生产标准…

售后客服日常回复必备的话术

致歉安抚通用 1.非常抱歉耽误您宝贵的时间了&#xff0c;这边给您查询一下&#xff0c;请稍等。 2.非常抱歉&#xff0c;给您添麻烦了。这边为您转接售后专员给您处理&#xff0c;请亲稍等。 3.影响到您的购物体验万分抱歉。 4.这边都会给您尽心解决的呢。 5.我非常理解您…

深度解析高防产品---游戏盾

游戏盾是针对游戏行业所推出的高度可定制的网络安全解决方案&#xff0c;游戏盾是高防产品系列中针对游戏行业的安全解决方案。游戏盾专为游戏行业定制&#xff0c;针对性解决游戏行业中复杂的DDoS攻击、游戏CC攻击等问题。游戏盾通过分布式的抗D节点&#xff0c;可以防御TB级大…

@PersistenceContext和@Autowired在EntityManager上应用的不同

首先PersistenceContext是jpa专有的注解&#xff0c;而Autowired是spring自带的注释 上方图片的意思就是EntityManager不是线程安全的&#xff0c;当多个请求进来的时候&#xff0c;spring会创建多个线程&#xff0c;而PersistenceContext就是用来为每个线程创建一个EntityMana…

AI渲染:改变图像和视频制作的技术革命

随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;其应用领域已经覆盖了从医疗、教育到娱乐、艺术等各个行业。其中&#xff0c;AI在图像和视频制作领域的应用尤为引人注目&#xff0c;而AI渲染则是这一领域中的一颗璀璨明珠。AI渲染利用人工智能算法对图像和…

智能外呼系统全新升级,携手企业迈向高效转化新时代

智能外呼系统已成为企业提升业务效率和转化率的重要工具。随着人工智能技术的不断进步&#xff0c;智能外呼系统迎来了全面升级&#xff0c;旨在进一步助力企业优化客户沟通流程&#xff0c;提高业务转化效率。 新升级的智能外呼系统采用了更先进的自然语言处理技术&#xff0c…