【Linux学习笔记】开发工具git和gbd和cgbd的介绍和使用

news2025/4/11 4:35:29

【Linux学习笔记】开发工具git和gbd和cgbd的介绍和使用

在这里插入图片描述

🔥个人主页大白的编程日记

🔥专栏Linux学习笔记


文章目录

前言

哈喽,各位小伙伴大家好!上期我们讲了Makefile,今天我们讲的是git和gbd的介绍和使用。话不多说,我们进入正题!向大厂冲锋!
在这里插入图片描述

一. 版本控制器Git

  • 关于Git的更详细讲解请移步:Git学习目录

不知道你工作或学习时,有没有遇到这样的情况:我们在编写各种文档时,为了防止文档丢失,更改失误,失误后能恢复到原来的版本,不得不复制出一个副本,比如;
“报告-v1”
“报告-v2”
“报告-v3”
“报告-确定版”
“报告-最终版”
“报告-究极进化版”

每个版本有各自的内容,但最终会只有一份报告需要被我们使用。
但在此之前的工作都需要这些不同版本的报告,于是每次都是复制粘贴副本,产出的文件就越来越多,文件多不是问题,问题是:随着版本数量的不断增多,你还记得这些版本各自都是修改了什么吗?
文档如此,我们写的项目代码,也是存在这个问题的!!

1.1版本控制器

  • 为了能够更方便我们管理这些不同版本的文件,便有了版本控制器。所谓的版本控制器,就是能让你了解到一个文件的历史,以及它的发展过程的系统。通俗的讲就是一个可以记录工程的每一次改动和版本迭代的一个管理系统,同时也方便多人协同作业。

目前最主流的版本控制器就是Git。Git可以控制电脑上所有格式的文件,例如doc、excel、dwg、dgn、rvt等等。对于我们开发人员来说,Git最重要的就是可以帮助我们管理软件开发项目中的源代码文件!

1.2 git 简史

同生活中的许多伟大事物一样,Git诞生于一个极富纷争大举创新的年代。
Linux内核开源项目有着为数众多的参与者。绝大多数的Linux内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991一2002年间)。到2002年,整个项目组开始启用一个专有的分布式版本控制系统BitKeeper来管理和维护代码。
到了2005年,开发BitKeeper的商业公司同Linux内核开源社区的合作关系结束,他们收回了Linux内核社区免费使用BitKeeper的权力。这就迫使Linux开源社区(特别是Linux的缔造者Linus
Torvalds)基于使用BitKeeper时的经验教训,开发出自己的版本系统。他们对新的系统制订了若干 目标:

  • 速度
  • 简单的设计
    对非线性开发模式的强力支持(允许成千上万个并行开发的分支)
  • 完全分布式
  • 有能力高效管理类似Linux内核一样的超大规模项目(速度和数据量)
    自诞生于2005年以来,Git日臻成熟完善,在高度易用的同时,仍然保留着初期设定的目标。它的速度飞快,极其适合管理大项目,有着令人难以置信的非线性分支管理系统。

1.3 安装git

 yum install git/apt install git

6-4在Github创建项目
注册账号
这个比较简单,参考着官网提示即可.需要进行邮箱校验
创建项目

  1. 登陆成功后,进入个人主页,点击左下方的Newrepository按钮新建项目
  2. 然后跳转到的新页面中输入项目名称(注意,名称不能重复,系统会自动校验,校验过程可能会花费几秒钟).校验完毕后,点击下方的Createrepository按钮确认创建
  3. 在创建好的项目页面中复制项目的链接,以备接下来进行下载,
    在这里插入图片描述
    下载项目到本地
    创建好一个放置代码的目录。
 git clone [url]

这里的url就是刚刚建立好的项目的链接.

1.4 三板斧

  1. git add
    将代码放到刚才下载好的目录中
git add [⽂件名]

将需要用git管理的文件告知 git

  1. git commit
    提交改动到本地
git commit -m "XXX"

最后的"."表示当前目录
提交的时候应该注明提交日志,描述改动的详细内容,

  1. git push
    同步到远端服务器上
