当前位置: 首页 > news >正文

【深入解析git和gdb:版本控制与调试利器的终极指南】

【本节目标】

  • 1. 掌握简单gdb使用于调试

  • 2. 学习 git 命令行的简单操作, 能够将代码上传到 Github 上

1.Linux调试器-gdb使用

1.1.背景

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

为什么要有debug模式release模式两种模式呢?这两种模式的存在是为了在不同阶段和用途下提供不同的编译和运行配置。

Debug 模式主要用于开发和调试阶段,以提供更好的可读性调试能力,而 Release 模式则用于最终部署,面向用户的就是该版本,且该版本能提供更好的性能减小可执行文件的体积。Debug 模式形成的可执行程序会添加调式信息,Release 模式形成的可执行程序会去掉调式信息。对于用户来说,用户不需要调式信息,用户只在乎下载速度和安装文件大小。对于程序员来说,程序员需要改bug,因此需要调式信息才能修正bug,于是就出现了两种模式。

1.2. 开始使用

我们首先写个程序,方便后面调试样例

#include<stdio.h>
int Sum(int n)
{int i = 1;int sum = 0;for (; i <= n; i++){sum += i;}return sum;
}
int main()
{int result = Sum(100);printf("%d\n", result);return 0;
}

然后再将我们的makefile文件写好。

然后我们来编译一下我们上面的代码,上面的代码是求从1加到100的和,可以看到我们的程序是正确的。

接下来就开始我们的调试程序

但是我们发现此时我们不能进行调试,因为此时是release版本,是不可被调试滴。

为了区分两种模式下的可执行程序,将Debug版本下的可执行程序加上-d,此时经过修改之后。

我们可以清楚的看到两个模式下的可执行程序的文件大小,刚好可以验证我们上面的结论。通过文件大小能验证Debug确实增加了调式信息,但是我们想看到更详细的调试信息。

readelf 是一个用于读取 ELF(Executable and Linkable Format,可执行和可链接格式)文件的命令行工具。ELF 是一种用于在Unix和类Unix系统上执行程序的标准文件格式。readelf 工具允许用户查看 ELF 文件的内部结构、头部信息、节(sections)、程序头部、符号表等内容。

该工具通常在开发和调试过程中使用,以便分析可执行文件或共享库的细节,了解它们的结构和元数据。通过 readelf,用户可以获取关于 ELF 文件的各种信息,例如代码段和数据段的大小、链接地址、节头表、符号表等。

然后我们在删除刚刚两个版本的文件,重新make一个Debug模式的可执行程序mytest文件,然后开始调试mytest文件。

gdb调试相关指令学习 - 平替 - vs上的调试

gdb binFile 退出: ctrl + d 或 quit 调试命令:

2. 学习 git 命令行的简单操作, 能够将代码上传到 Github 上

2.1.什么是git?理解版本控制器

git是一个分布式版本控制系统,用于跟踪项目代码的变化。

版本控制器(Version Control System,VCS)是一种记录和管理文件或代码变更的系统。它追踪文件的历史变更,允许用户回溯到先前的状态,并支持多人协同开发。

2.2.什么是github/gitee?

GitHub:GitHub是一个基于Git的代码托管平台,提供了代码仓库的托管服务。开发者可以将他们的项目代码存储在GitHub上,并与团队成员协同工作。GitHub也提供了许多协作和社交功能,如问题跟踪、代码审查、项目管理等,使得团队协作更加便捷。

Gitee:Gitee(码云)是中国的一个类似GitHub的代码托管平台,同样基于Git。它提供了类似的代码仓库托管服务,并支持团队协作。Gitee也提供了一些特有的功能,以满足中国开发者的需求,如在线构建、镜像仓库等。

总的来说,Git是版本控制系统,而GitHub和Gitee是基于Git的代码托管平台,它们提供了一些额外的功能来帮助开发者更好地进行协同开发。

2.3.使用 git 命令行

安装git - 必须先安装指令
yum install -y git

由于github是国外的网站,我们访问起来速度较慢,于是这里使用gitee作为我们的样例。

