【Linux学习】(9)调试器gdb

前言

Linux基础工具:安装软件我们用的是yum,写代码用的是vim,编译代码用gcc/g++,调试代码用gdb,自动化构建用make/Makefile,多人协作上传代码到远端用的是git。

在前面我们把yum、vim、gcc、make、git都已经学习了,今天我们就将学习最后一种基础工具gdb调试器

调试器gdb

1. 背景——debug和release

  1. 源文件编译时有有两种模式,debug模式和release模式
  2. debug通常称为调试版本,它包含调试信息,并且不做任何优化,便于程序员调试程序(因为debug模式在形成可执行程序的时候,添加了debug信息,所以可以被追踪调试)
  3. release称为发布版本,它往往是进行了各种优化,是程序在代码大小和运行速度上都是最优的,以便用户很好的使用
  4. 在Linux系统上gcc/g++形成的可执行程序,默认是release版本
  5. 如果想以debug形式编译,我们需要添加-g选项(-g生成调试信息)
  6. 验证:readelf -S指令可以读取可执行程序对应的二进制构成,再通过grep debug可以将debug信息过滤出来在这里插入图片描述

2. 使用gdb

  • 启动gdb:gdb 可执行程序
  1. 调试需要启动gdb在这里插入图片描述
  2. 注意在Linux系统上gcc/g++形成的可执行程序,默认是release版本。
  3. 如果想以debug形式编译,我们需要添加-g选项
  • 退出gdb:quit/q
  1. 调试结束,退出gdb在这里插入图片描述
  • 查看到调试的代码:list/l
(gdb) l		#list不一定从第一行开始显示调试代码,并且只显示一部分代码
(gdb) l n	#指定显示第n行调试代码
(gdb) l function	#指定显示某函数的代码块
(gdb) l [begin,end]	#指定显示某区间的代码块
  1. list查看调试代码,注意list不一定从第一行开始显示调试代码,并且只显示一部分代码在这里插入图片描述
  2. 如果我们想从第一行开始显示所有调试代码,list 0之后继续不断list或者直接回车即可显示所有代码在这里插入图片描述
  3. gdb会自动记录最近一条指令
  • 运行程序:run/r
  1. 运行程序,直到遇到断点或者程序运行结束在这里插入图片描述
  2. 在gdb中的run指令相当于VS中运行的快捷键Ctrl+F5
  • 设置断点:break/b
(gdb) b 行号	#在某一行设置断点
(gdb) b 函数名	#在某一个函数开头设置断点,即函数代码块的起始位置第一条有效语句
(gdb) b 文件名:行号N	#在某个文件的第N行打断点,即跨文件设置断点
(gdb) b 文件名:函数名	#在指定文件的指定函数设置断点
  1. 要调试代码,我们一般都需要先设置断点在这里插入图片描述
  2. 在VS中我们设置了断点,就可以在该代码行的最左侧显示一个红点,表示在当前行设置了断点,但是在gdb中它不是图形化界面,不会显示红点也没有任何提示,那我们在gdb中我们如何知道在哪里设置了断点了
  • 查看断点信息:info break
  1. 查看断点信息在这里插入图片描述
  2. 注意当我们退出了gdb,那我们在上一次所有设置的断点就没有了
  • 删除断点:delete/d
(gdb) delete [breakpoints] n	#删除断点编号为n的断点
(gdb) delete [breakpoints]		#删除所有断点
  1. 注意删除断点是根据断点编号删除的,不能像通过断点的行号删在这里插入图片描述
  2. 删除所有断点在这里插入图片描述
  • 禁用断点:disable
(gdb) disable 断点编号N	#禁用断点编号为N的断点
  1. 有的时候我们不想删除某个断点,但也不想使这个断点起效那该怎么办呢——禁用断点在这里插入图片描述
  2. 不想删某个断点是因为想保留调试的痕迹,不想使这个断点起效是因为我们已经确定问题不在该断点处
  • 启用断点:enable
(gdb) enable 断点编号N	#启用断点编号为N的断点
  • 逐语句和逐过程:step/s & next/n
  1. 我们调试代码一般先run将代码运行至断点停下来之后,就需要逐语句或逐过程一步一步慢慢的调试代码找出问题所在
  2. 逐语句和逐过程:
    • 逐语句:遇到函数,进入函数体中,不跳过函数体中的语句
    • 逐过程:把函数也当做一个语句,直接调试到下一条语句
    • 区别:逐语句和逐过程都是一次执行一条语句,唯一的区别就在于逐语句会进入函数,逐过程不会进入函数在这里插入图片描述
  3. gdb调试会直接跳过空行,跳转到下一句有效代码处
  4. 我们现在可以gdb中设置断点,逐过程的调试代码了,但是在调试代码时我们还需要监视变量
  • 打印变量值:print/p 变量
  1. 打印变量值在这里插入图片描述
  2. 但是我们发现print打印变量的值不能边调试边打印变量值,即不能常显示变量值
  • 边调试边打印变量值(常显示变量值):display 变量
  1. 跟踪查看一个变量,每次停下来都显示它的值在这里插入图片描述
  • 取消常显示变量值:undisplay
