初识Linux(4):Linux基础环境工具(下)

 1. Git

        Git是一种版本控制系统,是一种工具,用于代码的存储和版本控制。

而我们常见的Gitee和Gitehub都是基于Git(Git是开源的)实现的在线代码仓库,而前者服务器位于中国,后者服务器位于美国。

总的来说,Git就是一个版本控制的工具,在现实中有很多用途:

                      


Git与Linux的关系 

Git的历史可以追溯到2005年,它的诞生与Linux内核项目的发展密切相关。

1. **Linux内核项目的需求**:在1991至2002年间,Linux内核项目的开发主要依赖于提交补丁和保存归档的方式,这种方法效率低下。2002年,Linux内核项目开始使用一个专有的分布式版本控制系统BitKeeper来管理和维护代码。

2. **与BitKeeper的合作结束**:2005年,开发BitKeeper的商业公司结束了与Linux内核开源社区的合作关系,收回了免费使用BitKeeper的权力。这迫使Linux社区,特别是Linus Torvalds,开发自己的版本控制系统。

3. **Git的诞生**:基于使用BitKeeper时的经验,Linus Torvalds制订了新系统的目标,包括速度、简单设计、对非线性开发模式的支持、完全分布式以及高效管理大规模项目的能力。Git在这些目标的指导下被开发出来,并在短短十天后诞生。

4. **Git的开发和维护**:Linus Torvalds完成了Git的初始开发后,不久将其维护工作交给了Junio Hamano,他至今仍在维护Git。

5. **Git的特点**:Git是一个开源的分布式版本控制系统,它以速度快、设计简单、支持非线性开发模式、完全分布式和高效管理大规模项目而著称。

6. **Git的普及**:Git自诞生以来,逐渐成熟并完善,它的速度飞快,非常适合管理大型项目,并且拥有强大的分支管理系统。2008年,GitHub的上线进一步推动了Git的普及,为开源项目免费提供Git存储,吸引了许多项目迁移至GitHub。

Git的发展历程显示了它如何从一个紧急需求中诞生,并迅速发展成为全球最流行的分布式版本控制系统之一。

因此,Git只是一个工具,在Linux中可以通过来安装:

sudo yum install git

既然能安装上Git,那作为一种工具就需要我们来简要学习。


Gitee及其在Linux上对应的操作 

原理:

操作:先到gitee上创建一个仓库,然后clone到linux本地,

git clone URL

在这个仓库中创建一个源文件,这个文件与gitee没有任何关系。

               

换句话说,现在的git不会自动管理这个写好的文件,需要你自己手动上传。


git add filename

 这一步的目的是将需要用 git 管理的文件告知 git。

git add test.c只是将原码添加到git的一个暂存区,算临时添加

                            


git commit -m "a test for git"

git commit -m  "11111"   作为日志,建议写上。

如果此时输入git status,就会出现:

              

一次提交形成一个唯一的id值

多次提交形成的就是版本链。

还可以通过git commit --amhead来只更改上一次提交。 


最后一步,push

git push

这时候再刷新一下网络端的gitee,就能发现已经有文件提交上去了。

并且,如果我们再status一次:

                       

就是clean的。


多用户使用同一个gitee仓库

 在windows端克隆一个仓库,来模拟两个人的使用

        A(windows)先提交,B(linux)不知道,B的仓库和远端仓库不同步,因此B就不能提交,必须要B的仓库和远端仓库(A同理)一致才能再提交,因此引出了pull的使用。

这样就强制了必须先和远端同步。

 在windos的仓库里提交一个文档

回到linux中拷贝一份之前的代码。

此时就需要: 

                                          

这样就拿下来了:

                 

再回到gitee的网页端,就发现已经全部上传了。


如果A和B对同一个文件进行修改,再打开文件,就会变成:

         

因此,需要程序员自己把代码自行进行合并与修改。

总结:

git clone
git pull//拉取
git push//推送
git add
git commit -m
git status

2. 调试器-gdb/cgdb

安装gdb和cgdb

