【Linux】Linux开发:GDB调试器与Git版本控制工具指南

在这里插入图片描述

Linux相关知识点可以通过点击以下链接进行学习一起加油!
初识指令指令进阶权限管理yum包管理与vim编辑器GCC/G++编译器
make与Makefile自动化构建

在 Linux 开发中,GDB 调试器和 Git 版本控制工具是开发者必备的利器。GDB 帮助快速定位代码问题,Git 则提供高效的版本管理与协作支持。本指南将简明介绍两者的核心功能与使用技巧,助力提升开发效率。

请添加图片描述
Alt
🌈个人主页:是店小二呀
🌈C语言专栏:C语言
🌈C++专栏: C++
🌈初阶数据结构专栏: 初阶数据结构
🌈高阶数据结构专栏: 高阶数据结构
🌈Linux专栏: Linux

🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅 请添加图片描述

文章目录

  • 一、Git版本控制器
    • 1.1 Git与GitHub关系
    • 1.2 安装git
  • 二、GitHub创建项目
    • 2.1 新建仓库
    • 2.2 将远端仓库拉起到本地
    • 2.3 一、二板斧:add+commit
      • 2.3.1 设置git上传
      • 2.3.2 git add与git commit在做什么?(重点)
    • 2.4 三板斧:push
    • 2.5 git其他选项
      • 2.5.1 git log可以查看提交记录
      • 2.5.2 git status可以查看当前目录状态
  • 三、git流程解析
  • 四、Linux调试器-gbd
    • 4.1 、可执行程序生成调试信息
    • 4.3 readELF指令查看调试信息
  • 五、gdb相关调式指令
    • 5.1 list调式指令
    • 5.2 run调试指令
    • 5.3 断点相关调试指令
      • 5.3.1 breakpoint调试指令
      • 5.3.2 info breakdpoints调试指令
      • 5.3.3 delete调试指令
      • 5.3.4 disable调试指令
      • 5.3.5 enable调试指令
    • 5.4 next调试指令
    • 5.5 step调式指令
    • 5.6 printf 调式指令
    • 5.7 display调试指令
    • 5.8 undisplay调式指令
  • 六、快速排查问题
    • 6.1 continue 调式指令
    • 6.2 finish 调式指令
      • 6.2.1 next和finish区别
    • 6.3 until调式指令
    • 6.4 set var调式指令

一、Git版本控制器

1.1 Git与GitHub关系

  • Git】:Git是版本控制系统,专门用于管理和跟踪代码的修改历史。**它能够在本地完整保存项目的所有版本,方便开发者在自己的电脑上管理项目,记录每次更改。
  • 【GitHub】:GitHub是基于Git的远程平台,GitHub是一个托管代码的在线平台,它建立在Git之上,为Git仓库提供了一个云端存储库。

Git主要是一个在本地管理文件版本的工具,用于跟踪文件的每次修改,实现代码的历史管理。而为了满足大规模协作的需求,GitHub应运而生,它在云端提供了一个基于Git的仓库平台,让开发者可以远程存储、共享代码,并实现多人协作和代码同步。Git负责本地的版本控制,而GitHub是对Git功能的拓展,实现了在云端共享和管理代码的能力。

1.2 安装git

Linux下安装git: sudo yum install -y git

二、GitHub创建项目

2.1 新建仓库

对于Git是一个工具,而是gitee和github是为了Git搭建的网址。

在这里插入图片描述

在这里,选择你需要的代码语言来保存版本。README文件用于仓库的说明,创建时会自动生成中英文版本。在分支选项中,这里推荐选择单分支是为了简化项目管理,特别是在项目初期或只是用于代码托管时,不需要复杂的分支结构。单分支模式更适合简单的版本控制,避免了多分支带来的合并冲突和管理开销。

2.2 将远端仓库拉起到本地

在这里插入图片描述

1.首先在普通用户家目录下,下载代码请复制以下命令到终端执行。

指令:git clone 地址

在这里插入图片描述

2.克隆到普通用户家目录下,我们通过ls -la指令进行查看。

在这里插入图片描述

3.当我们将远端仓库拉取到本地,为了确保提交的代码身份被Gitee/GitHub正确识别,需要在本地进行相关配置

在这里插入图片描述

