当前位置: 首页 > news >正文

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

在这里插入图片描述

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

相关文章:

Linux开发工具——gdb篇

Linux下调试工具——gdb 文章目录 makefile自动化构建工具 gdb背景 gdb的使用 常用命令 总结 前言: 编写代码我们使用vim,编译代码我们使用gcc/g,但是我们,不能保证代码没问题,所以调试是必不可少的。与gcc/vim一样&…...

spring状态机

1、概述 Spring State Machine 是一个用于处理状态机逻辑的框架,它提供了一种简洁的方法来定义状 态、转换以及在状态变更时触发的动作。 概念 状态 ( State ) :一个状态机至少要包含两个状态。例如自动门的例子,有 …...

K8S异常处理

一、概述 1、k8s有时候会报错The connection to the server ip:6443 was refused - did you specify the right host or port ,本文档提供几种可能产生该报错的原因和排障思路。 二、发现问题 使用任意Kubectl 命令会报错:The connection to the serv…...

【挑战全网最易懂】深度强化学习 --- 零基础指南

深度强化学习介绍、概念 强化学习介绍离散场景,使用行为价值方法连续场景,使用概率分布方法实时反馈连续场景:使用概率分布 行为价值方法 强化学习六要素设计奖励函数设计评论家策略学习与优化 算法路径深度 Q 网络 DQN演员-评论家算法&…...

WPF RelativeSource

RelativeSource 类在 WPF 中提供了以下几种模式&#xff1a; RelativeSource Self&#xff1a;指定当前元素作为相对源。可以在当前元素的属性中绑定到自身的属性。 示例&#xff1a; <TextBlock Text"{Binding Text, RelativeSource{RelativeSource Self}}" /&…...

centos 安装 配置 zsh

centos 编译安装 zsh 和 配置 oh-my-zsh 下载 wget https://jaist.dl.sourceforge.net/project/zsh/zsh/5.9/zsh-5.9.tar.xz依赖 yum install ncurses-devel安装zsh 执行&#xff1a; tar -xvf zsh-5.9.tar.xz cd zsh-5.9 ./configure --prefix/usr/local/zsh5.9 make &am…...

git 常用基本命令, reset 回退撤销commit,解决gitignore无效,忽略记录或未记录远程仓库的文件,删除远程仓库文件

git 基本命令 reset 撤销commit https://blog.csdn.net/a704397849/article/details/135220091 idea 中 rest 撤销commit过程如下&#xff1a; Git -> Rest Head… 在To Commit中的HEAD后面加上^&#xff0c;点击Reset即可撤回最近一次的尚未push的commit Reset Type 有三…...

Vue Echarts 多折线图只有一条X轴(合并X轴数据并去重排序) - 附完整示例

echarts&#xff1a;一个基于 JavaScript 的开源可视化图表库。 目录 效果 一、介绍 1、官方文档&#xff1a;Apache ECharts 2、官方示例 二、准备工作 1、安装依赖包 2、示例版本 三、使用步骤 1、在单页面引入 echarts 2、指定容器并设置容器宽高 3、数据处理&am…...

WPF+Halcon 培训项目实战(6):目标匹配助手

文章目录 前言相关链接项目专栏模板匹配助手简单使用金字塔级别参数自动选择应用插入代码 总结 前言 为了更好地去学习WPFHalcon&#xff0c;我决定去报个班学一下。原因无非是想换个工作。相关的教学视频来源于下方的Up主的提供的教程。这里只做笔记分享&#xff0c;想要源码…...

Linux管理LVM逻辑卷

目录 一、LVM逻辑卷介绍 1. 概述 2. LVM基本术语 2.1 PV&#xff08;Physical Volume&#xff0c;物理卷&#xff09; 2.2 VG (Volume Group&#xff0c;卷组&#xff09; 2.3 LV (Logical Volume&#xff0c;逻辑卷&#xff09; 3. 常用的磁盘命令 4. 查看系统信息的命…...

vue如何实现局部刷新?

应用场景&#xff1a; 比如你要切换tap栏实现刷新下面form表单等&#xff0c;相当于刷新页面。 如何使用如下&#xff1a; <div v-if"isReloadData"> 比如你想刷新那个位置就把 v-if"isReloadData"写到那个标签上 </div> 在data中定义刷新标…...

C语言,指针链表详解解说及代码示例

C语言&#xff0c;指针链表详解解说及代码示例 指针链表是一种常用的数据结构&#xff0c;用于存储和组织数据。它由一系列节点组成&#xff0c;每个节点包含数据和一个指向下一个节点的指针。通过这种方式&#xff0c;可以动态地添加、删除和访问节点&#xff0c;实现灵活的数…...

6、LLaVA