(gdb) undisplay 变量编号	#取消指定变量编号的常显示
(gdb) undisplay			#取消所有变量的常显示
  1. 取消对常显示变量的监视,注意不是通过变量名取消的,而是通过变量编号取消的在这里插入图片描述
  • 跳转到N行:until 行号N
  1. 例如现在我们的代码陷入到了一个循环中,我们想直接把这个循环执行完,那就可以使用until直接跳转到循环的下一行在这里插入图片描述
  • 快速调试一个函数是否有bug:finish
  1. finish:执行到当前函数返回,然后停下来等待命令在这里插入图片描述
  2. 注意:使用finish需要先进入到函数
  • 从一个断点处运行到下一个断点处:continue/c
  1. continue:从当前位置开始连续而非单步执行程序,一般用于从一个断点处运行到下一个断点处在这里插入图片描述
  2. run VS continue
    • run:从开始连续 而非单步执行程序——一般run运行程序到第一个断点处停下来
    • continue:从当前位置开始连续 而非单步执行程序——一般continue从当前断点运行到下一个断点停下来
  3. until & finish & continue
    • until:在函数内范围式 的运行
    • finish:按函数为单位 的运行
    • continue:从一个断点到下一个断点 大面积的范围式的运行
    • 调试:调试的本质是先一定要找到问题,只有找到了问题位置,才能通过分析它周边的数据,分析上下文,分析出问题出错的原因,原因清楚了,我们才知道对应的解决方案!
    • 我们可以通过until、finish、continue、等操作不断地缩小定位问题所在位置。
    • 一般先使用continue不断将问题从多个函数缩小到两个函数,再通过finish将问题缩小到一个函数,最后再通until、逐语句逐过程的定位问题所在位置
  • 修改变量的值:set var 变量=变量值
  1. 例如在一个循环中,我们知道了当循环变量的值为98的时候就会出现bug,那我们怎么可以快速执行到循环变量值为98的时候呢——修改变量的值在这里插入图片描述
  • 查看各级函数调用及参数:breaktrace/bt
  1. 查看各级函数调用及参数在这里插入图片描述
  • 查看当前栈帧局部变量的值:info/i locals

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

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

相关文章

大数据新视界 -- 大数据大厂之大数据重塑影视娱乐产业的未来(4 - 2)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

Leecode热题100-226.反转二叉树

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输入:root [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1]示例 2: 输入:root [2,1,3] 输出:[2,3,1]示例 3&#x…

探讨Facebook的AI研究:未来社交平台的技术前瞻

在数字时代,社交媒体已成为人们日常生活的重要组成部分。作为全球最大的社交网络之一,Facebook不断致力于人工智能(AI)的研究与应用,以提升用户体验、增强平台功能并推动技术创新。本文将探讨Facebook在AI领域的研究方…

PHP计件工资平台系统小程序源码

💼提升效率,精准计薪 ——「计件工资系统」全解析💼 📊【告别繁琐,一键统计】📊 你是否还在为每个月的计件工资统计而烦恼?繁琐的数据录入、核对,不仅耗时耗力,还容易出…

ClickHouse 3节点集群安装

ClickHouse 简介 ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。 官方网站:https://clickhouse.com/ 项目地址:https://github.com/ClickHouse/ClickHouse 横向扩展集群介绍 此示例架构旨在提供可扩展性。它包括三个节点&#xff…

机器学习课程学习周报十八

机器学习课程学习周报十八 文章目录 机器学习课程学习周报十八摘要Abstract一、机器学习部分1. 再探Diffusion的数学原理1.1 回顾生成模型的任务1.2 DDPM (Denoising Diffusion Probabilistic Models)1.3 DDPM的证据下界 总结 摘要 本周周报深入探讨了Diffusion模型的数学原理…

JsonCpp库学习记录

使用源码的方式 到JsonCpp的开源库仓库下载最新的发行版本 解压压缩包 使用Python生成源码文件 在本路径下cmd打开控制台,使用python编译(前提是python环境已安装) python amalgamate.py 生成dist文件夹 jsoncpp为整合在一起的源码&#…

