Liunx开发工具:git和gdb

news2024/11/17 9:49:43

目录

一. git的功能和使用

1.1 git的功能

1.2 git三板斧 

1.3 git使用中的其他问题

二. 使用gdb调试代码 

2.1 生成带有调试信息的可执行程序

2.2 gdb调试代码的方法


一. git的功能和使用

1.1 git的功能

git是一块开源、免费的版本管理系统,能够高效敏捷地处理任何大型或小型项目。

问题:什么是版本管理?

这里以一个生活中的例子来讲解,假设程序员A写了一份实验报告,最初版本我们称之为v1,程序员去拿给项目经理进行审阅,项目经理提出修改意见,程序员A下去修改。程序员A在修改前先将v1版本进行备份,修改后获得v2版本,程序员A再去拿给项目经理审阅,项目经理再次提出修改意见,程序员A再次将v2版备份后,修改获得了v3版本。项目经理看了v3版本后,认为程序员A修改的v3版本还不如之前的v2版本,因此让程序员B在v2版本的基础之上,修改获得了v3.2版本,项目经理最终决定采用v3.2版本。

上述过程中,修改、保存每个版本过程中的操作,实际上就是在进行版本管理。

图1.1 版本管理的过程

git可以实现对项目代码进行版本管理,是一款企业级的多人协同操作软件。通过gitee可以实现对代码的托管,人们可以向指定的仓库上传、修改和删除指定的代码,每一步操作都强行写"日志",以便追踪特定仓库的修改记录。在项目代码不断进行完善的过程中,产生的不同版本的项目代码,都可以在git的远程仓库中得以保存,每当项目代码发生改变,通过将修改后的代码上传至远程仓库,实现新版本的记录。

1.2 git三板斧 

准备工作 -- 在git上创建远程仓库并克隆到本地

  • 远程仓库的创建

登录gitee网站,点击右上角的+,选择新建仓库,自定义仓库名、仓库介绍等内容后,点击创建,这样就在远程创建了代码仓库。

注意这里的添加.gitignore选项,是指引入忽略黑名单,将指定后缀名的文件自动屏蔽,使垃圾文件不会被上传至远程仓库。这里我们在.gitignore选项中选择C++,其中就包含了生成C++可执行文件过程中常见的应当被加入黑名单的文件的后缀名。

一般而言,只需要上传.c/.cpp、.h文件即可。

图1.2 在远程创建仓库
  •  将远程仓库克隆到近端

在进行这项工作之前,我们首先检查自己的Linux系统下面是否安装了git,检查方法为输入指令:git --version,这条指令的功能是输出当前环境下git的版本,如果输出成功(如图1.3),那么表示git已经安装,如果没有安装git,则需要通过指令yum -y install git来安装git

图1.3 git的版本查看与安装

将远端仓库克隆到近端的指令:git clone [远端仓库链接]

这一步会提示我们输入用户名和密码,我们只需要输入注册gitee账号时使用的用户名和密码即可。执行完git clone指令后,我们通过ll,可以看到远端仓库已经被拉取到了近端。

图1.4 拉取远程仓库到近端

第一板斧:git add [文件名]  -- 将用git管理的文件告知git

如图1.5所示,我们希望将文件test1.cpp传入远程仓库,首先应当让git知道test1.cpp要被git管理,那么应当执行指令git add test1.cpp。

在实际项目中。我们可能会失误add,如果想撤销对某个文件的add,指令为:

  • git reset HEAD -- 撤销全部文件的add操作
  • git reset HEAD [文件名] -- 撤销对指定文件的add
图1.5 git add和git reset操作

第二板斧:git commit  --  提交改动到本地

语法:git commit -m "日志信息"

注意,这里的日志信息不可以省略,修改仓库必须要记录对应的修改日志。如图1.6所示,将test1.cpp文件提交改动到本地,记录日志信息包括进行修改操作的用户(zhang)和修改仓库的时间(2023.06.18)。如果我们希望撤销git commit操作,指令为:git reset --soft HEAD^

图1.6 git commit操作

第三板斧:git push -- 将修改同步到远程仓库

如图1.7所示,使用git push指令,输入用户名和密码之后,到远程仓库中,查看发现,test1.cpp被成功提交,相应的日志信息也得以被记录。

