目录
git的功能和使用过程
git的功能
git三板斧
git使用中的其他问题
Linux调试器——gdb使用
gdb调试代码的方法(选项)
我们在平时维护和上传代码时会用到git,但是这个git具体是什么,往往又说不清楚。其实git其实就是一个版本管理工具,有了这个工具就能方便快捷地查询自己上传代码的不同版本,对每一次上传的改动了如指掌。
那gdb又是什么呢?在VS上,我们可以通过鼠标点击来打断点,通过F5,F10和F11来控制程序,实现程序的调试,但是Linux没有图形界面,就不能像VS一样,就只能引入gdb来作为调试工具,对程序进行调试。
Git(读音为/gɪt/)是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。
什么是版本管理?
这里以一个生活中的例子来讲解,假设程序员A写了一份实验报告,最初版本我们称之为v1,程序员去拿给项目经理进行审阅,项目经理提出修改意见,程序员A下去修改。程序员A在修改前先将v1版本进行备份,修改后获得v2版本,程序员A再去拿给项目经理审阅,项目经理再次提出修改意见,程序员A再次将v2版备份后,修改获得了v3版本。项目经理看了v3版本后,认为程序员A修改的v3版本还不如之前的v2版本,因此让程序员B在v2版本的基础之上,修改获得了v3.2版本,项目经理最终决定采用v3.2版本。
上述过程中,修改、保存每个版本过程中的操作,实际上就是在进行版本管理。
当你需要做一个大工程的时候,文件的管理无疑是非常庞大的工作,因为你需要不断的修改更新文件内容,同时可能还要保留旧版本保证可以复原,这样就需要备份多个版本的文件。并且在大多数情况下一个工程需要在多数人来共同维护,那么这种情况下不同人之间修改内容的合并也是非常麻烦的,这时使用git就可以很轻松的解决这些问题。
准备工作 -- 在git上创建远程仓库并克隆到本地
登录gitee网站,点击右上角的+,选择新建仓库,自定义仓库名、仓库介绍等内容后,点击创建,这样就在远程创建了代码仓库。
注意这里的添加.gitignore选项,是指引入忽略黑名单,将指定后缀名的文件自动屏蔽,使垃圾文件不会被上传至远程仓库。这里我们在.gitignore选项中选择C,其中就包含了生成C可执行文件过程中常见的应当被加入黑名单的文件的后缀名。
一般而言,只需要上传.c/.cpp/.h文件即可。
在进行这项工作之前,我们首先检查自己的Linux系统下面是否安装了git,检查方法为输入指令:git --version,这条指令的功能是输出当前环境下git的版本,如果输出成功(如图1.3),那么表示git已经安装,如果没有安装git,则需要通过指令yum -y install git来安装git。
这一步会提示我们输入用户名和密码,我们只需要输入注册gitee账号时使用的用户名和密码(并不登录linux的用户和密码)即可。执行完git clone指令后,我们通过ll,可以看到远端仓库已经被拉取到了近端。
第一板斧:git add [文件名] -- 将用git管理的文件告知git
我们希望将文件test.c传入远程仓库,首先应当让git知道test.c要被git管理,那么应当执行指令git add test.c。
在实际项目中。我们可能会失误add,如果想撤销对某个文件的add,指令为:
第二板斧:git commit -- 提交改动到本地
语法:git commit -m "日志信息"
注意,这里的日志信息不可以省略,修改仓库必须要记录对应的修改日志,将test.c文件提交改动到本地,记录日志信息是修改操作的用户(zhang)和修改仓库的时间(2023.09.25)。如果我们希望撤销git commit操作,指令为:git reset --soft HEAD^。
第三板斧:git push -- 将修改同步到远程仓库
使用git push指令,输入用户名和密码之后,到远程仓库中,查看发现,test.c被成功提交,相应的日志信息也得以被记录。
(1) git log查看提交记录
(2) .gitignore
.gitignore为黑名单文件,用于屏蔽指定后缀名的文件为黑名单文件,禁止特定的文件被同步到远程仓库。使用vim打开.gitignore文件,可以对黑名单文件进行设置。
(3) 在近端操控远程仓库删除文件
注意,不可以省略git,直接rm,这样会造成近端删除了文件,而远端仓库没有删除的问题。
debug && release
debug能被调试,release不能,debug在形成可执行程序的时候会有调试信息,release没有
gcc默认编译是release方式发布的,无法直接调试, 如果要以debug方式,必须携带 : -g.
release发布的文件大小大于debug文件大小,要被gdb调试,必须要以debug发布,必须加-g
mycode.c文件
1 #include
2 int addToTop(int top)
3 {
4 int res=0;
5 int i=1;
6 for(;i<=top;i++)
7 {
8 res+=i;
9 }
10 return res;
11 }
12
13 int main()
14 {
15 printf("debug begin\n");
16 int top=100;
17 int sum=addToTop(top);
18 printf("sum:%d\n",sum);
19 printf("debug end\n");
20 }
- gdb [文件名] -- 启动调试、quit(q) -- 退出gdb
- list [行号] -- 从指定行开始显示代码
- list [函数名] -- 从头开始显示某个函数的代码
- list 源文件:n(行号) -- 显示指定源文件特定行的内容。如list func.c:5,表示显示源文件第5行前后的内容
输入list 0后,持续按回车键,可以显示出全部代码,因为gdb会记录最近一条的指令,如果接下来要执行的指令没有改变,可以直接回车执行。
- b [行号] -- 在指定行打断点。
- b 函数名 -- 在指定函数的实现代码的第一行处打断点。
- b 源文件名:函数 [行号] -- 在指定源文件的特定行打断点。如b func.c:10,表示在源文件func.c的第10行打断点。
- b [行号] if expr -- 设置条件断点
- info b -- 显示断点信息(包含断点编号、是否打开/禁用、断点位置等)。
- d [断点编号] -- 删除指定编号的断点(不是指定行号)。
- set var -- 改变特定变量的值,如set var i=98 ,就表示把变量i的值改为98。
- disable [断点编号] -- 禁止使用某断点
- enable [断点编号] -- 启用某断点
- run ( r ) -- 开始调试,如果没有断点直接运行到程序结束,有断点就运行到第一个断点位置
注意:如果多次连续执行r指令,并不是执行到下一处断点,而是重写开始调试。
- next (n) -- 逐过程执行,相对于VS下的F10
- step (s) -- 逐语句执行,相当于VS下的F11
- continue (n) -- 运行至下一断点处
- bt -- 查看调用堆栈
最上层的调用堆栈,为当前函数的调用堆栈。
- p [变量名] -- 查看指定变量的值
- display [变量名] -- 长显示指定变量(之后每次执行都会显示变量的值)
- undisplay [长显示变量的编号] -- 删除指定编号变量的长显示
- finish -- 执行完当前执行流所在函数就停下来
- until (u) -- 执行到指定行(不宜跨函数调用)
风来自很远的地方,去去也无妨。