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