图1.7 git push
图1.8 远程仓库

1.3 git使用中的其他问题

 (1) git log查看提交记录

图1.9 git log查看提交日志

 (2) .gitignore

 .gitignore为黑名单文件,用于屏蔽指定后缀名的文件为黑名单文件,禁止特定的文件被同步到远程仓库。使用vim打开.gitignore文件,可以对黑名单文件进行设置。

图1.10 gitignore文件

(3) git push无法提交文件的问题

如果我们的仓库在近端和远端不同步(在Linux和Windows下都对仓库进行了操作),那么提交文件可能会失败,这是只要无脑git pull即可。

git pull极有可能会出现警告信息,我们不用在意,只需要shift + : 进入底行模式,然后wq!强制退出即可。这时再次git push,提交成功。

(4) 在近端操控远程仓库删除文件

  • 指令:git rm -f [文件名] 

注意,不可以省略git,直接rm,这样会造成近端删除了文件,而远端仓库没有删除的问题。

二. 使用gdb调试代码 

2.1 生成带有调试信息的可执行程序

我们默认使用gcc/g++编译源文件生成的可执行程序,是Release版本,不带有调试信息。使用g++,编译源文件test.cpp(见代码2.1),生成可执行程序mytest.exe。

使用指令readelf -S mytest.exe | grep -i debug,获取可执行文件中的调试信息,看到没有捕捉到任何含有debug的内容(见图2.1)。

图2.1 获取Release版本可执行程序的调试信息

代码2.1:test.cpp文件 

1 #include<iostream>
  2 
  3 int AddToTop(int top)
  4 {
  5     int sum = 0;
  6     for(int i = 0; i <= top; ++i)
  7     {
  8         sum += i;                                                                                                                                                                                                                 
  9     }
 10 
 11     return sum;
 12 }
 13 
 14 int main()
 15 {
 16     int top = 100;
 17 
 18     int res = AddToTop(top);
 19 
 20     printf("res = %d\n", res);
 21 
 22     return 0;
 23 }

如果想要程序能够调试,就必须生成Debug版本,在gcc/g++编译程序时添加-g选项,就能够生成Debug版本的可执行程序。如图2.2所示,生成debug版本的可执行程序mytest-debug.exe,获取其内部的调试信息,可见有内容输出。

图2.2 编译生成debug版本可执行程序并获取调试信息

2.2 gdb调试代码的方法

还是以代码2.1的程序为例,讲解如何使用gdb调试代码。

  • gdb [文件名] -- 启动调试、quit -- 退出gdb
图2.3 启动和退出gdb调试
  •  list [行号] -- 从指定行开始显示代码

输入list 0后,持续按回车键,可以显示出全部代码,因为gdb会记录最近一条的指令,如果接下来要执行的指令没有改变,可以直接回车执行。

图2.4 list和回车键显示全部代码

 

  • b [行号] -- 在指定行打断点。
  • b [行号] if expr -- 设置条件断点
  • info b -- 显示断点信息(包含断点编号、是否打开/禁用、断点位置等)。
  • d [断点编号] -- 删除指定编号的断点(不是指定行号)。
图2.5 打断点、显示断点信息与删除断点
  • disable [断点编号] -- 禁止使用某断点
  • enable [断点编号] -- 启用某断点
图2.6 断点的禁用和启用
  •  run ( r ) -- 开始调试,如果没有断点直接运行到程序结束,有断点就运行到第一个断点位置

注意:如果多次连续执行r指令,并不是执行到下一处断点,而是重写开始调试。

图2.7 run(r)指令
  • next (n) -- 逐过程执行,相对于VS下的F10
  • step (s) -- 逐语句执行,相当于VS下的F11
  • continue (n) -- 运行至下一断点处
图2.8 next、step和continue指令
  •  bt -- 查看调用堆栈

最上层的调用堆栈,为当前函数的调用堆栈。

图2.9 bt指令查看调用堆栈
  • p [变量名] -- 查看指定变量的值
  • display [变量名] -- 长显示指定变量(之后每次执行都会显示变量的值)
  • undisplay [长显示变量的编号] -- 删除指定编号变量的长显示
