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++的代码了,下一步我们将进入进程篇,去体会计算机操作系统是如何去掌控软硬件的。

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

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

相关文章

西南科技大学814考研一

C语言基础 字节大小 char:1 字节 unsigned char:1 字节 short:2 字节 unsigned short:2 字节 int:通常为 4 字节(32 位平台)或 8 字节(64 位平台) unsigned int&#x…

【FFmpeg实战】ffmpeg播放器-音视频解码流程

音视频介绍 音视频解码流程 FFmpeg解码的数据结构说明 AVFormatContext:封装格式上下文结构体,全局结构体,保存了视频文件封装格式相关信息AVInputFormat:每种封装格式,对应一个该结构体AVStream[0]:视频文件中每个视频&#xff…

Java值传递和引用传递

在Java中,有值传递(Pass-by-Value)和引用传递(Pass-by-Reference)两种参数传递方式。 值传递(Pass-by-Value):当使用值传递方式时,方法将参数的副本传递给调用方法。这意…

【Java】抽象类和接口

文章目录 一、抽象类1.抽象类的概念2.抽象类的语法3.抽象类的特性4.抽象类的作用 二、接口1.接口的概念2.语法规则3.接口的使用4.接口的特性5.实现多个接口6.接口间的继承7.接口的使用实例8.Clonable 接口和深拷贝9.抽象类和接口的区别 三、Object类1.获取对象信息2.对象的比较…

Jmeter 如何监控目标服务的系统资源

下载Jmeter插件管理下载 perfmon 将这个插件管理放到Jmeter的\lib\ext目录下 然后重启Jmeter jmeter-plugins-manager-1.10.jar 下载 perfmon插件 添加 io 内存 磁盘的监听 并且添加监听 在宿主机中安装代理监听程序 并启动 ServerAgent.tar.gz

UDP网络套接字编程

先来说说数据在网络上的传输过程吧,我们知道系统其实终究是根据冯诺依曼来构成的,而网络数据是怎么发的呢? 其实很简单,网络有五层。如下: 如上图,我们知道的是,每层对应的操作系统中的那些地方…

系列一、堆里面的分区:Eden、From、To、老年代各自的特点

一、堆里面的分区:Eden、From、To、老年代各自的特点 堆是对象共享的区域,也是垃圾回收器主要工作的地方。主要分为新生区、养老区和元空间,而这三块地方中GC主要工作在新生区和养老区,其中新生区占1/3、养老区占2/3,新…

《微信小程序开发从入门到实战》学习二十二

3.3 开发创建投票页面 3.3.10 使用switch开关组件 用switch开关组件增加一个设置是否匿名投票的功能。 switch常用属性如下: checked 开还是关,默认false关 disabled 是否禁用,默认false不禁用&#xff0…

openssl1.0.2版本Windows安装问题

之前安装过1.1版本,Windows环境下C 安装OpenSSL库 源码编译及使用(VS2019)_vs2019安装openssl_肥宝Fable的博客-CSDN博客 后来发现linux编译不过,以为是版本问题,相差太大,所以降一下版本,以免…

NAS层协议栈学习笔记

NAS(Non-Access Stratum)是无线网络中非接入层及包括移动性管理(MM)和会话管理(SM)协议 ,在5G(NR)系统中连接管理(Connection Management)用于建立和释放UE与AMF之间的控制面(CP)信令连接。 5G中移动性管理是通过NAS信令在UE与核心网之间进行交互的,连接…

设计模式常见面试题

简单梳理下二十三种设计模式,在使用设计模式的时候,不仅要对其分类了然于胸,还要了解每个设计模式的应用场景、设计与实现,以及其优缺点。同时,还要能区分功能相近的设计模式,避免出现误用的情况。 什么是…

第十一周任务总结

本周任务总结 本周物联网方面主要继续进行网关的二次开发与规则引擎实现设备联动的实现 非物联网方面主要复习了docker的使用与算法的学习 1.网关的二次开发,本周将实现debug调试输出的文件下载到了网关,但网关出了问题无法连接,最终跟客服…

Web之CSS笔记

Web之HTML、CSS、JS 二、CSS(Cascading Style Sheets层叠样式表)CSS与HTML的结合方式CSS选择器CSS基本属性CSS伪类DIVCSS轮廓CSS边框盒子模型CSS定位 Web之HTML笔记 Web之JavaScript(jQuery)笔记 二、CSS(Cascading Style Sheets层叠样式表&…

Selenium安装WebDriver最新Chrome驱动(含116/117/118/119)

📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…

Halcon Solution Guide I basics(2): Image Acquisition(图像加载)

文章目录 文章专栏前言文章解读文章开头流程图算子介绍案例自主练习读取一张图片读取多张图片 文章专栏 Halcon开发 Halcon学习 练习项目gitee仓库 前言 今天来看Halcon的第二章,图像获取。在第二章之后,后面文章就会提供案例了。到时候我会尽量完成每一…

Kotlin 知识体系

Kotlin 知识体系 1、Kotlin 文档2、Kotlin 基础3、桌面应用程序4、Android 与 iOS 应用程序 1、Kotlin 文档 Kotlin 是一门现代但已成熟的编程语言,旨在让开发人员更幸福快乐。 它简洁、安全、可与 Java 及其他语言互操作,并提供了多种方式在多个平台间复…

【数据结构初阶】单链表SLlist

描述 不同于顺序表,顺序表的数据是存储在一个连续的空间里的 而链表它是链接起来的结构体地址。 所以我们不用像顺序表一样先创建一块空间出来,而是创建一个能存数据节点和节点与下一个节点之间的连接; 所以:“一个能存数据节点…

鸿蒙:从0到“Hello Harmony”

效果展示 一.概述 明年华为鸿蒙就不再兼容Android生态了,作为拥有7亿终端用户的华为,建立自己的生态也是理所当然。 所以对HarmonyOS的研究也是众多开发者绕不开的坎了。 今天这篇博文主要实现一个“Hello Harmony!”的Demo。 二.官方链接…

场景交互与场景漫游-osgGA库(5)

osgGA库 osgGA库是OSG的一个附加的工具库,它为用户提供各种事件处理及操作处理。通过osgGA库读者可以像控制Windows窗口一样来处理各种事件 osgGA的事件处理器主要由两大部分组成,即事件适配器和动作适配器。osgGA:GUIEventHandler类主要提供了窗口系统的…

基于单片机体温脉搏检测控制系统及源程序

一、系统方案 1、本设计采用51单片机作为主控器。 2、DS18B20传感器检测体温。 3、红外对接管采集心率值送到液晶1602显示。 二、硬件设计 原理图如下: 三、单片机软件设计 1、首先是系统初始化 /lcd1602初始化设置*/ void init_1602() { write_com(0x38); //显示…