简介 LLaVA官网 LLaVA使用Vicuna(LLaMA-2)作为LLM f ϕ ( ⋅ ) f_\phi() fϕ​(⋅)&#xff0c;使用预训练的CLIP图像编码器 ViT-L/14 g ( X v ) g(X_v) g(Xv​)。 输入图像 X v X_v Xv​&#xff0c;首先获取feature Z v g ( X v ) Z_vg(X_v) Zv​g(Xv​)。考虑到最后一…...

SpringMVC核心处理流程梳理

1、处理流程图展示 当我拿出这张图&#xff0c;阁下又该如何应对呢&#xff1f;执行流程是不是一目了然了。【记住一句话&#xff1a;所有的注解都只是一个标签或者标记&#xff0c;最终都是反射找到具体方法上面的注解标记&#xff0c;然后找到类、属性、方法扩展自己想要的功…...

go 语言程序设计第2章--程序结构

2.1 名称 如果一个实体在函数中声明&#xff0c;它只在函数局部有效。如果声明在函数外&#xff0c;它将对包里面所有源文件可见。 实体第一个字母的大小写决定其可见性是否跨包。如果名称以大写字母开头&#xff0c;它是导出的&#xff0c;意味着它对包外是可见和可访问的。包…...

JavaScript基础知识点总结:从零开始学习JavaScript(五)

如果大家感感兴趣也可以去看&#xff1a; &#x1f389;博客主页&#xff1a;阿猫的故乡 &#x1f389;系列专栏&#xff1a;JavaScript专题栏 &#x1f389;ajax专栏&#xff1a;ajax知识点 &#x1f389;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 学习…...

Intel FPGA 技术开放日

概要 时间&#xff1a;2023.11.14 全天 &#xff08; 9:00 - 16: 20&#xff09; 地点&#xff1a;北京望京. 凯悦酒店 主题内容&#xff1a;分享交流了Intel FPGA 产品技术优势和落地实践方案。 会议的议程 开场致词&#xff1a; FPGA业务&#xff0c;是几年前intel收购而…...

分享72个Python爬虫源码总有一个是你想要的

分享72个Python爬虫源码总有一个是你想要的 学习知识费力气&#xff0c;收集整理更不易。 知识付费甚欢喜&#xff0c;为咱码农谋福利。 链接&#xff1a;https://pan.baidu.com/s/1v2P4l5R6KT2Ul-oe2SF8cw?pwd6666 提取码&#xff1a;6666 项目名称 10 photo websites…...

Mybatis 动态 SQL - foreach

动态SQL的另一个常见需求是需要迭代一个集合&#xff0c;通常用于构建IN条件。例如&#xff1a; <select id"selectPostIn" resultType"domain.blog.Post">SELECT *FROM POST P<where><foreach item"item" index"index&quo…...

编程笔记 GOLANG基础 001 为什么要学习Go语言

编程笔记 GOLANG基础 001 为什么要学Go语言 一、推荐学习的计算机程序设计语言&#xff08;一&#xff09;、前端设计与编程&#xff1a;htmlcssjavascripttypescript&#xff08;二&#xff09;、C/C语言&#xff08;三&#xff09;、Go语言&#xff08;四&#xff09;、Pytho…...

OrientDB使用教程:全面了解图数据库

图数据库在当今数据处理领域中扮演着越来越重要的角色&#xff0c;而OrientDB作为一种多模型的数据库&#xff0c;具有图数据库、文档数据库和对象数据库的特性&#xff0c;为应对不同场景提供了灵活的解决方案。本教程将简要介绍OrientDB的使用&#xff0c;包括基本概念、安装…...

VMware安装笔记

1、首先准备安装文件 没有的小伙伴可以网上自行下载&#xff0c;或者给我留言&#xff0c;我发给你。 2、开始安装 2.1、双击运行exe安装文件&#xff0c;下一步 2.2、接受许可&#xff0c;下一步 2.3、选择安装路径 2.4、选择好安装路径后&#xff0c;继续下一步 2.5、取消勾…...

MIT线性代数笔记-第27讲-复数矩阵,快速傅里叶变换

目录 27.复数矩阵&#xff0c;快速傅里叶变换打赏 27.复数矩阵&#xff0c;快速傅里叶变换 对于实矩阵而言&#xff0c;特征值为复数时&#xff0c;特征向量一定为复向量&#xff0c;由此引入对复向量的学习 求模长及内积 假定一个复向量 z ⃗ [ z 1 z 2 ⋮ z n ] \vec{z} \…...

三维点通用排序

前言 NWAFU 2021阶段二 C 一、题目描述 题目描述 在三维笛卡尔坐标系中&#xff0c;可以用X,Y,Z三个坐标分量表示三维空间中的一个点。现有一系列用X,Y,Z表示的三维点&#xff0c;需要对其按指定的X、Y或Z分量进行升序或降序排序。请用C语言实现这一排序过程&#xff0c;程序…...

[架构之路-265]:目标系统 - 设计方法 - 软件工程 - 软件设计 - 如何做好详细设计

