1. 版本控制器Git
1.1 Git的简史
Git 的历史可以追溯到 2005 年1。当时 Linux 内核项目的开发团队一直使用 BitKeeper 进行版本管理,但由于一位 Linux 开发成员写了一个连接 BitKeeper 仓库的外挂,BitMover 公司决定中止 Linux 免费使用 BitKeeper 的授权1。Linux 团队与 BitMover 磋商无果后,Linux 内核的创始人 Linus Torvalds 决定开发自己的版本管理系统1。
2005 年 4 月 3 日,Linus Torvalds 正式开始开发 Git3。仅仅四天后,他就发布了 Git 的第一个可用版本(0.1),这个初始版本包含了 Git 的核心功能3。在接下来的几周内,Linus 和其他早期贡献者对 Git 进行了快速迭代和改进,逐步完善了其稳定性和功能3。
Git 的设计目标是实现分布式开发,解决现有集中式版本控制工具(如 CVS、Subversion)性能低下、分支管理不灵活以及依赖中央服务器等问题3。它具有所有行为都要校验、操作必须在毫秒级内完成等特性1。
随着开发的深入,Git 逐渐被大众接受1。2008 年 2 月,为 Git 提供托管服务的 GitHub 上线,进一步推动了 Git 的广泛应用1。此后,Git 成为了世界上最流行的分布式版本控制系统之一,被大量的初创企业、集体企业和跨国公司用于维护软件项目的源代码2。
1.2 Git的操作(以下操作是在Centos环境进行的)
1.2.1 安装 git
yum install git
1.2.2 在gitee创建项目
登录gitee创建仓库在创建好的项目页面中复制项目的链接, 以备接下来进行下载
下载项目到本地
创建好一个放置代码的目录
git clone [url]
这里的url就是刚刚创建好的项目链接
1.2.3 git add
git add
命令是一个非常重要的操作,它的主要作用是将工作目录中修改过的文件或新建的文件,添加到暂存区(也称为 “索引”,英文为index
),以便后续提交到版本库中。
git add [文件名]
1.2.4 git commit
git commit
命令用于将暂存区(staging area
,也叫索引 index
)的内容提交到本地版本库,形成一个新的提交对象。
git commit -m "xxx"
提交的时候应该注明提交日记, 描述改动的详细内容.
1.2.5 git push
git push
命令用于将本地版本库中分支的提交推送到远程仓库,使得本地的代码变更可以与团队成员共享,或者备份到远程服务器上。
git push
需要填⼊用户名密码. 同步成功后, 刷新 gitee 页⾯就能看到代码改动了.
git提交的时候,只会提交变化的部分!
1.2.6 git pull
git pull
是一个常用命令,它主要用于从远程仓库获取最新代码,并自动尝试将获取到的代码合并到本地当前分支 ,在团队协作和多设备开发场景中发挥着重要作用。
git pull [文件名]
1.2.7 其他
git log //查看仓库的提交历史记录。
git status
显示工作目录、暂存区(也称为 “索引”)和本地仓库之间的状态差异。它能直观地告诉你哪些文件被修改、哪些被添加到暂存区、哪些是未被跟踪的新文件,帮助你在提交代码前了解当前工作进度。
.ignore
.gitignore
是一个至关重要的配置文件,用于指定 Git 应该忽略哪些文件或目录,避免它们被纳入版本控制。这在实际开发中非常实用,比如可以忽略自动生成的文件、编译产物、日志文件等无需版本管理的内容。
2. 调试器 - gdb/cgdb使用
2.1 样例代码
// 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;
}
2.2 预备
2.3 常见使用






命令 | 作⽤ | 样例 |
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 test.c: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 X⾏号 | 执⾏到指定⾏号 | until 20 |
backtrace/bt | 查看当前执⾏栈的各级函数调⽤及参数 | backtrace |
info/i locals | 查看当前栈帧的局部变量值 | info locals |
quit | 退出GDB调试器 | quit |
2.4 常见技巧
安装cgdb:上⾯的基本调试还是⿇烦,虽然是⿊屏,但是还是想看到代码调试推荐安装cgdb:Ubuntu: sudo apt-get install -y cgdbCentos: sudo yum install -y cgdb
2-4-1 watch

2-4-2 set var确定问题原因
2-4-3 条件断点
注意:条件断点添加常⻅两种⽅式:1. 新增 2. 给已有断点追加注意两者的语法有区别,不要写错了。新增: b 行号/⽂件名:行号/函数名 if i == 30(条件)给已有断点追加:condition 2 i==30, 其中2是已有断点编号,没有if