如果已经安装,可以使用gdb--version查看当前工具的版本和信息。


测试代码: 

#include <stdio.h>
int Sum(int s, int e)
{
int result = 0;
for(int i = s; i <= e; i++)
{
result += i;
}
return result;
}
int main()
{
int start = 1;
int end = 100;
printf("I will begin\n");
int n = Sum(start, end);
printf("running done, result is: [%d-%d]=%d\n", start, end, n);
return 0;
}

对于一个源文件,想调试,必须是debug版本。在gcc编译时,需要带上选项:-g,否则默认是realease版本的

debug需要的指令:-g

可以用readelf(显式文件ELF的指令)查看两个文件和debug相干的内容。

写makefile:

                                       

此时用readelf看,并没有预期现象

原因是,调试信息是在编译阶段加入的,在可执行文件链接时加一个-g没有起作用

                      

所以要把-g的位置换在第一步里。

ubuntu下用file查看的话,两个文件会有差别。

进入gdb

gdb myexe

请注意不要gdb源码,源码是打不开的,请打开可执行程序。 

使用quit直接退出,l指令查看代码,l接数字,直接到想查看的行数,l接函数名称也可以,

       

或者还可以l文件名+行号:

                                             

会尽量让想被查看的处于代码的中间。

小结:

l 行号(默认打印10行)

l main

l myexe.c : 5  


断点:

使用"b"打断点,b后面接行数:b 19

在19行打断点。

info b 查看打的断点。

加断点的时候可以按照行数加,但是删断点必须通过断点序列去删,

在一个调试周期,断点的序列号不会重复,打了123,删除123,再打的时候就是从4开始。

断点编号现行递增。

断点的删除 : d 断点序号(通过info查看序号)


使能:

断点的禁用 :  disable 1

使能:enable 1(即激活或启用断点)

          

可以在info中,看是否被使能。y/n

运行:

打好断点之后,就可以r了(run),会自动停到打了断点的位置。

对应vs的F10 F11

n(next),对应逐过程(会把函数当作一个过程,直接执行一个函数,相当于F10)

s(step),对应逐步(会进入每一个函数)

display(不简写)常显示

undisplay ,后面也是接编号,而不是变量名(编号也是线性递增)

p,暂时打印

until 12 跳转,比如确定了一个循环没有问题,可以跳出

c/continue都可以

从一个断点直接执行到下一个断点。

finish 跑完当前所在的函数

如果需要图形化界面,可以安装cgdb

其指令和gbd是一样的,但是可以执行分屏,可视化效果更好

指令小结

list / l :

l 1

l code.c : 5

l main

run/r 

step/s(F11)

next/n(F10)

b 19

b main

info b

enable 1

disable 1

finish 

until 12(until只能接行号)

c/continue 从当前断点执行到下一个断点

display n(变量名)

undisplay (变量名的编号)

d breakpoints 

d breakpoints 1

每次被watch的数据,变化的时候就会被

set var

watch与条件断点:

watch

执⾏时监视⼀个表达式(如变量)的值。如果监视的表达式在程序运⾏期间的值发⽣变化,GDB 会暂停程序的执⾏,并通知使⽤者

比如,要在sum函数中监视i的每次变化

watch i

watch也可以在info b中观察到。

 


条件断点 

新增: b ⾏号/⽂件名:⾏号/函数名 if i == 30(条件)
给已有断点追加:condition 2 i==30, 其中2是已有断点编号,没有if

给已有断点添加条件(注意没有if):

直接设置条件断点:

                                       

finish不能直接跳过条件断点

finish也不能跳过watch

set var 

(gdb) set var flag= 1 # 更改 flag 的值,确认是否是它的原因

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

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

相关文章

12.Three.js纹理动画与动效墙案例

12.Three.js纹理动画与动效墙案例 在Three.js的数字孪生场景应用中&#xff0c;我们通常会使用到一些动画渲染效果&#xff0c;如动效墙&#xff0c;飞线、雷达等等&#xff0c;今天主要了解一下其中一种动画渲染效果&#xff1a;纹理动画。下面实现以下动效墙效果&#xff08…