图2.10 变量值的显示
  • finish -- 执行完当前执行流所在函数就停下来
  • until (u) -- 执行到指定行(不宜跨函数调用)
图2.11 finish和until指令

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

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

相关文章

【人工智能】— 神经网络、前向传播、反向传播、梯度下降、局部最小值、多层前馈网络、缓解过拟合的策略

【人工智能】— 神经网络、前向传播、反向传播 前向传播反向传播梯度下降局部最小值多层前馈网络表示能力多层前馈网络局限缓解过拟合的策略 前向传播和反向传播都是神经网络训练中常用的重要算法。 前向传播是指将输入数据从输入层开始经过一系列的权重矩阵和激活函数的计算后…

计算机网络408大题(2009-2019)

必备结构 TCP报文段结构 IP数据报结构 2009年 考察点&#xff1a;子网划分、路由表、路由聚合 2010年 考察点&#xff1a;CSMA/CD协议的相关计算 2011年 考察点&#xff1a;以太网帧格式、IP分组格式、IP地址和MAC地址、ARP协议、HTTP/1.1持续的非流水方式 在转发过程中&am…

Jupyter中使用Pyecharts绘制地图

背景&#xff1a;根据各省频率绘制地图 根据各省频率绘制地图&#xff0c;可以使用 Pyecharts 绘制。下面是详细的步骤&#xff1a; 1、安装 Pyecharts&#xff1a;可以通过 !pip install pyecharts 命令安装。 2、导入相关库 import pandas as pd from pyecharts import o…

设计模式之抽象工厂模式笔记

设计模式之抽象工厂模式笔记 说明Abstract Factory(抽象工厂)目录UML抽象工厂示例类图甜品抽象类甜品提拉米苏类甜品抹茶慕斯类 咖啡抽象类美式咖啡类拿铁咖啡类 甜品工厂接口美式风味的甜品工厂意大利风味的甜品工厂 测试类模式扩展 说明 记录下学习设计模式-抽象工厂模式的写…

SSMP整合案例(2) Spring Boot整合Lombok简化实体类开发

好啊 接着我们上文SSMP整合案例(1) 构建 Spring Boot Vue MySql项目环境 我们继续 接下来 我们要在java项目中 建立出数据库表对应的实体类 我们还是先看看自己上文中 创建的这个 book表 其中四个字段 主键id 数字枚举类型的type 字符串类型name 字符串类型 description 我们…

【设计模式与范式:总结型】74 | 总结回顾23种经典设计模式的原理、背后的思想、应用场景等

到今天为止&#xff0c;23 种经典的设计模式已经全部讲完了。咱们整个专栏也完成了 3/4&#xff0c;马上就要进入实战环节了。在进入新模块的学习之前&#xff0c;我照例带你做一下总结回顾。23 种经典设计模式共分为 3 种类型&#xff0c;分别是创建型、结构型和行为型。今天&…

Floyd 判圈算法(Floyd Cycle Detection Algorithm)

Floyd 判圈算法(Floyd Cycle Detection Algorithm) 前言 Floyd判圈算法属于对指针操作的算法&#xff0c;它一般需要且仅需要两个指针&#xff0c;通过设定不同的指针移动速度&#xff0c;来判定链表或有限状态机中是否存在环。人为规定移动较快的指针称为快速指针(fast poin…

Java官方笔记9Lambda表达式

Lambda Expression 有了Lambda Expression&#xff0c;就不用再写anonymous classes。 写Lambda&#xff0c;首先要找到它的类型。 There is a restriction on the type of a lambda expression: it has to be a functional interface. 函数接口&#xff0c;只有1个抽象方法的接…

Vue中v-text、v-html、v-on的基本语法(二)

文章目录 前言一、vue中data属性定义对象、数组相关数据二、v-text、v-html指令使用三、v-on基本指令使用(一)四、v-on指令基本使用(二)之在函数中获取vue实例本身this五、v-on指令基本使用(二)之在函数中传递参数六、v-on指令基本使用(二)之简化写法绑定函数和事件定义的两种写…

从零搭建一台基于ROS的自动驾驶车-----2.运动控制