在这里插入图片描述

  1. 将本地仓库里的文件拷贝远端仓库为了方便测试代码,统一放到一个testgit文件中,然后进入远端仓库目录进行拷贝。

命令:cp …/testgit . -rf

在这里插入图片描述

2.3 一、二板斧:add+commit

相关指令命令

  • git add . 】:将当前位置的所有文件都添加到本地仓库上
  • git commit -m"内容"】 (内容可以是日志或记录,不能随便填写,必须填写):该步骤是把内容提交到本地仓库中,跟远端仓库没有关系的

在这里插入图片描述

2.3.1 设置git上传

如果是首次使用,需要配置邮箱和用户名。是为了确保可以找到这份代码的源头。

设置命令

  • git config -global user.email-“你的邮箱”
  • git config -global user.name-“你的名字”

在这里插入图片描述

2.3.2 git add与git commit在做什么?(重点)

git addgit commit 只能在 Git 仓库的目录及其子目录中操作,不能直接将其他路径的文件添加到该仓库的版本控制中。

Git 的工作流程分成了几个不同的区域:工作区、暂存区和本地仓库。简单来说,Git 并不会自动保存工作区中的修改,而是需要显式地通过 git addgit commit 命令将更改记录到本地仓库。

  • 工作区(Working Directory):这是你在项目目录中看到的文件。当你对文件进行修改时,这些更改只存在于工作区,还没有被 Git 跟踪为新版本。
  • 暂存区(Staging Area):当你运行 git add 命令时,Git 会将选定的更改(比如修改、添加或删除的文件)添加到暂存区。暂存区是一个“待提交”的清单,是 Git 知道你想提交的内容,但还没有正式保存的地方
  • 本地仓库(Local Repository):当你运行 git commit 命令时,Git 会将暂存区的内容提交到本地仓库中,这就创建了一个新的“版本”记录。这些提交在本地仓库中保存下来,可以随时查阅或还原。

2.4 三板斧:push

命令: git push

在这里插入图片描述

这里需要输入你在平台上的账号名和密码,完成本地仓库跟远端仓库进行同步

2.5 git其他选项

2.5.1 git log可以查看提交记录

在这里插入图片描述

2.5.2 git status可以查看当前目录状态

在这里插入图片描述

这里我只是add+commit,并没有同步到远端。系统就会提示当前我已经托管到本地仓库,但是还没有同步到远端。然后push同步就不需要做任何操作拉。

三、git流程解析

1..git 目录是 Git 本地仓库,通过 add 命令可以将修改的内容提交到一个暂存区,方便后续的版本控制和管理。

在这里插入图片描述

2.commit 会将暂存区中的内容提交到本地仓库,并清空暂存区。最后,push 会将本地仓库的更改同步到远程仓库。

在这里插入图片描述

3..gitgnore文件

在这里插入图片描述

  1. 它实际上是一个配置文件,用于指定哪些文件或文件类型不应被添加到版本控制中。
  2. 不要忘记使用*符号,它是一个通配符,用于匹配任意数量的字符。
  3. 我们可以自行编辑该文件,将不想纳入版本控制的文件后缀或路径写入其中。

四、Linux调试器-gbd

知识铺垫

  • 程序的发布方式有两种,debug模式和release模式
  • Linux gcc/g++出来的二进制程序,默认是release模式
  • 要使用gdb调试,*必须在源代码生成二进制程序的时候,加上 -g 选项

4.1 、可执行程序生成调试信息

gdb系统是默认安装,直接输入 gdb 即可启动调试器。

在Linux下调试,只能使用gdb进行调试。-g选项用于在编译时生成调试信息,对此启用 -g 选项后文件体积会增大,但不会影响程序的执行速度

在这里插入图片描述

4.3 readELF指令查看调试信息

通过 readelf 工具可以查看使用 -g 选项生成的可执行文件中的调试信息。readelf 是一个用于读取 ELF 格式文件的命令行工具,可以帮助我们检查 ELF 文件的头信息、段和节的内容,其中也包括调试信息。

在这里插入图片描述

在 Linux 系统中,虽然可执行文件是二进制格式,但其内部结构采用了 ELF (Executable and Linkable Format/可执行与可链接格式)格式,可以通过 readELF 工具查看。

五、gdb相关调式指令

