LINUX入门篇【7】--git提交指令以及代码调试工具gdb

前言:

我们今天来介绍一下我们工具篇的最后两个工具,即git提交指令以及代码调试工具gdb,再结合前面的知识点,我们就可以基本完成我们VS上的基本的功能:编写,调试,编译,执行程序的这些过程。

1.git指令,git的基本原理:

1.git的诞生:

git最早是LINUX之父雷纳兹托瓦兹开发的,用于对LINUX操作系统的代码维护的存储和更新,它可以用来自动管理全球各地提交的LINUX的代码进行一个统一的管理,雷纳兹可以从中进行测试从而用来扩展和更新代码。后来,基于git的功能和底层,又出现了各种各样的专门用来托管个人代码的网站,gite github等。到这里,我们的git软件已经不仅仅是服务器,同时它也是客户端了,既能满足客户的要求,同时又能实时的管理很多用户的代码。

2.git的作用-----版本控制器:

版本是我们再熟悉不过的词,每次我们玩游戏的时候,都会遇到版本更新的问题,版本更新意味着新的内容和功能的拓展,但是,我在这里的问题是,我们之前的旧版本就没了么?
不,我们之前的版本仍然存在,并且按照顺序合理的排列在我们的版本控制器中,我举一个简单的例子,魔兽世界不仅仅在实时更新,同时也有一个怀旧服。要知道,暴雪公司开发魔兽世界这样的一款极其复杂的游戏的代码量起码是百万以上,这意味着大量的财力和物力资源的倾斜,本质上来说,倘若重新去写旧版的魔兽世界,是一个十分亏本的计划。但暴雪却能迅速推出怀旧服并且让玩家去体验,这便是版本控制器存储了这个游戏的任意版本,只需要按照需求去重新重构版本搭建服务器即可运行。
由此,我们便总结出版本控制器git的真正作用:帮助用户/开发者根据需要提供任意版本。
但是,说到这里,我们可能会对git和gitee/github混淆:他们两个有什么区别呢?
你可以这样理解,git本身是一个软件,既是客户端,又是服务器,git是只会记录变化的软件,git是去中心化的,为分布式软件。基于git,我们开发出了gitee/github这样的网站,让我们的git去进行的版本管理可视化,而不是类似LINUX那样的用指令进行抽象的操作。

3.git的操作指令:

1.是否安装git检查:git --version
倘若没有安装:sudo(root) yum install -y git
2.将我们创建好的git仓库下载到LINUX本地:git clone +gitee网站的仓库地址(仓库的地址可以在gitee上查到)
3.git add .:将当前目录下未放入git库的文件放入git库(自动)
4.git commit -m "仓库上传日志“ :将带有日志的git库代码提交到本地仓库
5.git push:将本地仓库代码上传到远端仓库,在这一步需要我们输入用户名和密码,这个就看个人设置了,我个人的是手机号作为用户,密码是自己设的。
6.git pull:同步远端仓库和本地仓库
7.git status:查看本地仓库的干净状态,是否有没有上传远端仓库的文件
8.git log:查看自仓库配置好以来的代码提交历史

.gitignore文件(注意,别忘了这是隐藏文件,前面有一个.后缀)

.gitignore是用来清理没必要的文件上传到git上,如一些后缀为.o .d .ko这些,我们也可以自己向文件写入我们指定后缀的文件,写入后带有指定后缀的文件就不会被上传到远端仓库中,如下:
在这里插入图片描述
我们打开文件的内部,里面是这样的:
在这里插入图片描述
你看,在这里,我就补上了.cc的后缀,这样,我们创建的后缀为.cc的文件就不会被传入到远端的gitee仓库中,有了这个文件,我们就可以将不必要的文件传入到远端仓库,从而简洁了我们的源码的质量。

需要注意的问题:

我们push我们的文件,是需要我们的文件先和远端仓库同步的,否则上传无法执行,但是在多人开发中,开发者有的时候不仅仅是一位,可能多人同时在线开发,你是不知道他人是否push了新的文件的,故此时我们的方式是先push一次,倘若通过了,证明没人提交,你的提交成功了,反之则有人先提交了,则你需要先git pull同步一下仓库,然后再提交。或者你先git status看一看当前仓库的状态,从而判断是否需要同步,这两种办法都可以解决问题。

在LINUX下调试代码的工具—gdb:

我们写程序不仅仅是编写代码,对代码的后续维护和调试也很关键,而我前面曾经说到过,vim本身写下的软件是不具备调试功能的,需要我们后期自己去配置和使用另一个软件gdb去进行调试相关的功能。
首先我们明确一件事情,代码能被调试的环境一定是debug下的,只有在debug下我们才能对代码进行调试,代码的运行环境一共分为debug和realease两个版本,我们的用户所能体验到的版本一般是release下的,即取消了几乎全部的检验程序和各种调试性的程序,并且对递归进行了更深层次的优化的版本,所以,在这个版本下的程序的运行速度是很快的,在debug版本下,我们的程序运行速度并不快,但是可以去调试代码从而让代码进一步的更改和bug的更正。
对于一名程序员来说,我们要清楚我们自身在一个项目全部开发过程中的定位和职责是什么,我想用下面的一张图来演示:
在这里插入图片描述
由此,我们可以得出结论,一个合格的程序员在开发项目的过程中需要与各种各样的人沟通,这也考验着我们的语言沟通能力,故我们要刻意去培养这方面的能力。

