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

Linux操作系统----gdb调试工具(配实操图)

绪论​
“不用滞留采花保存,只管往前走去,一路上百花自会盛开。 ——泰戈尔”。本章是Linux工具篇的最后一章。gdb调试工具是我们日常工作中需要掌握的一项重要技能我们需要基本的掌握release和debug的区别以及gdb的调试方法的指令。下一章我们将进入真正的进入到Linux操作系统敬请期待(早关注不迷路)。请添加图片描述话不多说安全带系好,发车啦(建议电脑观看)。 思维导图:


1.debug模式和release模式

在了解debug和release之前,先对公司在要开发某个项目时所要经历的过程有个大概的了解:

  1. 确立项目
  2. 搭配资源(开发人员、测试人员、项目经理(负责项目进程)、产品经理(该产品的主要负责人)…)
  3. 开始开发
  4. 进行测试
  5. 上线(灰度上线(内测阶段)-> 正式上线)
    1. 运营人员(项目的推广)
    2. 运维人员(解决出现的bug)

在上面阶段中,我们作为开发人员,我们在开发编程过程中最终编写好的程序就是以debug模式,而注意的是最终交给测试人员时是以release模式的。
原因在于(也就是debug、release模式是什么):

  1. debug模式下才能进行代码的调试,因其中包含许多调试信息(导致多占用一些空间)。
  2. 所以反之release模式下就没有了调试信息这样就能节约一定的空间(也就不能调试)。
  3. release模式下还对代码会有许多的优化让其大小和运行速度上都到最优的状态(如:删除未使用的代码、内联函数等),所以我们普通用户用的就是release版本,所以测试人员也应该测试该版本。

所以当测试人员测试处出现bug后就会再次交还给开发人员来修复,3 4阶段不断重复,最终测试完成才上线。
注意:我们在使用gcc/g++进行编译时,默认生成的是以release模式的、vim使用时默认是命令模式

2. gdb

gdb也就是Linux下的一个用来调试的工具,其就是通过指令的方式来进行一系列调试工作(打断点、查看变量信息、…)
其中注意的是:因为gcc默认生成的是release的所以,我们需要在常规用gcc生成可执行程序(gcc -o $@ $^)时,多加个附加指令 -g

2.1为什么debug模式的文件大小 > release模式的文件大小

  1. debug模式下会生成的可执行程序会添加调试信息,反之release模式下没有
    证明:下面我们生成两个模式的可执行程序进行观察在这里插入图片描述
    注意生成debug模式的需要对gcc添加附加指令 -g
    在这里插入图片描述
    我们用Makefile生成了两种模式的可执行程序,可以发现debug模式下的文件的大小要大于release模式下的(下图第五列表示文件大小!),其中就是因为有调试信息导致的。在这里插入图片描述

可能上面的不够有说服力,那么我们用更加显著的证据来证明:
因为我们在Linux下形成的可执行程序格式转换成二进制的方法就是通过ELF格式来完成的,它包含许多可执行程序的信息,代码的开始、结束、代码和数据的区分、入口地址、程序的加载…
下面一个新指令readelf -S 可执行程序(就能查看一个可执行程序的二进制构成)在这里插入图片描述
那么我们要查看这个程序中是否含有调试信息,我们就能通过grep过滤器去找,readelf -S 可执行程序 | grep -i debug(-i 忽略大小写 , debug调试信息名)在这里插入图片描述
从上图中就能发现release模式下就没有debug信息,而debug模式下则过滤出来了。