调式指令可以全称和简写,得到效果是一致的,这里通常采用简写。 q(退出quit)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

5.1 list调式指令

l/list】:查找源文件内容

两种使用方式

  • list/l 行号】:显示binFile源代码,接着上次的位置往下列,每次列10行
  • list/l 函数名】:列出某个函数的源代码
  • 注意事项】:如果list/ l 后面直接跟对应的文件名是无法进行查看的,在gdb当中默认可以在该文件直接查看。

如果想要从头开始进行查找,可以简写l 0从0开始进行查找

虽然上list/ l 后面直接跟对应的文件名是无法进行查看的,但是我们可以文件名基础之上,带上行号或函数可以进行查找啦。

**gdb会默认记录你最近执行的一条命令的,这里默认打印十行,这里可以直接回车回车,就看见全部源文件。**如果查找到结尾,会有系统提示,比如:我们对应的整个文件一共有24行。

在这里插入图片描述

查找时,是否应该以被查找的行号或函数作为起点?

如果输入想查看的行号和函数,会显示上下文。因为我们一般在看一份代码的上下号,指定的行就是我们默认调试就是想看他的上下文。

5.2 run调试指令

r/run】:运行程序

在调试之前都需要将程序运行起来,r回车

在这里插入图片描述

**r 指令类似于按下 F5,会直接编译并运行程序直到结束。**但在这种模式下无法进行调试,因此我们可以先设置一个断点,以便在指定位置暂停执行。

5.3 断点相关调试指令

5.3.1 breakpoint调试指令

b/breakpoint】:设置断点

打断点方式

  • break(b) 行号 :】:在某一行设置断点
  • break 函数名 :】:在某个函数开头设置断点
  • 其中 : 用于指定文件和函数
  • 断点不能连续打,编号被使用不会重现。断点编号本质是一个线性增长的计数器

使用场景】:b myproess.c :main

在这里插入图片描述

图片效果解释

  • 函数本质上就是一个代码块。设置断点时,不是设置在某一行代码上,而是设置在函数的入口地址。例如,不是第 15 行,而是第 17 行(函数的起始位置)

5.3.2 info breakdpoints调试指令

i b/info breakdpoints】:查看当前设置了哪些断点

通过info b调试指令可以查看当前设置断点,其中设置断点都是具有线性增加的Num编号。

在这里插入图片描述

5.3.3 delete调试指令

d/delete Num(编号)】:删除指定编号断点

这里删除断点,不能通过指定文件名、行号、函数名等形式删除,而是通过Num编号

在这里插入图片描述

在这里插入图片描述

在调试过程中,断点编号是线性增长的计数器,因此断点的编号会逐渐增加而不会重复使用。由于编号不会重置,所以断点不能连续设置(即使之前的断点已删除或禁用,其编号也不会再重新分配)。这种设计保证了每个断点在整个调试过程中都有一个唯一编号。

5.3.4 disable调试指令

disable Num(编号)】:禁用断点,关闭Enb使能

在这里插入图片描述

在这里插入图片描述

5.3.5 enable调试指令

enable Num(编号)】:启用断点,开启Enb使能

5.4 next调试指令

gbd会默认记录最近一次的指令,可以回车执行最近一次指令。

n/next】:"逐过程"调试,类似于我们F10

在这里插入图片描述

5.5 step调式指令

s/step】:"逐过程逐语句"调试,可进入到函数内部,类似于我们F11

5.6 printf 调式指令

p/printf 变量】:打印变量值

在调试器中,$ 通常用于表示查询结果的编号。查看变量的内容或地址时,不能直接使用 p 变量名,而应通过 p $变量名 来引用已查询过的结果。

5.7 display调试指令

如果希望变量的数值始终显示,并在每次调试时自动刷新,可以使用 display 变量名 命令。

display】:常显示变量的数值,具有相关编号

在这里插入图片描述

在这里插入图片描述

5.8 undisplay调式指令

要取消变量的自动显示,不能直接使用 undisplay aundisplay &a,而是需要使用 undisplay 编号 命令。

undisplay 编号】:取消变量的自动显示

在这里插入图片描述

六、快速排查问题

问题】:无论是使用 VS 调试器还是 gdb 调用调试,核心目标是什么?

并不是单纯地通过调试就能解决所有问题,而是找到代码中的具体问题,并针对性地分析和修复。归根结底,调试的核心在于发现问题