目录 一、详细设计概述 1.1 什么是详细设计 1.2 软件概要设计、软件架构、软件详细设计比较 二、软件详细设计说明书 2.1 概述 2.2 撰写步骤 2.3 主要内容 三、详细设计详解 3.1 引言 3.2 系统架构设计 3.3 模块设计 3.3.1 模块描述 3.3.2 模块间接口设计与UML图 …...

java设计模式学习之【模板方法模式】

文章目录 引言模板方法模式简介定义与用途实现方式 使用场景优势与劣势在Spring框架中的应用游戏设计示例代码地址 引言 设想你正在准备一顿晚餐&#xff0c;无论你想做意大利面、披萨还是沙拉&#xff0c;制作过程中都有一些共同的步骤&#xff1a;准备原料、加工食物、摆盘。…...

篇章二 | Python 入门指南:深入理解基础数据类型

Python 是一门强大而易学的编程语言&#xff0c;而深刻理解其基础数据类型是掌握 Python 编程的重要一步。本入门指南将详细介绍 Python 中的基础数据类型&#xff0c;包括整数、浮点数、字符串、布尔值、列表、元组、字典和集合等&#xff0c;同时提供注意事项和与 C 语言的区…...

循环冗余效验码的计算方法

循环冗余效验码的计算方法 G&#xff08;x&#xff09;&#xff1a; 在了解计算方法之前我们首先要明白G&#xff08;x&#xff09;表明的意思&#xff0c;这一步非常重要&#xff01; 例如&#xff0c;G&#xff08;x&#xff09; x^3 x^2 1 &#xff0c;该式子表明的编…...

第P8周:YOLOv5-C3模块实现

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营](https://mp.weixin.qq.com/s/rbOOmire8OocQ90QM78DRA) 中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制](https://mtyjkh.blog.csdn.net/)** 一、 前期准备 1. 设…...

Java中常见的日志包分析(Log4j、Logback、SLF4J等)

Java中常见的日志jar包包括Log4j、Logback、SLF4J、java.util.logging等。它们各自的作用和应用场景如下&#xff1a; 1. Log4j 作用&#xff1a;Log4j是Apache的一个开源项目&#xff0c;提供日志记录的功能&#xff0c;支持多种输出目的地&#xff0c;如控制台、文件、GUI组…...

做招聘网站要多久/百度客服系统

如果要讨论人工智能在这两年最为火热的应用方向&#xff0c;智能穿戴、智慧交通、智能制造、智慧社区、智慧城市必定榜上有名&#xff0c;它们的共同之处在于&#xff0c;需要机器通过AI赋能去“看清”和“看懂”海量的画面信息。因此&#xff0c;机器视觉的广泛应用&#xff0…...

给企业做网站公司/seo软件系统

HR力荐了一个工作 4 年&#xff0c;目前年薪 40W 的候选人。看他简历&#xff0c;从 HTML&#xff0c;CSS&#xff0c;JavaScript &#xff0c;Vue.js &#xff0c;再到React 一个都不缺&#xff0c;跨平台PC、移动端、小程序也都接触过&#xff0c;像是个实战派&#xff01;着…...

z-blog wordpress/合肥最新消息今天

357 Lambda表达式练习1&#xff08;抽象方法无参无返回值&#xff09; 【练习1】 定义一个piano接口&#xff0c;里面定义一个抽象方法&#xff1a;void listen()定义一个PianoDemo测试类&#xff0c;里面提供个方法 main&#xff0c;调用listenPianolistenPiano【练习2】 定…...

wordpress行首空格/网站搭建平台都有哪些

Hello&#xff0c;大家好&#xff01;我是振原。这是照片调色入门完全指南的第二篇图文&#xff0c;推荐大家用 PC 端去 B 站看视频。如果你之前对于调色并没有一个比较基础的了解&#xff0c;建议先看看之前的第一篇&#xff0c;以下是视频&#xff1a;这次要跟大家分享的就是…...

织梦网站广告代码教程/肇庆seo

1. 效果示例图 2. 创建方法 &#xff08;1&#xff09;第一种方法与ListView等普通控件一样&#xff0c;直接在布局文件中添加ExpandableListView控件即可。 &#xff08;2&#xff09;第二种方法则是创建一个Activity继承自ExpandableListActivity&#xff0c;而后通过getExpa…...

如何从网站获取图片做全景图/开鲁seo服务

X86寄存器 x86寄存器分类&#xff1a; 8个通用寄存器&#xff1a;EAX、EBX、ECX、EDX、ESI、EDI、ESP、EBP 1个标志寄存器&#xff1a;EFLAGS 6个段寄存器&#xff1a;CS、DS、ES、FS、GS、SS 5个控制寄存器&#xff1a;CR0、CR1、CR2、CR3、CR4 8个调试寄存器&#xff1a;DR0、…...