《白帽子讲Web安全》13-14章

《白帽子讲Web安全》13-14章 《白帽子讲Web安全》13-14章13、应用层拒绝服务攻击13.1、DDOS简介13.2、应用层DDOS13.2.1、CC攻击13.2.2、限制请求频率13.2.3、道高一尺&#xff0c;魔高一丈 13.3、验证码的那些事儿13.4、防御应用层DDOS13.5、资源耗尽攻击13.5.1、Slowloris攻击…

【电子元器件】Nand Flash基础介绍

本文章是笔者理论结合实践进行整理的备忘笔记。希望在帮助自己温习避免遗忘的同时&#xff0c;也能帮助其他需要参考的朋友。如有谬误&#xff0c;欢迎大家进行指正。 一、什么是Nand Flash Flash主要分两种&#xff0c;Nand Flash和Nor flash。 Nor的成本相对高&#xff0c…

JVM_垃圾收集器详解

1、 前言 JVM就是Java虚拟机&#xff0c;说白了就是为了屏蔽底层操作系统的不一致而设计出来的一个虚拟机&#xff0c;让用户更加专注上层&#xff0c;而不用在乎下层的一个产品。这就是JVM的跨平台&#xff0c;一次编译&#xff0c;到处运行。 而JVM中的核心功能其实就是自动…

python除了熟悉的pandas,openpyxl库也很方便的支持编辑Excel表

excel表格是大家经常用到的文件格式&#xff0c;各行各业都会跟它打交道。之前文章我们介绍了使用openpyxl和xlrd库读取excel表数据&#xff0c;使用xlwt库创建和编辑excel表&#xff0c;在办公自动化方面可以方便我们快速处理数据&#xff0c;帮助我们提升效率。 python之open…

网络知识1-TCP/IP模型

从用户端到服务端&#xff0c;tcp/ip模型可分为应用层、传输层、网络层、网络接口层 以下使用寄快递为例进行解释 应用层职责&#xff1a; 只关注与为用户提供应用功能&#xff0c;如HTTP、FTP、telnet、DNS、SMTP等 &#xff0c;应用层的职责就像我们寄快递时将快递给快递员…

机器学习(二十五):决策树算法以及决策树和神经网络的对比

一、决策树集合 单一决策树会对训练数据的变化很敏感。例子&#xff1a;输入十个数据&#xff0c;判断是否是猫。只替换其中一个数据&#xff0c;信息增益最高的分裂特征就发生了改变&#xff0c;决策树就发生了变化。 使用决策树集合可以使算法更加健壮。例子&#xff1a;使用…

通俗理解人工智能、机器学习和深度学习的关系

最近几年人工智能成为极其热门的概念和话题&#xff0c;可以说彻底出圈了。但人工智能的概念在1955年就提出来了&#xff0c;可以说非常古老。我在上小学的时候《科学》课本上就有人工智能的概念介绍&#xff0c;至今还有印象&#xff0c;但那些年AI正处于“寒冬”&#xff0c;…

CDAF / PDAF 原理 | PDAF、CDAF 和 LAAF 对比 | 图像清晰度评价指标

注&#xff1a;本文为 “CDAF / PDAF 原理 | PDAF、CDAF 和 LAAF 对比 | 图像清晰度评价指标” 几篇相关文章合辑。 文章中部分超链接、图片异常受引用之前的原文所限。 相机自动对焦原理 TriumphRay 于 2020-01-16 18:59:41 发布 凸透镜成像原理 这一部分大家中学应该就学过…

文件上传upload-labs-docker通关

&#xff08;图片加载不出&#xff0c;说明被和谐了&#xff09; 项目一&#xff1a; sqlsec/ggctf-upload - Docker Image | Docker Hub 学习过程中,可以对照源码进行白盒分析. 补充&#xff1a;环境搭建在Linux虚拟机上的同时&#xff0c;以另一台Windows虚拟机进行测试最…

