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

Linux·权限与工具-git与gdb

1. git工具

        git是一款软件,发明它的人同时发明了Linux操作系统,也就是大名鼎鼎的Linus Torvalds

林纳斯·托瓦兹。后来人们把git软件包装,产生了github、gitee等平台。

        git产生的初衷就是便于进行多人协同管理,同时它还可以用来将本地文件上传到云端管理,进行版本控制。

1.1 git的安装与仓库下载

        安装指令:yum install -y git

第一步:新建仓库

        首先在gitee上创建账户,并新建一个仓库。

                                

        创建好之后复制这里这个链接,然后回到Linux,输入命令 git clone 链接 就可以把远端的仓库同步下来

        可以看到这个文件夹就是我们远端的仓库。

第二步:三板斧提交代码

        所谓三板斧就是add commit push

        可以将写好的代码放在这个目录下

                

        我们将上节写的代码复制到这个目录下之后,这个文件与git暂时没有任何关系。

        git在本地的结构是这样的

                ​​​​​​​        

        这个目录下有一个.git的隐藏目录,这里面的文件才算是被git托管起来的内容,其下还有index文件缓冲区,和objects文件的本地目录两个模块。我们都是用 add 先将文件添加到缓冲区,再用commit -m “日志描述” 将文件放入本地目录中,才算在本地用git软件将文件托管了起来。

        下面我们操作一下

        这里我们就提交失败了,在此要说两个问题,第一个是 git status 命令可以查看git缓冲区中都有哪些文件,就比如我们刚才add了hello.c文件就在这里出现了。

        第二个就是这个提交失败的原因,就是我们没有设置提交人信息,我们把Run下面那两行代码复制并修改双引号中的内容就好了

​​​​​​​

        此时本地的git就已经托管好了,下面我们使用 git push 命令上传

        ​​​​​​​        

        它会要求输入一下gitee的用户名和密码,然后就可以上传好了

        ​​​​​​​        

        刷新一下就可以在仓库中看到刚刚上传的文件。

1.2 .gitignore文件

        这个文件就是用来忽略某些特定后缀的文件用的,使得这些文件不会被add进文件缓冲区。

        ​​​​​​​        

        我们可以vim进这个文件看看

        ​​​​​​​        

        这些后缀都是不会进入缓冲区的,我们可以通过修改这个文件来控制哪些后缀的文件可以放入缓冲区。

        事实上这个文件存在的意义时避免那些中间文件被上传。

1.3 pull指令

        当两个人同时管理一个仓库时难免会因为两人本地文件的不同,导致具体应该使用谁的本地文件作为远端文件的上传版本的冲突。

        因此git在解决这一问题时使用了一个强制与云端同步的策略,就比如一个人先把本地修改好的文件上传到云端了,另一个人想把他的文件上传的时候就会发现因为云端和本地文件的版本冲突而git拒绝上传文件。

        此时就需要使用指令 git pull 将云端文件拉取下来同步到本地,才能再将本地文件上传到云端。如果说云端文件修改了一行代码,那在pull到本地之后,也会在文件中体现出来哪行代码被修改了,导致与本地文件不同,此时就需要程序员自己去做合并,再将最终版本push上传。

2. gdb 与 cgdb 工具

        gdb工具是最常见的命令行式调试工具。首先我们可以先查看一下自己的系统中有没有安装这款软件。

        使用命令 gdb --version ,如果出现如下信息就说明安装好了

        否则使用命令 yum install -y gdb 安装软件

        程序发布方式有两种,release版本和debug版本,调试只能在debug版本下进行。对于gdb工具来说也是如此。

        我们先做一下准备工作,随便写一个程序,当然,可以还写一个makefile方便编译

        程序的内容就是计算连加,makefile中写的编译逻辑就是正常的编译。但是这么写的话在gcc/g++编译器下是默认编译成release版本的程序。

        ​​​​​​​        ​​​​​​​        ​​​​​​​        

        如果想要发布成release版本就要在编译命令最后加上 -g 选项

        可以看到debug版本的程序明显要比relese版本的大,因为它还多包含了一些调试信息。

2.1 进入gdb软件与打断点

        gdb+需要调试的程序就可以进入gdb模式,对这个程序进行调试操作

        quit / q 可以用quit或简写成q退出gdb软件

        当我们进入软件之后当然需要看到代码才行

        list / l + 数字/函数名 list或简写成l,加上行号或函数名,就可以展示这个行号附近的10行代码,展示过一次之后按回车就可以接着继续向后展示下面的代码。

        ​​​​​​​        ​​​​​​​        

        break/b + 数字/函数名 breakpoint设置断点,需要指定打断点的行号位置或函数位置

        d + 数字 delete breakpoint删除某个断点,这里的数字不是行号了,而是断点的序号

        info break/b 显示断点信息

        这里我在Sum函数和main函数的位置都打上了断点,观察断点信息。Num中写的就是断点序号,d后面的数字就是这个东西。What中会显示这个断点具体打在了第几行上。

        这里要提示一下,断点的序号在一个调试周期内是固定线性增长的,就是说即使现在把断点1,2都删了,再打断点,其序号也是从3开始增长的。除非退出gdb软件重进,但如果这么做的话,上一个调试周期中未删除的断点也都没了。

        disable + 数字 禁用断点

        enable + 数字 启用断点

        