在 Github 创建项目
  • No.1:注册自己的gitee账号,然后进入自己的个人主页,点击右上角的+号,点击新建仓库

  • No.2:在进入创建的仓库界面后,设置仓库的名称,如果我们想将该仓库分享给别人,就可以设置开源,初始化现在选择C语言,.gitignore 是在本地仓库上传到远端仓库的时候,不会上传不必要的或敏感的文件提交到代码仓库。例如,编译产生的临时文件、操作系统生成的文件、一些配置文件等,通常不应该包含在版本控制中,而 .gitignore 文件就是告诉 git 忽略这些文件的规则,这里也选择C。模板设置 Readme文件 是为了让其他开发者或用户更容易理解和使用你的项目而创建的。它可以包含项目的概述、依赖关系、配置信息、使用示例等。分支模型涉及到开发,目前这个仓库只有我们一个人用,所以我们这里就不需要设置了。
  • No.3:进入到我们刚才创建的仓库,点击克隆,选择HTPPS,复制下面的链接。

  • No.4:git clone [url],这里的 url 就是刚刚复制好的 项目 的链接.

  • No.5:第一招git add .,.代表当前目录下所有文件,第二招git commit -m "提交日志信息(必须好好写)",如果是第一次,我们这里还需要输入以下两个指令:

git config --global user.name "gitee 用户名"
git config --global user.email "gitee邮箱地址"

第三招,git push需要填入用户名密码,然后就提交到我们的远端仓库了。

图解:

解释:

  1. git clone:

    • 用途:从远程仓库克隆(复制)整个代码库到本地。
    • 示例:git clone https://github.com/example/repo.git
  2. git add:

    • 用途:将工作目录中的修改添加到暂存区,为下一次提交做准备。
    • 示例:git add filename(将指定文件添加到暂存区)或 git add .(将所有修改添加到暂存区)。
  3. git commit:

    • 用途:将暂存区中的修改提交到本地仓库,创建一个新的版本(commit)。
    • 示例:git commit -m "Commit message"
  4. git push:

    • 用途:将本地仓库的提交推送到远程仓库。
    • 示例:git push origin master(将本地的 master 分支推送到远程仓库的 master 分支)。
  • No.6:提交成功到远端仓库

上面就是本地仓库提交到远端仓库的步骤。现在我们来看一下我们刚刚的提交日志信息:git log

        上面的图片中commit后面跟的一串是commit的ID,每一次修改都有一次commit的ID,于是我们就可以通过用哪个commit的ID,就可以看到曾经修改的哪个版本。Author是我们刚才配置邮箱和用户名,这是为了标识你是代码的提交者。这信息会被包含在每次提交中,以记录是谁进行了代码的更改。这对于团队协作和代码贡献追踪非常重要。

  git status 是 Git 中用于查看工作区(working directory)和暂存区(staging area)状态的命令。运行这个命令可以告诉你当前工作目录中文件的状态以及是否有文件修改未提交。

此时会显示工作目录中未被 Git 跟踪的文件和已修改的文件,但不会显示任何文件已暂存(staged)或提交(committed)的状态。

这是已经通过 git add 添加到暂存区但尚未通过 git commit 提交到版本库的文件。

此时显示没有文件需要 commit ,当前暂存区干净。

通过 git add push 推送到远端仓库,下面是推送后的状态

删除仓库文件的步骤

此时我们还可以通过git log查看日志信息

在Git中,git branch是用来管理分支的命令。

查看分支: 使用git branch命令可以列出当前仓库中存在的所有分支。当前分支前会有一个星号(*)表示当前所在的分支。

git branch

通过合理使用分支,可以更方便地进行代码的管理和协同开发。分支允许多个开发者在同一时间内独立地开发不同的功能或修复不同的bug,而不会互相影响。每个分支都代表着一个特定的工作线,开发者可以在不干扰其他工作的情况下进行自己的修改和实验,最后合并到master分支,能保证此时出现极少的错误。