通过设置断点,可以将程序执行划分为不同的范围。如果某个范围内发生崩溃,就可以对这一范围进行局部调试。断点的作用就是帮助我们快速缩小问题范围,尤其在面对冗长的代码时,断点能显著提高排查效率。

6.1 continue 调式指令

c/continue】:断点处跳跃

在这里插入图片描述

6.2 finish 调式指令

【finish】指令:直接运行完当前所在的函数并停下。使用 finish 时,调试器不会逐步执行函数内部的代码,而是快速跳出函数,直接返回调用点。这在函数内部细节不重要、或者希望快速查看函数返回结果时非常实用。

在这里插入图片描述

6.2.1 next和finish区别

因此,nfinish 的关键区别在于 finish 能让你在函数返回后停留并显示返回值,而 n 只是跳过整个函数调用,并不提供返回值的详细信息。

6.3 until调式指令

【until】指令:将程序运行到指定的行号并暂停,期间的代码会被正常执行。这非常适合快速跳过某段代码,直接查看指定位置的运行状态

在这里插入图片描述

6.4 set var调式指令

set var 变量名 = 新值,这个指令非常适合调试复杂逻辑时临时调整变量值!

【set var】:用于在调试过程中直接修改变量的值,从而影响程序的运行状态

在这里插入图片描述


在这里插入图片描述

以上就是本篇文章的所有内容,在此感谢大家的观看!这里是Linux笔记,希望对你在学习Linux旅途中有所帮助!

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

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

相关文章

【设计模式-2】23 种设计模式的分类和功能

在软件工程领域,设计模式是解决常见设计问题的经典方案。1994 年,Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides(四人帮,GoF)在《设计模式:可复用面向对象软件的基础》一书中系统性地总结了…

谷粒商城-高级篇完结-Sleuth+Zipkin 服务链路追踪

1、基本概念和整合 1.1、为什么用 微服务架构是一个分布式架构,它按业务划分服务单元,一个分布式系统往往有很多个服务单元。由于服务单元数量众多,业务的复杂性,如果出现了错误和异常,很难去定位 。主要体现在&#…

小米智能哑铃上市,代理 IP 视角下的智能健身新篇

在智能科技与健康生活深度融合的时代,小米以其敏锐的市场洞察力和强大的创新能力,不断拓展智能生态版图。米家智能哑铃的发布,无疑是其在智能健身领域的又一重要举措。而当我们从代理 IP 的独特视角来审视这一产品,会发现其中蕴含…

基于Python的音乐播放器 毕业设计-附源码73733

摘 要 本项目基于Python开发了一款简单而功能强大的音乐播放器。通过该音乐播放器,用户可以轻松管理自己的音乐库,播放喜爱的音乐,并享受音乐带来的愉悦体验。 首先,我们使用Python语言结合相关库开发了这款音乐播放器。利用Tkin…

实际开发中,常见pdf|word|excel等文件的预览和下载

实际开发中,常见pdf|word|excel等文件的预览和下载 背景相关类型数据之间的转换1、File转Blob2、File转ArrayBuffer3、Blob转ArrayBuffer4、Blob转File5、ArrayBuffer转Blob6、ArrayBuffer转File 根据Blob/File类型生成可预览的Base64地址基于Blob类型的各种文件的下载各种类型…

微信小程序中的 storage(本地存储)和内存是两个完全不同的存储区域

这是一个非常关键且容易混淆的概念 既然 this.globalData.appId appId 是将 appId 存储在内存中,为什么微信小程序中的 wx.getStorage 和 wx.setStorage(本地存储)中没有 appId,并且您提出了一个非常重要的疑问:stor…

【C++数据结构——查找】二叉排序树(头歌实践教学平台习题)【合集】

目录😋 任务描述 相关知识 1. 二叉排序树的基本概念 2. 二叉排序树节点结构体定义 3. 创建二叉排序树 4. 判断是否为二叉排序树 5. 递归查找关键字为 6 的结点并输出查找路径 6. 删除二叉排序树中的节点 测试说明 通关代码 测试结果 任务描述 本关任务&a…

计算机网络(第8版)第3章课后习题--透明传输