2.2 调试运行 展示变量

        run / r 开始调试,相当于VS调试中的F5

        c 运行到下一断点,相当于VS中的F5

        next / n 逐过程,单步执行,不进入函数内部,相当于VS中的F10

        step / s 逐语句,单步执行,进入函数内部,相当于VS中的F11

        finish 跑完当前所处的子函数

        首先我使用 r ,开始调试,它直接跑到第一个断点处,也就是第16行。然后用 n 逐过程调试,直到第20行也就是函数出现的那一行。进行 s 逐语句调试,可以看到从第20行进入了Sum函数,并且在函数中陷入了循环。

        在单步执行的过程中我们可以直接按回车让调试一步一步往后走,因为在gdb中直接按回车键的含义是模仿上一步的动作。也就是说我们输入s之后,后面的单步调试就可以直接按回车,gdb会自己帮我们输入一个s。

        在VS中有窗口选项来供我们时事查看变量的值的变化情况,这种选择在gdb中也有

        display + 变量名 常显示该变量的值,每执行一次命令都会把这个变量的值打印出来

        undisplay + 序号 关闭某个变量的常显示,这里也是要选择变量的序号而不是变量名

        p + 变量名 暂时显示某变量的值

        info locals 展示当前函数栈帧内所有变量的值

                ​​​​​​​        ​​​​​​​

        这里我给 i 变量用的是后置++所以它的值看起来有点怪

        如果一个循环直接不停的循环不合适,因此gdb提供了在一个函数中向下跳转的功能。

        until + 行号 跳转到某行

                                ​​​​​​​

        因为这个循环一直在7行和9行之间跳转,因此我们直接看看9行附近是什么,until出循环。

        这里还展示了 p 命令的效果。

2.3 cgdb工具

        上面就是命令行调试的基本操作了,但是gdb毕竟不能实时看到代码,还是太不方便了,于是我们可以使用cgdb工具,这个工具是将代码和命令行做了分屏和一定程度的可视化,相对gdb方便了许多。

        安装cgdb工具:sudo yum install -y cgdb

        可以看到这一整个界面还是非常清晰的,目前正在调试的行号会用绿色标注,打的断点会用红色标注。

        其操作的命令是和gdb一样的。

2.4 其他调试命令

        watch 监视某变量的值是否变化,watch也属于断点的一种,每次被触发都会停下来,可以用 d 删除

        set var 变量=数值 在运行期间修改某变量的值

        b 行号 if 变量==数值 新增条件断点,当变量等于某个数值的时候停下来

        condition 断点号 变量==数值 在已有断点上追加条件断点

        至此Linux操作系统的基本使用方法和所需工具讲解完了,后面我将在Lunix环境下从操作系统和网络两个方面继续学习。


http://www.kler.cn/news/314427.html

相关文章:

  • Puppet 部署应用(Puppet deployment application)
  • 《他们的奇妙时光》圆满收官,葛秋谷新型霸总获好评
  • 初始Vitis——ZYNQ学习笔记1
  • 探索微软Copilot Agents:如何通过Wave 2 AI彻底改变工作方式
  • 伊犁linux 创建yum 源过程
  • Java面向对象编程
  • Ubuntu设置笔记本电脑合盖时不挂起
  • el-select组件:选择某个选项触发查询
  • 基于R语言的统计分析基础:使用键盘输入数据
  • charles抓包flutter
  • 数据结构之线性表——LeetCode:328. 奇偶链表,86. 分隔链表,24. 两两交换链表中的节点
  • 基于React+JsonServer+Antddesign的读书笔记管理系统
  • 4.使用 VSCode 过程中的英语积累 - View 菜单(每一次重点积累 5 个单词)
  • 微软AI核电计划
  • SpringBoot 项目启动时指定外部配置文件
  • 【Android 13源码分析】WindowContainer窗口层级-4-Layer树
  • Android通知显示framework流程解析
  • Python中的魔法:栈与队列的奇妙之旅
  • 大语言模型的发展-OPENBMB
  • ICM20948 DMP代码详解(34)
  • 欧美游戏市场的差异
  • 漏洞复现_永恒之蓝
  • AI助力低代码平台:从智能化到高效交付的全新变革
  • 山体滑坡检测系统源码分享
  • STM32 通过 SPI 驱动 W25Q128
  • 【JS】垃圾回收机制与内存泄漏
  • mxnet 的显存分配机制
  • Gitlab学习(009 gitlab冲突提交)
  • 小程序与APP的区别
  • 大数据-137 - ClickHouse 集群 表引擎详解2 - MergeTree 存储结构 一级索引 跳数索引