Linux的介绍及虚拟机centOS系统的下载与应用

1、什么是Linux Linux 是一种类 Unix 操作系统&#xff0c;它的内核&#xff08;Kernel&#xff09;由 Linus Torvalds 于 1991 年首次发布。作为一个开源、免费的操作系统&#xff0c;Linux 被广泛用于服务器、桌面计算机、嵌入式设备、移动设备等各种场景。 1、操作系统 操…

如何在 Ubuntu 22.04 上安装 Metabase 数据可视化分析工具

简介 Metabase 提供了一个简单易用的界面&#xff0c;让你能够轻松地对数据进行探索和分析。通过本文的指导&#xff0c;你将能够在 Ubuntu 22.04 系统上安装并配置 Metabase&#xff0c;并通过 Nginx 进行反向代理以提高安全性。本教程假设你已经拥有了一个非 root 用户&…

spring +fastjson 的 rce

前言 众所周知&#xff0c;spring 下是不可以上传 jsp 的木马来 rce 的&#xff0c;一般都是控制加载 class 或者 jar 包来 rce 的&#xff0c;我们的 fastjson 的高版本正好可以完成这些&#xff0c;这里来简单分析一手 环境搭建 <dependency><groupId>org.spr…

js 高亮文本中包含的关键词标红

在开发中&#xff0c;遇到需要将文本中包含的关键字高亮的情况&#xff0c;可以做以下处理。 <div class"title"v-html"highlightKeywords(item.title, state1.tags1.concat(state2.tags2).concat(state3.tags3))"> </div> ...... ...... con…

从迭代器到生成器:小内存也能处理大数据

有的对象可以用for循环比如字符串和列表,有的对象不可以比如整数 my_str 123 for s in my_str;print(s)my_lst [1,2,3] for i in my_lst:print(i)my_int 123 for n in my_int:print(n) # 报错python中能够使用for循环迭代的对象叫可迭代对象也叫iterables iterables包含__i…

第29天:安全开发-JS应用DOM树加密编码库断点调试逆向分析元素属性操作

时间轴&#xff1a; 演示案例&#xff1a; JS 原生开发-DOM 树-用户交互 DOM&#xff1a;文档操作对象 浏览器提供的一套专门用来操作网页代码内容的功能&#xff0c;实现自主或用户交互动作反馈 安全问题&#xff1a;本身的前端代码通过 DOM 技术实现代码的更新修改&#xff…

“蜀道山”高校联合公益赛 Web (部分)

文章目录 奶龙牌WAF海关警察训练平台恶意代码检测器 奶龙牌WAF <?php if ($_SERVER[REQUEST_METHOD] POST && isset($_FILES[upload_file])) {$file $_FILES[upload_file];if ($file[error] UPLOAD_ERR_OK) {$name isset($_GET[name]) ? $_GET[name] : basen…

docker-compose搭建xxl-job、mysql

docker-compose搭建xxl-job、mysql 1、搭建docker以及docker-compose2、下载xxl-job需要数据库脚本3、创建文件夹以及docker-compose文件4、坑来了5、正确配置6、验证-运行成功 1、搭建docker以及docker-compose 略 2、下载xxl-job需要数据库脚本 下载地址&#xff1a;https…

XML JSON

XML 与 JSON 结构 XML&#xff08;eXtensible Markup Language&#xff09; 1. 定义 XML 是一种标记语言&#xff0c;用于描述数据的结构和内容。主要用于数据存储与交换。 2. 特点 可扩展性&#xff1a;用户可以自定义标签。层次化结构&#xff1a;数据以树形结构组织&…

【Innodb阅读笔记】之 二进制文件应用,主从复制搭建

一、概述 MySQL的主从复制&#xff08;Master-Slave Replication&#xff09;是一种数据复制解决方案&#xff0c;将主数据库的DDL和DML操作通过二进制日志传到从库服务器中&#xff0c;然后在从库上对这些日志重新执行&#xff08;也叫重做&#xff09;&#xff0c;从而是的从…