Linux:版本控制器git的简单使用+gdb/cgdb调试器的使用
一,版本控制器git
1.1概念
为了能够更方便我们管理不同版本的文件,便有了版本控制器。所谓的版本控制器,就是能让你 了解到⼀个文件的历史,以及它的发展过程的系统。通俗的讲就是⼀个可以记录工程的每⼀次改动和版本迭代的⼀个管理系统,同时也方便多人协同作业。
目前最主流的版本控制器就是 Git 。Git 可以控制电脑上所有格式的文件,例如 doc、excel、dwg、dgn、rvt等等。对于我们开发人员来说,Git 最重要的就是可以帮助我们管理软件开发项目中的源代码文件。
1.2安装git
我们这里使用的是centos系统,对应的安装命令是:
yum install git
接下来我们可以通过:
git --version
来检验我们的安装是否成功,同时首次注册时需要我们配置我们的gitee账号与邮箱,命令是:(由于github需要科学上网的原因,这里我们不再介绍,如果想要了解可以阅读其他博主的文章)。
git config --global user.name "你的用户名"
git config --global user.email "你的邮箱"
1.3拉取远端仓库与推送代码
1.克隆仓库
在终端中,导航到你想要存放项目的目录,然后使用git clone命令:
git clone <仓库链接>
注意此仓库链接是下图处中的https链接:
2.推送代码
1.添加文件到缓冲区
git add <文件名>
git add .//添加所有更改到缓冲区
2.提交更改到本地仓库
git commit -m "提交说明"//虽然我们可以关闭日志选项,但这里推荐不要关闭
3.推送到远端仓库
git push
如果想要拉取远端仓库的最新更改,可以使用:
git pull
二,调试器gdb/cgdb的使用
//找子集
vector<vector<int>> ans = {};
vector<int> path;
void dfs(vector<int>& nums, int cur) {
ans.push_back(path);
for (int i = cur; i < nums.size(); i++) {
path.push_back(nums[i]);
dfs(nums, i + 1);
path.pop_back();
}
return;
}
vector<vector<int>> subsets(vector<int>& nums) {
dfs(nums, 0);
return ans;
}
int main()
{
vector<int> nums = { 1,2,3 };
vector<vector<int>> ans = subsets(nums);
for (int i = 0; i < ans.size(); i++)
{
for (int j = 0; j < ans[i].size(); j++)
cout << ans[i][j] << ' ';
cout << endl;
}
return 0;
}
2.1预备
程序的发布方式有两种, debug 模式和release 模式, Linux gcc/g++ 出来的二进制程序,默认是release 模式。 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上-g 选项,如果没有添加,程序无法被编译(会显示找不到调试信息):
首次使用cgdb需要安装,安装的命令为:
Ubuntu: sudo apt-get install -y cgdb
Centos: sudo yum install -y cgdb
2.2常见使用
本文中使用的调试器为cgdb(gdb的界面实在让博主痛苦不堪,而cgdb的界面还稍微舒服些,同时二者命令一致,所以对于需要介绍的命令,统一使用cgdb来介绍):
需要注意的是,除了打断点的命令可以跟行号以外,其他的比如删除断点等都需要跟上对应的编号才能执行,比如我要删除24行的断点,我们可以先info b,寻找断点的编号,然后将其删除:
以上命令我们通过图片实操介绍效果并没有多好,需要自行尝试才能了解的更深,我们主要介绍cgdb中类似与vs中监视窗口的功能:watch与setvar
2.3watch
执行时监视一个表达式(如变量)的值。如果监视的表达式在程序运行期间的值发生变化,GDB 会暂停程序的执行,并通知使用者:
这里我们i的值发生变化后,系统给出了i的旧值Old value,然后给出i的新值New value(其实说是监视窗口) 。
2.4set var
我们在程序运行出错时,可能是某个变量的值的原因不对导致了错误,但返回源文件更改又太麻烦,所以我们直接通过set var来改变我们对应的值。如果程序输出结果正确,即可直接说明是该变量的问题, 节省一些不必要麻烦:
我们上面的示例代码输出的结果为:
我们通过改i的值来改变输出结果:
可以看到如下结果:
TIPS:条件断点
相信大家在vs中对条件断点已经不陌生了,下面我们单刀直入直接来介绍条件断点的使用方法:
(gdb) b 9 if i == 30 # 9是⾏号,表⽰新增断点的位置
这是打条件断点的方式。如果我们想要给已经存在的断点增加条件来使其变为条件断点呢?:
(gdb) b 9 # 我们在第9⾏新增⼀个断点,⽤来开始测试
//info b
2 breakpoint keep y 0x0000555555555186 in Sum at mycmd.c:9
(gdb)
(gdb) condition 2 i==30 #给2号断点,新增条件i==30
此时我们便不再需要加if去设置条件。注意注意,重要的事情说三遍,除了打断点可以直接通过行号来打断点之外,我们删断点,给断点添加条件,对变量进行监视等都是通过编号进行的!!!