2.2gdb的使用指令

  1. 运行gdb:gdb 可执行程序
  2. 退出gdb:quit在这里插入图片描述
  3. 查看代码:l(list)
    1. 默认情况下他会自动显示重要的部分在这里插入图片描述
    2. 指定开始的位置用:l 开始的行号(但只会显示部分)
    3. 查看某个函数:l 函数名在这里插入图片描述
    4. 再按回车就会继续往下显示,当显示完成后就无法再按(因为gdb会记录历史命令,按回车就是再次执行上面的命令在这里插入图片描述
  4. 执行代码(相当于直接VS下的F5)进行调试:r(run)在这里插入图片描述
    1. 若有断点就命中,反之则直接执行完了
  5. 在某行打断点:b 行号(break point)
    1. 若存在可执行程序中有多个源文件可以用 b 源文件名 : 行号
    2. 还可以直接对函数进行打断点:b 函数名 ,打到函数入口处(第一条指令)
  6. 查看打过的断点:info b
    1. 每个断点都有自己的编号NUM在这里插入图片描述
    2. 显示当前局部域的全部变量:info local在这里插入图片描述
  7. 删除断点:d 断点编号
    1. 注意在gdb运行期间,删除后的断点编号不会被后面新增的断点覆盖(也就是后面的断点的编号是不断增加的,不会覆盖之前的)在这里插入图片描述
  8. 关闭断点、启用断点:disable 断点编码、enable 断点编码
    1. 在info信息中的Enb信息代表着断点是否启用其中:y表示启用(yes)、n表示关闭(no)
  9. 逐语句(相当于VS中的F11,单步往后走碰到函数会进入):s
  10. 逐过程(相当于VS中的F10,若有函数并不会进入内部) :n在这里插入图片描述
  11. 查看变量(监视器):p变量名在这里插入图片描述
  12. 常显示某个变量(用p只能查看当前,display可以一直关注其变化):display 变量名在这里插入图片描述
    1. 若要删除某个常显示的变量用 undisplay 编号(display时前面会给变量添加编号)在这里插入图片描述
  13. 直接跳到某行:until 行号(运行到指定行)在这里插入图片描述
  14. 直接运行完当前所在函数finish(跑到当前函数的结尾)在这里插入图片描述
  15. 直接运行到下一个断点:c在这里插入图片描述
  16. 查看调用的堆栈:bt
  17. 直接在gdb中改变变量的值:set var 变量名 = 改后的值
  18. 当退出gdb后,打过的断点信息就会被移除。

本章完。预知后事如何,暂听下回分解。

如果有任何问题欢迎讨论哈!

如果觉得这篇文章对你有所帮助的话点点赞吧!

持续更新大量Linux细致内容,早关注不迷路。

相关文章:

Linux操作系统----gdb调试工具(配实操图)

绪论​ “不用滞留采花保存,只管往前走去,一路上百花自会盛开。 ——泰戈尔”。本章是Linux工具篇的最后一章。gdb调试工具是我们日常工作中需要掌握的一项重要技能我们需要基本的掌握release和debug的区别以及gdb的调试方法的指令。下一章我们将进入真正…...

去除GIT某个时间之前的提交日志

背景 有时git提交了太多有些较早之前的提交日志,不想在git log看到,想把他删除掉。 方法 大概思路是通过 git clone --depth 来克隆到指定提交的代码,此时再早之前的日志是没有的 然后提交到新仓库 #!/bin/bash ori_git"gityour.gi…...

4 python快速上手

计算机常识知识 1.Python代码运行方式2.进制2.1 进制转换 3. 计算机中的单位4.编码4.1 ascii编码4.2 gb-2312编码4.3 unicode4.4 utf-8编码4.5 Python相关的编码 总结 各位小伙伴想要博客相关资料的话关注公众号:chuanyeTry即可领取相关资料! 1.Python代…...

单元测试-spring-boot-starter-test+junit5

前言&#xff1a; 开发过程中经常需要写单元测试&#xff0c;记录一下单元测试spring-boot-starter-testjunit5的使用 引入内容&#xff1a; 引用jar包 <!-- SpringBoot测试类依赖 --> <dependency><groupId>org.springframework.boot</groupId><…...

CentOS 7上安装Anaconda 详细教程

目录 1. 下载Anaconda安装脚本2. 校验数据完整性&#xff08;可选&#xff09;3. 运行安装脚本4. 遵循安装指南5. 选择安装位置6. 初始化Anaconda7. 激活安装8. 测试安装9. 更新Anaconda10. 使用Anaconda 1. 下载Anaconda安装脚本 首先需要从Anaconda的官方网站下载最新的Anac…...

2023年全球软件架构师峰会(ArchSummit深圳站):核心内容与学习收获(附大会核心PPT下载)

本次峰会是一次重要的技术盛会&#xff0c;旨在为全球软件架构师提供一个交流和学习的平台。本次峰会聚焦于软件架构的最新趋势、最佳实践和技术创新&#xff0c;吸引了来自世界各地的软件架构师、技术专家和企业领袖。 在峰会中&#xff0c;与会者可以了解到数字化、AIGC、To…...

RT-Thread Studio学习(十六)定时器计数

RT-Thread Studio学习&#xff08;十六&#xff09;定时器计数 一、简介二、新建RT-Thread项目并使用外部时钟三、启用PWM输入捕获功能四、测试 一、简介 本文将基于STM32F407VET芯片介绍如何在RT-Thread Studio开发环境下使用定时器对输入脉冲进行计数。 硬件及开发环境如下…...

【linux进程间通信(一)】匿名管道和命名管道

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; 进程间通信 1. 前言2. 进程间…...

第11章 jQuery

学习目标 了解什么是jQuery,能够说出jQuery的特点 掌握jQuery的下载和引入,能够下载jQuery并且能够使用两种方式引入jQuery 掌握jQuery的简单使用,能够使用jQuery实现简单的页面效果 熟悉什么是jQuery对象,能够说出jQuery对象与DOM对象的区别 掌握利用选择器获取元素的方法…...

leetcode:1736. 替换隐藏数字得到的最晚时间(python3解法)

难度&#xff1a;简单 给你一个字符串 time &#xff0c;格式为 hh:mm&#xff08;小时&#xff1a;分钟&#xff09;&#xff0c;其中某几位数字被隐藏&#xff08;用 ? 表示&#xff09;。 有效的时间为 00:00 到 23:59 之间的所有时间&#xff0c;包括 00:00 和 23:59 。 …...

MySQL存储函数与存储过程习题

创建表并插入数据&#xff1a; 字段名 数据类型 主键 外键 非空 唯一 自增 id INT 是 否 是 是 否 name VARCHAR(50) 否 否 是 否 否 glass VARCHAR(50) 否 否 是 否 否 ​ ​ sch 表内容 id name glass 1 xiaommg glass 1 2 xiaojun glass 2 1、创建一个可以统计表格内记录…...

基于 Hologres+Flink 的曹操出行实时数仓建设

本文整理自曹操出行实时计算负责人林震基于 HologresFlink 的曹操出行实时数仓建设的分享&#xff0c;内容主要分为以下六部分&#xff1a; 曹操出行业务背景介绍曹操出行业务痛点分析HologresFlink 构建企业级实时数仓曹操出行实时数仓实践曹操出行业务成果分析未来展望 一、曹…...

【Docker】实战多阶段构建 Laravel 镜像

作者主页&#xff1a; 正函数的个人主页 文章收录专栏&#xff1a; Docker 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01; 本节适用于 PHP 开发者阅读。Laravel 基于 8.x 版本&#xff0c;各个版本的文件结构可能会有差异&#xff0c;请根据实际自行修改。 准备 新…...

【MATLAB源码-第118期】基于matlab的蜘蛛猴优化算法(SMO)无人机三维路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 蜘蛛猴优化算法&#xff08;Spider Monkey Optimization, SMO&#xff09;是一种灵感来源于蜘蛛猴觅食行为的群体智能优化算法。蜘蛛猴是一种生活在南美洲热带雨林中的灵长类动物&#xff0c;它们在寻找食物时展现出的社会行…...

【计算机组成与体系结构Ⅱ】Tomasulo 算法模拟和分析(实验)

实验5&#xff1a;Tomasulo 算法模拟和分析 一、实验目的 1&#xff1a;加深对指令级并行性及开发的理解。 2&#xff1a;加深对 Tomasulo 算法的理解。 3&#xff1a;掌握 Tomasulo 算法在指令流出、执行、写结果各阶段对浮点操作指令以及 load 和 store 指令进行了什么处…...

Nginx 简介

1、概念介绍 Nginx ("engine x") 是一个轻量级、高性能的 WEB 服务器软件和反向代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的&#xff0c;第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。其将源代码以类 BSD 许可证的形式发…...

C++入门学习(一)写一个helloworld

1、头文件 #include <iostream> using namespace std; 任何程序都需要这两句的&#xff0c;写上就好。 2、主文件 int main() {cout<<"Hello World!"<<endl;return 0; } 由于是int型数据&#xff0c;所以要返回一个值&#xff0c;即return0。…...

ChatGPT 股市知识问答

我 2024-01-17 14:16:38 股市交易的关键指标有哪些&#xff1f; ChatGPT 2024-01-17 14:16:38 股市交易中常用的关键指标有很多&#xff0c;以下是一些常见的指标&#xff1a; 股价指标&#xff1a;股价是衡量股票价格变化的重要指标&#xff0c;包括每股收益&#xff08;EPS…...

uniapp多端评价页

如图所示&#xff1a;评价页 <template><view><!-- 顶部 --><view class"evaluate_head"><image class"headBg" src"/static/evaluate/head.png" mode""></image><view class"headZindex…...

行为树(Behavior Trees)

行为树&#xff08;Behavior Trees&#xff09;是一种在游戏开发中广泛使用的AI设计模式&#xff0c;主要用于描述AI的行为和决策过程&#xff0c;实现更加智能和自然的游戏AI。它由多个节点组成&#xff0c;每个节点代表一个行为或决策&#xff0c;按照特定的方式连接在一起&a…...

别再死记硬背了!用这5个真实案例,彻底搞懂NumPy的einsum函数

别再死记硬背了&#xff01;用这5个真实案例&#xff0c;彻底搞懂NumPy的einsum函数 当你第一次看到np.einsum(ij,jk->ik, A, B)这样的表达式时&#xff0c;是不是感觉像在破译外星密码&#xff1f;作为NumPy中最强大却也最令人困惑的函数之一&#xff0c;einsum&#xff08…...

RK3568平台OpenCV交叉编译实战:从源码到部署的完整指南

1. 项目概述&#xff1a;为什么要在RK3568上折腾OpenCV&#xff1f;最近在做一个基于瑞芯微RK3568芯片的边缘计算盒子项目&#xff0c;其中一个核心需求就是要在设备上跑实时的图像识别算法。算法框架选型时&#xff0c;我们团队内部有过一些讨论&#xff0c;最终还是决定用Ope…...

智能体的真正核心:从“会聊天的大模型”到“会做事的系统”

大模型虽能"理解语言、回答问题、生成内容"&#xff0c;但仅停留在对话层面无法构成真正智能体。智能体需具备理解目标、感知状态、拆解任务、选择工具、观察反馈、动态修正等闭环能力。其核心结构包括输入感知、记忆、规划、行动、反馈、评估六模块&#xff0c;形成…...

贝壳季报图解:营收189亿 经调整净利16亿同比增15.7%

雷递网 雷建平 5月19日贝壳&#xff08;纽交所代码&#xff1a;BEKE&#xff1b;香港联交所代号&#xff1a;2423&#xff09;今日公布其截至2026年3月31日止第一季度未经审计财务业绩。财报显示&#xff0c;贝壳2026年第一季度贝壳实现净收入189亿元&#xff0c;净利润12.55亿…...

新手也能看懂的CTF靶场通关笔记:从.htaccess上传到SUID提权,手把手复现BUUCTF Week5

新手也能看懂的CTF靶场通关笔记&#xff1a;从.htaccess上传到SUID提权&#xff0c;手把手复现BUUCTF Week5 第一次接触CTF比赛时&#xff0c;看到那些复杂的漏洞利用链总有种"看天书"的感觉。直到自己动手在虚拟机里复现了整个攻击流程&#xff0c;才真正理解每个技…...

告别COM Server!用Python+UDP给CANoe CAPL脚本开个“外挂”

突破CAPL封闭性&#xff1a;Python与CANoe的轻量级UDP通信实战 在汽车电子测试领域&#xff0c;CANoe作为行业标准工具&#xff0c;其内置的CAPL脚本语言为测试工程师提供了强大的自动化能力。然而&#xff0c;当我们需要将外部复杂算法&#xff08;如机器学习模型&#xff09…...

RISC-V系统调用拦截技术解析与优化实践

1. RISC-V系统调用拦截技术概述系统调用拦截&#xff08;Syscall Interception&#xff09;是操作系统层面的关键技术&#xff0c;它允许在用户态与内核态的交互过程中插入自定义处理逻辑。这项技术在高性能计算、安全监控、虚拟化等领域有着广泛应用。在x86架构上&#xff0c;…...

告别手动测量!用ArcGIS+CAD搞定河道平均宽度的两种实用方法(附详细步骤)

河道平均宽度计算实战&#xff1a;ArcGIS与CAD高效协同方案解析 河道宽度测量是水文分析、防洪规划与生态评估中的基础工作&#xff0c;但传统手工测量方式在面对复杂河道形态时往往效率低下。本文将深入解析两种基于ArcGIS与CAD协同的自动化计算方法&#xff0c;通过技术组合实…...

双足机器人EDF推进系统与高精度扭矩控制技术

1. 双足机器人EDF推进系统深度解析在双足机器人研发领域&#xff0c;姿态控制一直是核心挑战。传统方案依赖腿部关节的精细调节&#xff0c;但在高速运动或突发扰动情况下往往响应不足。我们团队创新性地引入了EDF&#xff08;电动涵道风扇&#xff09;推进系统&#xff0c;通过…...

OPNsense安装选UFS还是ZFS?从硬件选择到文件系统性能的完整决策指南

OPNsense安装选UFS还是ZFS&#xff1f;从硬件选择到文件系统性能的完整决策指南 在部署OPNsense防火墙时&#xff0c;文件系统选择往往被忽视&#xff0c;却直接影响系统性能、数据安全和运维效率。UFS和ZFS的抉择不仅关乎安装时的选项勾选&#xff0c;更关系到长期运行的稳定性…...