git push

需要填入用户名密码.同步成功后,刷新Github页面就能看到代码改动了.
配置免密码提交:配置免密码提交

  1. 其他
  • git log/status/pull

  • ignore

  • 首次使用问题,需要现场看

二. 调试器-gdb/cgdb使用

 // mycmd.c
 #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;
 }

7-2预备

  • 程序的发布方式有两种,debug模式和release模式,Linuxgcc/g++出来的二进制程序,默认是release模式。
  • 要使用gdb调试,必须在源代码生成二进制程序的时候,加上-g选项,如果没有添加,程序无法被编译
$ gcc mycmd.c - o mycmd - g选项,如果没有添加,程序⽆法被
# 默认模式,不⽀持调试
$ file mycmd
mycmd : ELF 64 - bit LSB shared object, x86 - 64, version 1 (SYSV), dynamically
linked, interpreter / lib64 / ld - linux - x86 - 64.so.2,
BuildID[sha1] = 82f5cbaada10a9987d9f325384861a88d278b160, for GNU / Linux
3.2.0, not stripped
$ gcc mycmd.c - o mycmd - g
# debug模式
$ file mycmd
mycmd : ELF 64 - bit LSB shared object, x86 - 64, version 1 (SYSV), dynamically
linked, interpreter / lib64 / ld - linux - x86 - 64.so.2,
BuildID[sha1] = 3d5a2317809ef86c7827e9199cfefa622e3c187f, for GNU / Linux
3.2.0,
with debug_info, not stripped

2.1常见使用

开始:gdb binFile
退出:ctrl + dquit调试命令

命令作用样例
list/l显示源代码,从上次位置开始,每次列出10行list/l 10
list/l 函数名列出指定函数的源代码list/l main
list/l 文件名:行号列出指定文件的源代码list/l mycmd.c:1
r/run从程序开始连续执行run
n/next单步执行,不进入函数内部next
s/step单步执行,进入函数内部step
break/b [文件名:]行号在指定行号设置断点break 10
break/b 函数名在函数开头设置断点break main
info break/b查看当前所有断点的信息info break
finish执行到当前函数返回,然后停止finish
print/p 表达式打印表达式的值print start+end
p 变量打印指定变量的值p x
set var 变量=值修改变量的值set var i=10
continue/c从当前位置开始连续执行程序continue
delete/d breakpoints删除所有断点delete breakpoints
delete/d breakpoints n删除序号为n的断点delete breakpoints 1
disable breakpoints禁用所有断点disable breakpoints
enable breakpoints启用所有断点enable breakpoints
info/i breakpoints查看当前设置的断点列表info breakpoints
display 变量名跟踪显示指定变量的值(每次停止时)display x
undisplay 编号取消对指定编号的变量的跟踪显示undisplay 1
until 行号执行到指定行号until 20
backtrace/bt查看当前执行栈的各级函数调用及参数backtrace
info/i locals查看当前栈帧的局部变量值info locals
quit退出GDB调试器quit

2.2 常见技巧

2.2.1 watch

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

  • 📌 注意:

    如果你有一些变量不应该修改,但是你怀疑它修改导致了问题,你可以watch它,如果变化了,就会通知你。

2.2.2 setvar确定问题原因

更改一下标志位,假设我们想得到+ -result

 // mycmd.c
 #include <stdio.h>
 int flag = 0; // 
故意错误
 
//int flag = -1; 
//int flag = 1;
 int Sum(int s, int e)
 {
 int result = 0;
 for(int i = s; i <= e; i++)
 {
 result += i;
 }
 return result*flag;
 }
 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;
 }
 (gdb) l main
 15        
16            
17        
18        
19        
}
 return result*flag;
 int main()
 20        