.gitignore 是一个用于指定在版本控制系统中忽略哪些文件或目录的配置文件。在一个Git仓库中,有些文件是不希望被纳入版本控制的,比如编译生成的文件、临时文件、日志文件等。.gitignore 文件告诉Git哪些文件或目录应该被忽略,从而不会被提交到版本库中。通过使用 .gitignore 文件,你可以确保不必要的文件不会被提交到版本库中,从而保持版本库的干净和有序。

现在我们来验证一下,我们想设置.txt文件不被提交到远端仓库。

此时我们修改了.gitignore文件,因为.gitignore也是工作区的文件,也要被上传到远端仓库,但是我们此时先不上传到远端仓库。

上传到远端仓库后,我们创立一些文件来验证一下

然后我们使用我们的三板斧上传到远端仓库

但是我们发现.txt后缀的文件被上传到远端仓库了,为什么呢?这是因为在.gitignore中被忽略的文件前面加上了*,这里的*就是通配符的意思,这里必须要带上*,表示所有后缀为.txt的文件。

我们现在才来创建文件试一试

此时我们就发现3.txt文件就没有同步到远端仓库

通过上面的样例,我们可以发现.gitignore我们没有立即同步到远端仓库,而也可以立即生效,它是在git add的时候已经将.gitignore加载到暂存区,并且此时就会过滤这些文件。当您在本地进行 git add 操作时,Git 会将已跟踪的文件和新添加的文件添加到暂存区。.gitignore 文件的规则在这个阶段就会生效,被指定忽略的文件将不会被包含在暂存区中。

总结:

git如何进行多人协作 - 并行开发,串行提交

多人协作是Git的一个强大功能,以下是一般的多人协作流程:

  1. 创建远程仓库: 通常,多人协作的项目会有一个中央远程仓库,比如在GitHub、Gitee或Bitbucket上创建一个项目仓库。

  2. 每个人克隆仓库: 每个团队成员将远程仓库克隆到本地,使用如下命令:

    git clone <远程仓库URL>
  3. 创建分支: 为了避免直接在主分支上工作,每个人都应该在本地创建一个新的分支,用于开发特定的功能或修复问题。

    git checkout -b <新分支名称>
  4. 进行开发: 每个人在自己的分支上进行开发工作。使用git addgit commit来保存更改。

    git add . git commit -m "描述提交的更改"
  5. 推送到远程仓库: 当开发工作完成并且代码已经经过测试,将本地分支推送到远程仓库。

    git push origin <分支名称>
  6. 合并分支: 使用 pull request(GitHub、GitLab等平台)或 merge 请求(Bitbucket),将特性分支合并到主分支。这样可以进行代码审查和确保代码质量。

  7. 更新本地仓库: 每个人在开始新的工作前应该定期更新他们的本地仓库,以包含其他人的更改。

    git pull origin master
  8. 解决冲突: 如果多人在同一部分修改了代码,可能会发生冲突。在这种情况下,Git 会提示您解决冲突。

        产生冲突的原因是:比如Windows用户此时上传了修改这个代码,此时远端仓库就和这个Windows用户同步了,然后Linux用户再对这个代码进行上传,此时就会因为远端仓库没有和Linux用户本地仓库同步发生冲突。

所以此时就要远端仓库和Linux用户本地仓库同步,git pull 用于将远程仓库的最新更改拉取到本地并合并,以保持本地仓库与远程仓库同步。

git pull

此时我们就可以上传到远端仓库了,我们不仅能看到Linux在本文件中修改的代码,还能看到Windows用户修改的代码。所以git仓库如果本地和远端不同步,此时如果想要其他用户上传到远端仓库,git会强制你进行同步,一旦提交成功后,对于任何人,此时你修改的代码会被所有人看到。   

上面我们每次git push的时候都需要输入用户和密码,比较麻烦,我们可以配置免密码提交

https://blog.csdn.net/camillezj/article/details/55103149

                                                                                                                                                      

相关文章:

【深入解析git和gdb:版本控制与调试利器的终极指南】