【3-11】 试分别讨论以下各种情况在什么条件下是透明传输,在什么条件下不是透明传 输。(提示:请弄清什么是“透明传输”,然后考虑能否满足其条件。) (1)普通的电话通信。 (2)互联网提供的电子邮件服务。 解 答 : 透明传输是指在数据传输…

Linux(17)——使用 DNF 安装和更新软件包

目录 一、使用 DNF 管理软件包: 1、 DNF 查找软件: 2、DNF 安装软件: 3、DNF 删除软件: 二、使用 DNF 管理软件包组: 1、DNF 显示组信息: 2、DNF 安装组: 三、使用 DNF 查看事务历史记录…

基于32单片机的智能语音家居

一、主要功能介绍 以STM32F103C8T6单片机为控制核心,设计一款智能远程家电控制系统,该系统能实现如下功能: 1、可通过语音命令控制照明灯、空调、加热器、窗户及窗帘的开关; 2、可通过手机显示和控制照明灯、空调、窗户及窗帘的开…

Qt 5.14.2 学习记录 —— 일 新项目

文章目录 1、创建2、查看代码 ---- main.cpp3、查看代码 ---- widgt.h4、查看代码 ---- widgt.cpp和widget.ui5、查看代码 ---- Empty.pro6、运行产生的中间文件 1、创建 左上角的文件,新建文件或项目。如果要写一个GUI程序,应当选择Application&#x…

linux wsl配置 redis远程连接

✅ 1. 修改 Redis 配置文件 在 WSL 的 Redis 配置文件中,找到 redis.conf 或 /etc/redis/redis.conf 文件,编辑以下配置项: ➡️ 更新 bind 配置项 将 bind 127.0.0.1 ::1 修改为: bind 0.0.0.0这样,Redis 将监听所…

Transformer从零详细解读——DASOU讲AI

1. 从全局角度概括Transformer transformer的任务是什么? 进一步细化 进一步细化,注意:每个encoder结构相同,参数不同;decoder同理 原论文中的图如下: 2.Encoder 2.1 输入部分 (1&#xff09…

ARM发布Armv9.5架构:迈向更强性能与灵活性的新时代

2024年11月30日,ARM正式发布了其最新的Armv9.5架构,这是Arm技术发展的又一重要里程碑。从表中信息来看,Armv9.5架构的发布标志着该公司的架构系列在性能、灵活性和可扩展性方面取得了进一步突破。本次发布不仅是技术上的提升,更是…

【Python运维】使用Python与Docker进行高效的容器化应用管理

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着容器化技术的广泛应用,Docker已成为现代软件开发与运维中不可或缺的工具。Docker容器提供了一种轻量级、可移植的方式来部署和管理应用…

分布式系统架构6:链路追踪

这是小卷对分布式系统架构学习的第6篇文章,关于链路追踪,之前写过traceId的相关内容:https://juejin.cn/post/7135611432808218661,不过之前写的太浅了,且不成系统,只是简单的理解,今天来捋一下…

Ubuntu 20.04安装gcc

一、安装GCC 1.更新包列表 user596785154:~$ sudo apt update2.安装gcc user596785154:~$ sudo apt install gcc3.验证安装 user596785154:~$ gcc --version二 编译C文件 1.新建workspace文件夹 user596785154:~$ mkdir workspace2.进入workspace文件夹 user596785154:~…

问题:Flask应用中的用户会话(Session)管理失效

我来分享一个常见的PythonWeb开发问题: 问题:Flask应用中的用户会话(Session)管理失效 这是一个在Flask开发中经常遇到的问题。当用户登录后,有时会话会意外失效,导致用户需要重复登录。 解决方案: 1. 首先&#x…

ansible-性能优化

一. 简述: 搞过运维自动化工具的人,肯定会发现很多运维伙伴们经常用saltstack和ansible做比较,单从执行效率上来说,ansible确实比不上saltstack(ansible使用的是ssh,salt使用的是zeromq消息队列[暂没深入了解]),但其实…

.net core 线程锁,互斥锁,自旋锁,混合锁

线程锁、互斥锁、自旋锁和混合锁是多线程编程中的重要概念,它们用于控制对共享资源的访问,避免数据竞争和不一致性。每种锁有其特定的适用场景和特点。我们来逐一解释它们,并进行比较。 1. 线程锁(Thread Lock) 线程…