21            
22            
23            
24            
{
 int start = 1;
 int end = 100;
 printf("I will begin\n");
 int n = Sum(start, end);
 (gdb) b 24
 Breakpoint 1 at 0x11ca: file mycmd.c, line 24.
 (gdb) r
 Starting program: /home/whb/test/test/mycmd 
I will begin
Breakpoint 1, main () at mycmd.c:24
 24            
int n = Sum(start, end);
 (gdb) n
 25            
printf("running done, result is: [%d-%d]=%d\n", start, end, 
n);
 (gdb) n
 running done, result is: [1-100]=0  
26            
return 0;
 # 
这⾥结果为什么是
0(gdb) r
 The program being debugged has been started already.
 Start it from the beginning? (y or n) y
 Starting program: /home/whb/test/test/mycmd 
I will begin
 Breakpoint 1, main () at mycmd.c:24
 24            
int n = Sum(start, end);
 (gdb) s
 Sum (s=32767, e=-7136) at mycmd.c:9
 9        
{
 (gdb) n
 10            
(gdb) n
 11            
(gdb) 
13                
(gdb) 
11            
(gdb) 
13                
int result = 0;
 for(int i = s; i <= e; i++)
 result += i;
 for(int i = s; i <= e; i++)
 result += i;
 (gdb) until 14
 Sum (s=1, e=100) at mycmd.c:16
 16            
return result*flag;
 (gdb) p result
 $1 = 5050
 (gdb) p flag
 $2 = 0
 (gdb) set var flag=1   
# 
更改
flag
的值,确认是否是它的原因
(gdb) p flag
 $3 = 1
 (gdb) n
 17        
}
 (gdb) n
 main () at mycmd.c:2
 25            
printf("running done, result is: [%d-%d]=%d\n", start, end, 
n);
 (gdb) n
 running done, result is: [1-100]=5050  
26            
return 0;
2.2.3 条件断点

添加条件断点

(gdb) l main
 int main()
 {
 int start = 1;
 int end = 100;
 printf("I will begin\n");
 int n = Sum(start, end);
(gdb)b 20
Breakpoint 1 at 0x11c3: file mycmd.c, line 20.
(gdb)r
Starting program : / home / whb / test / test / mycmd
I will begin
Breakpoint 1, main() at mycmd.c : 20
20
int n = Sum(start, end);
(gdb)s
Sum(s = 32767, e = -7136) at mycmd.c:5
5
{
(gdb)n
6
(gdb)n
7
(gdb)n
9
(gdb)
7
(gdb)
9
(gdb)
7
(gdb)
9
(gdb)
7
(gdb)
b 9
int result = 0;
for (int i = s; i <= e; i++)
result += i;
for (int i = s; i <= e; i++)
result += i;
for (int i = s; i <= e; i++)
result += i;
for (int i = s; i <= e; i++)
Breakpoint 2 at 0x555555555186: file mycmd.c, line 9.
(gdb)info b
Num
Type
1
breakpoint
Disp Enb Address
What
keep y   0x00005555555551c3 in main at mycmd.c:20
breakpoint already hit 1 time
2
breakpoint
keep y
(gdb) n
0x0000555555555186
Breakpoint 2, Sum(s = 1, e = 100) at mycmd.c:9
9
result += i;
(gdb)n
7
(gdb)n
for (int i = s; i <= e; i++)
    Breakpoint 2, Sum(s = 1, e = 100) at mycmd.c:9
    9
    result += i;
(gdb)
condition
(gdb) info b
Num
Type
2
i ==30
 i ==
Disp Enb Address
in Sum at mycmd.c:9
30
What
breakpoint
keep y
1
Ox00005555555551c3 in main at mycmd.c:20
breakpoint already hit 1 time
breakpoint
keep y
2
Ox0000555555555186 in Sum at mycmd.c:9
stop only if i==30
breakpoint already hit 2 times
(gdb) n
7
for(int i = S; i <= e; i++)
(gdb) n
9
result += i;
(gdb) c
Continuing.
Breakpoint 2, Sum (s=1, e=1oo) at mycmd.c:9
9
result += i;
(gdb) p_
$1=30
(gdb) p result
$2=435

给已经存在的端点新增条件

📌 注意:

  • 条件断点添加常见两种方式:1. 新增 2. 给已有断点追加
  • 注意两者的语法有区别,不要写错了。
  • 新增:b 行号/文件名:行号/函数名 if i == 30 (条件)
  • 给已有断点追加:condition 2 i == 30,其中2是已有断点编号,没有if

后言

这就是开发工具git和gbd和cgbd的介绍和使用。大家自己好好消化!今天就分享到这! 感谢各位的耐心垂阅!咱们下期见!拜拜~

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

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

相关文章

php的高速缓存

部署方法 在我们安装的nginx中默认不支持memc和srcache功能&#xff0c;需要借助第三方模块来让nginx支持此功能。 tar zxf srcache-nginx-module-0.33.tar.gz tar zxf memc-nginx-module-0.20.tar.gz 下载这俩个模块&#xff0c;然后编译安装的时候加进去 编译安装完成之后…

Real-Time Anomaly Detection of Network Traffic Basedon CNN

1知识点补充 边缘计算模型 成为一种新的分布式数据处理方式&#xff0c;通过靠近数据侧&#xff0c;及时响应用户的计算请求&#xff0c;降低数据传输的网络延迟。 边缘节点是边缘计算架构中最基础的物理或逻辑单元&#xff0c;指位于网络边缘&#xff08;靠近数据源或用户&a…

RHCSA LINUX系统文件管理

一.7种文件类型 注意&#xff1a;Linux系统文件名的后缀只是为了方便用户识别文件类型 Linux系统设计哲学&#xff1a;一切皆文件 1.使用 “ls -l” 命令查看到的第一个字符&#xff0c;对应不同文件类型及说明如下&#xff1a; ①“-”&#xff1a;普通文件&#xff0c;类…

AQUA爱克泳池设备入驻济南校园,以品质筑牢游泳教育安全防线

在推进校园体育教育高质量发展的时代背景下&#xff0c;游泳作为一项兼具运动价值与生存技能的重要课程&#xff0c;正被越来越多的学校纳入教学体系。泳池作为开展游泳教学与运动的关键设施&#xff0c;其配套泳池设备的先进性与安全性愈发受到重视。作为泳池水处理设备行业的…

基于CNN实现电力负荷多变量时序预测(PyTorch版)

前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对抗网络、门控循环单元、长短期记…

网络空间安全(50)JavaScript基础语法

一、变量声明 ①var: 早期的变量声明方式&#xff0c;函数作用域。 ②let: 块级作用域&#xff0c;推荐在现代 JavaScript 中使用。 ③const: 块级作用域&#xff0c;用于声明常量&#xff0c;值不可变。 var name "Alice"; let age 30; const PI 3.14159; 二、数…

深入理解二叉树、B树与B+树:原理、应用与实现

文章目录 引言一、二叉树&#xff1a;基础而强大的结构基本概念特性分析Java实现应用场景 二、B树&#xff1a;适合外存的多路平衡树基本概念关键特性查询流程示例Java简化实现典型应用 三、B树&#xff1a;数据库索引的首选核心改进优势分析范围查询示例Java简化实现实际应用 …

mysql对表,数据,索引的操作sql

对表的操作 新建表 创建一个名为rwh_test的表&#xff0c;id为主键自增 -- 新建表 CREATE TABLE rwh_test(id int NOT NULL auto_increment PRIMARY KEY COMMENT 主键id,username VARCHAR(20) DEFAULT NULL COMMENT 用户名,age int DEFAULT NULL COMMENT 年龄,create_date d…

verl单机多卡与多机多卡使用经验总结

文章目录 I. 前言II. SFT2.1 单机多卡2.2 多机多卡 III. RL (GRPO)3.1 单机多卡3.2 多机多卡2.3 模型转换 I. 前言 在上一篇文章verl&#xff1a;一个集SFT与RL于一体的灵活大模型post-training框架 (快速入门) 中&#xff0c;初步探讨了verl框架的基础使用方法。在实际工业级…

胶铁一体化产品介绍

•一体化结构特点介绍 胶框/铁框一体化技术最早在韩国采用&#xff0c;07年以来由于要求背光越做越薄。在采用0.4mm及以下厚度的LGP时&#xff0c;胶框及背光就会变得异常软,胶框不易组装&#xff0c;铁框松动等问题。 由于胶框和铁框是紧紧粘合在一起的&#xff0c;这正可以解…

蓝桥杯刷题记录【并查集001】(2024)

主要内容&#xff1a;并查集 并查集 并查集的题目感觉大部分都是模板题&#xff0c;上板子&#xff01;&#xff01; class UnionFind:def __init__(self, n):self.pa list(range(n))self.size [1]*n self.cnt ndef find(self, x):if self.pa[x] ! x:self.pa[x] self.fi…

基于BusyBox构建ISO镜像

1. 准备 CentOS 7.9 3.10.0-957.el7.x86_64VMware Workstation 建议&#xff1a;系统内核<3.10.0 使用busybox < 1.33.2版本 2. 安装busybox # 安装依赖 yum install syslinux xorriso kernel-devel kernel-headers glibc-static ncurses-devel -y# 下载 wget https://…

Multisim14.3的安装步骤

Multisim14.3的安装步骤 安装包链接 右击Install.exe&#xff0c;以管理员身份运行 激活前关闭杀毒软件 右击&#xff0c;以管理员身份运行 依次右键【Base Edition】、【Full Edition】、【Power ProEdition】、【Full Edition】、【Power ProEdition】&#xff0c;选择【…

搭建环境-opencv-qt

CMake Error at cmake/OpenCVCompilerOptimizations.cmake:647 (message): Compiler doesnt support baseline optimization flags: Call Stack (most recent call first): cmake/OpenCVCompilerOptions.cmake:344 (ocv_compiler_optimization_options) CMakeList 解决方…

SparkAudio 是什么,和其他的同类 TTS 模型相比有什么优势

欢迎来到涛涛聊AI 在当今数字化时代&#xff0c;音频处理技术已经成为人们生活和工作中不可或缺的一部分。无论是制作有声读物、开发语音助手&#xff0c;还是进行影视配音&#xff0c;我们都离不开高效、精准的音频处理工具。然而&#xff0c;传统的音频处理技术往往存在诸多…

Java 8 到 Java 21 系列之 Optional 类型:优雅地处理空值(Java 8)

Java 8 到 Java 21 系列之 Optional 类型&#xff1a;优雅地处理空值&#xff08;Java 8&#xff09; 系列目录 Java8 到 Java21 系列之 Lambda 表达式&#xff1a;函数式编程的开端&#xff08;Java 8&#xff09;Java 8 到 Java 21 系列之 Stream API&#xff1a;数据处理的…

py文件打包为exe可执行文件,涉及mysql连接失败

py文件打包为exe可执行文件&#xff0c;涉及mysql连接失败 项目场景&#xff1a;使用flask框架封装算法接口&#xff0c;并使用pyinstaller打包为exe文件。使用pyinstaller打包多文件的场景&#xff0c;需要自己手动去.spec文件中添加其他文件&#xff0c;推荐使用auto-py-to-e…

Ubuntu 系统 Docker 中搭建 CUDA cuDNN 开发环境

CUDA 是 NVIDIA 推出的并行计算平台和编程模型&#xff0c;利用 GPU 多核心架构加速计算任务&#xff0c;广泛应用于深度学习、科学计算等领域。cuDNN 是基于 CUDA 的深度神经网络加速库&#xff0c;为深度学习框架提供高效卷积、池化等操作的优化实现&#xff0c;提升模型训练…

win10彻底让图标不显示在工具栏

关闭需要不显示的软件 打开 例此时我关闭了IDEA的显示 如果说只是隐藏&#xff0c;鼠标拖动一个道理 例QQ 如果说全部显示不隐藏

人脸识别和定位别的签到系统

1、功能 基于人脸识别及定位的宿舍考勤管理小程序 &#xff08;用户&#xff1a;宿舍公告、宿舍考勤查询、宿舍考勤&#xff08;人脸识别、gps 定 位&#xff09;、考勤排行、请假申请 、个人中心 管理员&#xff1a;宿舍管理、宿舍公告管理 学生信息管理、请假审批、发布宿舍…