数通自学——VLAN虚拟局域网,eNSP实验讲解

VLAN虚拟局域网,eNSP实验讲解 一、概念二、eNSP仿真实验1、实验一:vlan演示(交换机端口access模式)2、实验二:vlan演示(交换机端口trunk模式) 一、概念 VLAN(Virtual Local Area Ne…

vmware运维技巧总结

vmware使用实践总结 技巧一、在线添加硬盘技巧二、lvm脚本挂载硬盘 技巧一、在线添加硬盘 适用于不重启vmware虚拟机添加硬盘 首先控制台新加一块100G的硬盘 此时虚拟机内部是识别不到的,lsblk查看如下 不重启的情况下,采用如下方案 步骤一、查找主机…

智慧港口大屏可视化产品原型设计

全球贸易的快速发展和技术的不断进步,港口作为国际贸易的重要枢纽,其运营效率和管理水平直接影响到全球供应链的顺畅。智慧港口的概念应运而生,旨在通过新一代信息技术,将港口相关业务和管理创新深度融合,实现港口的高…

使用 Qt GRPC 构建高效的 Trojan-Go 客户端:详细指南

使用 Qt GRPC 构建高效的 Trojan-Go 客户端:详细指南 初识 Qt 和 gRPC 什么是 Qt?什么是 gRPC? 项目结构概述创建 proto 文件定义 API 下载 api.proto 文件解析 proto 文件 1. package 与 option 语句2. 消息类型定义 TrafficSpeedUserUserSt…

利用Django实现MySQL数据库的内容在网页的增删改写

利用Django实现MySQL数据库的内容在网页的增删改写 1.建立项目2.定义模型3.创建视图4.创建模板5.创建表单和配置url6.最后修改7.效果 1.建立项目 输入命令django-admin startproject aaa 新建项目,项目名称命名为aaa,打开aaa文件夹,命令提示…

vscode 安装教程

双击vscode 安装包 同意,下一步 可以使用默认安装路径,也可以优化为这个 全选 取消勾选,点完成 在桌面创建一个空文件夹,拖动到vscode图标上 点击这个图标创建文件,注意必须以.py 结尾!&#xff0…

第三十二篇:TCP协议粘包和滑动窗口,TCP系列七

上一篇《第三十一篇:TCP协议如何解决丢包的问题,TCP系列六》讲了TCP如何解决丢包问题,本文将为大家讲解TCP是如何提高传输效率,减少传输时延的原理。 1. TCP是如何提高传输效率,减少传输时延的 ① 粘包 如果传输的数…

下载数据集用于图像分类并自动分为训练集和测试集方法

一、背景 最近需要用Vision Transformer(ViT)完成图像分类任务,因此查到了WZMIAOMIAO的GitHub,里面有各种图像处理的方法。而图像处理的前期工作就是获取大量的数据集,用于训练模型参数,以准确识别或分类我…

国标GB28181视频平台EasyGBS国标GB28181软件实现无需插件的视频监控对讲和网页直播

在当今社会,视频监控已经成为公共安全、企业管理、智能城市建设等领域不可或缺的一部分。然而,由于不同厂家和平台之间的兼容性问题,视频监控系统的联网和整合面临巨大挑战。为了解决这个问题,国家制定了《公共安全视频监控联网系…

LabVIEW非接触式模态参数识别系统开发

基于LabVIEW的模态参数识别系统采用非接触式声学方法,结合LabVIEW软件和高精度硬件,实现机械结构模态参数的快速准确识别。降低了模态分析技术门槛,提高测试效率和准确性。 项目背景与意义: 传统的模态分析方法,如锤击法&#x…

一个简单的图像分类项目(六)编写脚本:初步训练

训练的脚本 ,用于训练和测试。lib.train.py: import timefrom load_imags import train_loader, train_num from nets import *def main():# 定义网络print(Please choose a network:)print(1. ResNet18)print(2. VGG)# 选择网络while True:net_choose input()if…

【C++】How the C++ Compiler Works

Firstly it needs to pre-process our code which means that any pre-processor statements get evaluated and once our code has been pre-processed we move on to more or less tokenizing(记号化) and parsing(解析) and basically sorting out(整理) this English C lan…

第2次CCF CSP认证真题解

1、相邻数对 题目链接&#xff1a;https://sim.csp.thusaac.com/contest/2/problem/0 本题和第1次认证的第1题“相反数”差不多&#xff0c;都是考察循环遍历比较和计数。 100分代码&#xff1a; #include <iostream> using namespace std; int main(int argc, char …