系列文章目录 北科天绘 16线3维激光雷达开发教程 基于Rplidar二维雷达使用Hector_SLAM算法在ROS中建图 Nvidia Jetson Nano学习笔记–串口通信 Nvidia Jetson Nano学习笔记–使用C语言实现GPIO 输入输出 Autolabor ROS机器人教程 从零搭建一台基于ROS的自动驾驶车-----1.整体介…

Unreal 5 实现丧尸伤害和死亡

这一篇主要是实现玩家攻击丧尸可以造成伤害和自身血量为零时&#xff0c;丧尸可以死亡。丧尸也可以对玩家造成伤害&#xff0c;有攻击范围的判定。 这一篇的功能实现有四个功能&#xff1a; 丧尸被攻击掉血丧尸死亡处理玩家被攻击掉血玩家死亡处理 丧尸被攻击掉血 子弹的修改…

C语言内存操作函数,memcpy的使用和模拟实现,memmove的使用和模拟实现,memcmp的使用,memset的使用。

1.memcpy 函数原型&#xff1a; void *memcpy( void *dest, const void *src, size_t count );void *dest 目标数据首元素地址const void *src 源数据(需要拷贝过去的数据)size_t count 需要拷贝数据的字节大小void *memcpy 拷贝结束后&#xff0c;返回目标数据的起始地址 函…

【简单的图像信息展示应用程序】PYQt5

写在前面的话 这段代码的作用是创建一个简单的图像信息展示应用程序&#xff0c;用户可以点击按钮查看特定文件夹中图像的文件名、大小&#xff0c;并通过查看按钮查看图像。请注意&#xff0c;文件夹路径需要根据实际情况进行修改。 代码讲解 这段代码是使用PyQt5库创建一个…

特征选择:过滤法,嵌入法,包装法

特征选择时首先要去除冗余特征。 它是由其他其他的特征中推演出来的。比如&#xff0c;一个球的体积&#xff0c;那么半径这个特征就是冗余的&#xff0c;因为我们可以由球的体积推算半径。冗余特征在很多时候都是不起作用的 过滤法 过滤方法通常用作预处理步骤&#xff0c;特…

c++11 标准模板(STL)(std::basic_ios)(三)

定义于头文件 <ios> template< class CharT, class Traits std::char_traits<CharT> > class basic_ios : public std::ios_base 类 std::basic_ios 提供设施&#xff0c;以对拥有 std::basic_streambuf 接口的对象赋予接口。数个 std::basic_ios…

2013年全国硕士研究生入学统一考试管理类专业学位联考英语(二)试题

2013考研英语&#xff08;二&#xff09;真题 Section I Use of English Directions: Read the following text. Choose the best word(s) for each numbered blank and mark A, B, C or D on ANSWER SHEET 1. (10 points) Given the advantages of electronic money, you mi…

某农业大学数据结构A-第2周作业

1.两个顺序表集合的差集 【问题描述】两个顺序表集合的差集 【样例输入】 25 33 57 60 48 9 13 0 12 50 23 60 4 34 25 13 0 【样例输出】 33 57 48 9 【注意】0代表输入的结束&#xff1b;可以用C风格实现&#xff0c;也可以用C风格实现&#xff0c;两种风格大家均需掌握 #…

Kafka架构

5.kafka系统的架构 5.1主题topic和分区partition topic Kafka中存储数据的逻辑分类&#xff1b;你可以理解为数据库中“表”的概念&#xff1b; 比如&#xff0c;将app端日志、微信小程序端日志、业务库订单表数据分别放入不同的topic partition分区&#xff08;提升kafka吞…

【Proteus仿真】常用器件名称

前言 我常用的仿真器件加上收集的&#xff0c;基于Proteus8.13版本。以下分为两部分&#xff0c;内容都一样&#xff0c;一部分是纯文字&#xff0c;一部分是文字图片&#xff0c;方便快速获取和定位。等积累了更多的器件后会在更新的。搜索时可以用CtrlF快速查找。 命名的规则…

管理类联考——英语二——技巧篇——写作——B节——议论文——必备替换句型

议论文必备替换句型 (一&#xff09;表示很明显/众所周知的句型 It is obvious thatIt is clear thatIt is apparent thatIt is evident thatlt is self-evident thatIt is manifest thatIt is well-knownIt is known to all thatIt is widely-accepted thatIt is crystal-cl…