在LINUX下使用gdb去调试代码:

首先我们要明确,在LINUX下,我们调试代码默认的都是release模式,这要是为什么我们vim去打开文件调整代码的时候我们没法去调试的原因,所以,想要调试代码,我们就需要让其可以更改为debug模式,这就需要我们在Makefile文件内部在执行我们的脚本自动化编译的时候自己加上一个-g 选项,如下:
在这里插入图片描述
但是,我的问题是:我们如何证明我们的LINUX代码默认为release模式呢?
1.首先我们要明确,debug模式下编译出来的可执行程序的大小是要大于release模式下编译出来的程序的,我们可以先后取消-g选项去进行一下测试,便可以得出结论。
如下面的这两个对比
在这里插入图片描述
在这里插入图片描述
**
2.倘若这样说明也很牵强的话,我们可以使用readelf -s 文件名|grep -i debug来寻找可执行程序中是否有debug模式的文件,倘若有就说明我们确实是手动加上了debug而不是自带的。**

补充:注意,我们在LINUX的可执行程序是有一定格式的,你可以看作是有一定规律的二进制代码,我称之为elf格式,用readelf可以去查看这个格式
故对应的指令为readelf -s 来读取对应文件的二进制构成

使用gdb的指令:

1.gdb +可执行程序文件:执行此编译程序的调试模式(注意这里不是源代码,而是可执行程序,别弄错了)
2.list/l:展示代码包括行号 l+数字:从指定位置开始展示代码,后续按回车就可以不断展示后面的源码直到显示出最后一行总结出代码的行数,说明整个代码被展现完成了
3.quit/ctrl+d:退出调试
4.run/r:不打断点直接执行程序->有点相当于vs的F5,即启动程序
5.b+行数/指定程序段的字母:打断点
6.info b:查看断点列表(若有多个文件,可以b+文件+行数:给对应的文件上的内容加断点)
7.d+对应的断点列表的编号:删除断点(注意,这里的断点是指对应的断点列表的编号,而不是行号,且断点编号是累加的,在一次调试中累加,调试结束则自动归零
注意:断点默认为y,即开启的状态
8.关闭断点:disable +断点编号,此时执行程序,此断点就不起作用了,启动断点:即enable+断电编号,此时断点重新生效
9.n/next:逐过程执行程序,有点类似vs里的F10
10.s/step:逐语句执行程序,有点类似vs里的F11
11.查看对应的变量:p+变量
12.display+对应的变量:随着程序的执行,常显示某个变量,有点类似vs里面的调试过程中一直对某个变量的变化进行观察
13.undisplay+对应的变量编号:取消常显示,与断点列表一样,undisplay后面也要加列表编号
14.until+行号:在函数程序内直接跳转至指定的位置
15.finish:运行到当前函数的结尾,并判断是否有错误,这里当然包括主函数main
16.c/continue:从一个断点处直接运行到下一个断点处
17.bt:调用堆栈查看
18.set var+变量:更改变量的数值,让其从对应数值的逻辑位置继续执行程序
19.info locals:将当前程序的变量体现出来

总结:

关于gdb和git,我们还有很多功能值得去探索,大家可以在看完这篇文章之后,先掌握基本的调试指令,然后自此基础上不断的去扩展,从而强化自己的调试能力,不过我觉得其实直接去看代码有的时候效果更好,反而调试效率变低的,但是调试这个能力我们是不能缺失的。
到这里,我们的全部的linux的代码编写工具就基本完成了,现在我们就可以用LINUX去编写我们的C/C++的代码了,下一步我们将进入进程篇,去体会计算机操作系统是如何去掌控软硬件的。

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

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

相关文章

leetcode:反转链表

题目描述 题目链接:206. 反转链表 - 力扣(LeetCode) 分析题目 思路一 我们可以设计算法让整个链表掉头 定义三个代码n1,n2,n3 n1指向NULL,n2指向head,n3指向第二个结点 当n2不为NULL的时候,让n2->ne…

ResizeObserver观察元素宽度的变化

ResizeObserver观察元素宽度的变化 ResizeObserver观察元素宽度的变化 ResizeObserver观察元素宽度的变化 ResizeObserver 构造函数创建一个新的 ResizeObserver 对象,它可以用于监听 Element 内容盒或边框盒或者 SVGElement 边界尺寸的大小。查看详细说明 案例 &l…

电影:从微缩模型到AI纹理

在线工具推荐: 三维数字孪生场景工具 - GLTF/GLB在线编辑器 - Three.js AI自动纹理化开发 - YOLO 虚幻合成数据生成器 - 3D模型在线转换 - 3D模型预览图生成服务 自胶片问世以来,电影制作人必须以模仿现实的方式使用纹理,让观众相信他…

Semi-Supervised Multi-Modal Learning with Balanced Spectral Decomposition

Y是所有模态的表征矩阵, ∑ i 1 d h ( λ i ) \sum_{i1}^dh(\lambda_i) ∑i1d​h(λi​) is the proposed eigenvalue-based objective function,the final similarity matrix W for the multimodal data as a block matrix 辅助信息 作者未提供代码

研究前沿| Nature:艰难梭菌引发肠道神经源性炎症的新机制

前言 艰难梭菌感染(Clostridioides difficile infection)是目前发达国家医院和社区内获得性肠道细菌感染腹泻的最主要原因之一。在美国,每年有约50万例病例和导致约29,000例死亡。艰难梭菌(C. difficile)是一种产生孢子…

力扣C++学习笔记——C++ 给vector去重

要使用std::set对std::vector进行去重操作,您可以将向量中的元素插入到集合中,因为std::set会自动去除重复元素。然后,您可以将集合中的元素重新存回向量中。以下是一个示例代码,演示如何使用std::set对std::vector进行去重&#…

Android Studio 安装及使用

🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…

IP地址的分包与组包:网络通信的关键技术解析

在计算机网络中,IP地址的分包与组包是网络通信过程中关键的技术环节,分别涉及将数据拆分为适当大小的包以及在接收端重新组装这些包的过程。这两个过程对于确保高效、可靠的数据传输至关重要。以下将深入探讨IP地址的分包与组包的概念、原理以及在网络通…

内置函数和消息传递API

消息传递范式 消息函数、聚合函数与更新函数 消息函数接受一个参数 edges,这是一个 EdgeBatch 的实例, 在消息传递时,它被DGL在内部生成以表示一批边。edges 有 src、 dst 和 data 共3个成员属性, 分别用于访问源节点、目标节点…

LeetCode | 19. 删除链表的倒数第 N 个结点

LeetCode | 19. 删除链表的倒数第 N 个结点 OJ链接 思路: 定义虚拟头节点dummy并初始化使其指向head然后定义快慢指针让快指针先走n步然后一起走最后删除倒数第n个节点然后释放虚拟节点dummy struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {…

论文导读 | 大语言模型与知识图谱复杂逻辑推理

前 言 大语言模型,尤其是基于思维链提示词(Chain-of Thought Prompting)[1]的方法,在多种自然语言推理任务上取得了出色的表现,但不擅长解决比示例问题更难的推理问题上。本文首先介绍复杂推理的两个分解提示词方法&a…

LaTex 使用颜色突出文中链接或引用

在导言区添加下面的LaTex语句: \usepackage[colorlinks,linkcolorblue]{hyperref}在LaTex中渲染结果如下图,公式会被渲染为蓝色,文献引用会被渲染为绿色:

Java-final

【1】修饰变量; 1.public class Test { 2. //这是一个main方法,是程序的入口: 3. public static void main(String[] args) { 4. //第1种情况: 5. //final修饰一个变量,变量的值不可以改变&#…

为何公司强调流程员工总是觉得反感?

在企业管理中,流程设计对于提高效率和降低风险至关重要。然而,很多企业在流程设计时常犯一些常见的错误,导致基层员工对流程感到烦扰,甚至产生抵触情绪。本文将通过分析一个企业的报销流程问题,探讨如何优化流程以提高…

Android自动化测试,5个必备的测试框架

Appium Appium是一个开源的移动测试工具,支持iOS和Android,它可以用来测试任何类型的移动应用(原生、网络和混合)。作为一个跨平台的工具,你可以在不同的平台上运行相同的测试。为了实现跨平台的功能,Appi…

SQLserver-快速复制一行数据到数据库并修改ID

右击表名,点击选择前1000行 在前面写插入到哪个表,并且对唯一标识字段进行重写 后面是筛选,具体复制哪条数据

Keras训练一个基本体系化的分类模型流程案例

Keras训练一个基本体系化的分类模型流程案例 import numpy as np from keras.datasets import mnist from keras.utils import np_utils # 导入keras提供的numpy工具包 from keras.models import Sequential from keras.layers import Dense from keras.optimizers impo…

day17-高速缓冲区的管理机制

1.目的 用户与磁盘进行文件交互时的流程 磁盘与高速缓冲区的关系 加深块设备驱动的理解 hash 循环链表 单链表的使用方法 2.高速缓冲区的工作流程 高速缓冲区中存储这对应的块设备驱动的数据 当从块设备中读取数据的时候,OS首先会从高速缓冲区中进行检索&#xff0…

当代职场人做分析,当然要用大数据分析工具

不管是从效率、分析的可用性以及灵活性来看,用大数据分析工具都还板上钉钉的。毕竟大数据分析工具集齐了大数据时代数据分析工具应具备的特点优势。 1、对接ERP,立得100BI报表 点击对接金蝶、用友ERP后,BI系统立即即可取数分析,…

移动云电脑:摆脱传统桎梏,助推企业数字化转型

如今,随着“云”在企业数字化转型战略中的作用日益凸显,上云是企业数字化转型第一步,已成为业界共识。尤其对于中小企业而言,数字化转型更是一种生存之道。 实际上,企业数字化转型面临很多传统桎梏。例如,数…