【本节目标】 1. 掌握简单gdb使用于调试 2. 学习 git 命令行的简单操作, 能够将代码上传到 Github 上 1.Linux调试器-gdb使用 1.1.背景 程序的发布方式有两种&#xff0c;debug模式和release模式release模式不可被调试&#xff0c;debug模式可被调试Linux gcc/g出来的二进制…...

CGAN原理讲解与源码

1.CGAN原理 生成器&#xff0c;输入的是c和z&#xff0c;z是随机噪声&#xff0c;c是条件&#xff0c;对应MNIST数据集&#xff0c;要求规定生成数字是几。 输出是生成的虚假图片。 生成器生成的图片被判别器认为是真实图片&#xff0c;那么标签就是1 其实判别器模型输出的是…...

C#实体类与XML互转以及List和DataTable转XML的使用

引言 在C#开发中&#xff0c;数据的存储和传输是非常常见的需求。使用XML作为数据格式有很多优点&#xff0c;例如可读性强、易于解析等。而实体类、List和DataTable是表示数据模型的常用方式。本文将介绍如何在C#中实现实体类、List和DataTable与XML之间的相互转换&#xff0c…...

uniapp的vue3的模版的setup函数内使用uniapp内置方法

vue2使用方式直接在method同级使用就行,但是在vue3的setup函数内直接使用会报错,本人找了好久,发现vue3需要导入uniapp模块才能使用,具体如下 使用uniapp上拉加载更多方法 <script>import {onReachBottom} from dcloudio/uni-apponReachBottom(() > {console.log(&qu…...

UI自动化的基本知识

一、UI自动化测试介绍 1、什么是自动化测试 概念&#xff1a;由程序代替人工进行系统校验的过程 1.1自动化测试能解决的问题&#xff1f; 回归测试 (冒烟测试) 针对之前老的功能进行测试 通过自动化的代码来实现。 针对上一个版本的问题的回归 兼容性测试 web实例化不同的浏…...

python实现C++简易自动压行

突发奇想&#xff0c;想要将自己的c压行之后交上去。但是苦于手动压行效率太低&#xff0c;在网上搜索压行网站没有找到&#xff0c;突然发现压行不就是检查检查去个换行符吗。于是心血来潮&#xff0c;用python实现了一个简易压行程序。 首先&#xff0c;宏定义等带#的文件不…...

京东数据分析(京东大数据采集):2023年线上珍珠市场销售数据采集

在珠宝首饰市场&#xff0c;从黄金到钻石&#xff0c;如今年轻人的新风潮又转向了珍珠。珍珠热潮并非刚刚兴起&#xff0c;早在前两年&#xff0c;抖音、快手等短视频台的珍珠开蚌直播内容&#xff0c;就掀起了一波珍珠热潮。 此后&#xff0c;随着珍珠饰品被越来越多社交平台的…...

亚信科技AntDB数据库与库瀚存储方案完成兼容性互认证

近日&#xff0c;亚信科技AntDB数据库与苏州库瀚信息科技有限公司自主研发的RISC-V数据库存储解决方案进行了产品兼容测试。经过双方团队的严格测试&#xff0c;亚信科技AntDB数据库与库瀚数据库存储解决方案完全兼容、运行稳定。除高可用性测试外&#xff0c;双方进一步开展TP…...

现代C++之万能引用、完美转发、引用折叠

现代C之万能引用、完美转发、引用折叠 0.导语1.问题引入2.引入万能引用3.万能引用出现场合4.理解左值与右值4.1 精简版4.2 完整版4.3 生命周期延长4.4 生命周期延长应用5.区分万能引用6.表达式的左右值性与类型无关7.引用折叠和完美转发7.1 引用折叠之本质细节7.2 示例与使用7.…...

ELK日志收集系统-filbeat

filebeat日志收集工具 elk&#xff1a;filebeat日志收集工具和logstash相同 filebeat是一个轻量级的日志收集工具&#xff0c;所使用的系统资源比logstash部署和启动时使用的资源要小的多 filebeat可以运行在非Java环境&#xff0c;它可以代理logstash在非java环境上收集日志…...

Python小知识

个人学习笔记&#xff0c;用于记录使用过程中好用的技巧、好用的库。 1 小知识 1.1 相对路径 1.2 打包Exe文件 命令&#xff1a; pyinstaller -F main.py其中-F&#xff1a;覆盖之前打包的文件 mian.py&#xff1a;需要打包的Python文件 PS&#xff1a;使用pyinstaller 5.1…...

如何在Ubuntu系统上安装Redis

Redis的下载 Redis安装包分为windows版和Linux版当前示例中介绍的是Linux版本Linux的下载地址&#xff1a;Index of /releases/ (redis.io)本次下载的压缩包为&#xff1a;redis-6.2.14.tar.gzRedis的安装 将压缩包通过ssh远程工具上传到Linux服务器中解压压缩包 tar -zxvf red…...

Vue2问题:如何全局使用less和sass变量?

前端功能问题系列文章&#xff0c;点击上方合集↑ 序言 大家好&#xff0c;我是大澈&#xff01; 本文约2400字&#xff0c;整篇阅读大约需要4分钟。 本文主要内容分三部分&#xff0c;如果您只需要解决问题&#xff0c;请阅读第一、二部分即可。如果您有更多时间&#xff…...

Java 基础学习(四)操作数组、软件开发管理

1 操作数组 1.1.1 System.arraycopy 方法用于数组复制 当需要将一个数组的元素复制到另一个数组中时&#xff0c;可以使用System.arraycopy方法。它提供了一种高效的方式来复制数组的内容&#xff0c;避免了逐个元素赋值的繁琐过程。相对于使用循环逐个元素赋值的方式&#x…...

git仓库如何撤销提交,恢复提交,重置版本命令

撤销提交&#xff1a; 要撤销最近一次提交&#xff08;未推送到远程仓库&#xff09;&#xff0c;可以使用以下命令&#xff1a; git reset HEAD^该命令将会把最后一次提交的修改从当前主分支中移除&#xff0c;并将这些修改的状态保留在本地工作目录中。 如果想要取消所有的…...

Java 基础学习(三)循环流程控制与数组

1 循环流程控制 1.1 循环流程控制概述 1.1.1 什么是循环流程控制 当一个业务过程需要多次重复执行一个程序单元时&#xff0c;可以使用循环流程控制实现。 Java中包含3种循环结构&#xff1a; 1.2 for循环 1.2.1 for循环基础语法 for循环是最常用的循环流程控制&#xff…...

别太担心,人类只是把一小部分理性和感性放到了AI里

尽管人工智能&#xff08;AI&#xff09;在许多方面已经取得了重大进展&#xff0c;但它仍然无法完全复制人类的理性和感性。AI目前主要侧重于处理逻辑和分析任务&#xff0c;而人类则具有更复杂的思维能力和情感经验。 人类已经成功地将一些可以数据化和程序化的理性和感性特征…...

最新AIGC创作系统ChatGPT系统源码+DALL-E3文生图+图片上传对话识图/支持OpenAI-GPT全模型+国内AI全模型

一、AI创作系统 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI…...

在centos7上源码安装nginx

1. 安装必要的编译工具和依赖项 在编译Nginx之前&#xff0c;你需要安装一些编译工具和依赖项。可以通过以下命令安装&#xff1a; yum install gcc-c pcre-devel zlib-devel make 2. 下载Nginx源代码 从Nginx官网下载最新的源代码。你可以使用wget命令来下载&#xff1a; …...

Html网页threejs显示obj,ply三维图像实例

程序示例精选 Html网页threejs显示obj,ply三维图像实例 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《Html网页threejs显示obj,ply三维图像实例》编写代码&#xff0c;代码整洁&#xff0…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

【网络安全】开源系统getshell漏洞挖掘

审计过程&#xff1a; 在入口文件admin/index.php中&#xff1a; 用户可以通过m,c,a等参数控制加载的文件和方法&#xff0c;在app/system/entrance.php中存在重点代码&#xff1a; 当M_TYPE system并且M_MODULE include时&#xff0c;会设置常量PATH_OWN_FILE为PATH_APP.M_T…...