Linux:版本控制器git和调试工具cgdb
✨✨所属专栏:Linux✨✨
✨✨作者主页:嶔某✨✨
版本控制器
为了能够更⽅便我们管理这些不同版本的⽂件,便有了版本控制器。所谓的版本控制器,就是能让你了解到⼀个⽂件的历史,以及它的发展过程的系统。通俗的讲就是⼀个可以记录⼯程的每⼀次改动和版本迭代的⼀个管理系统,同时也⽅便多⼈协同作业。 ⽬前最主流的版本控制器就是 Git 。Git 可以控制电脑上所有格式的⽂件,例如 doc、excel、dwg、 dgn、rvt等等。对于我们开发⼈员来说,Git 最重要的就是可以帮助我们管理软件开发项⽬中的源代码⽂件!
git 简史
同⽣活中的许多伟⼤事物⼀样,Git 诞⽣于⼀个极富纷争⼤举创新的年代。 Linux 内核开源项⽬有着为数众多的参与者。 绝⼤多数的 Linux 内核维护⼯作都花在了提交补丁和保存归档的繁琐事务上(1991−2002年间)。 到 2002 年,整个项⽬组开始启⽤⼀个专有的分布式版本控制系统 BitKeeper 来管理和维护代码。 到了 2005 年,开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了 Linux 内核社区免费使⽤ BitKeeper 的权⼒。 这就迫使 Linux 开源社区(特别是 Linux 的缔造者 Linus Torvalds)基于使⽤ BitKeeper 时的经验教训,开发出⾃⼰的版本系统。 他们对新的系统制订了若⼲⽬标:
- 速度
- 简单的设计
- 对⾮线性开发模式的强⼒⽀持(允许成千上万个并⾏开发的分⽀)
- 完全分布式
- 有能⼒⾼效管理类似 Linux 内核⼀样的超⼤规模项⽬(速度和数据量)
⾃诞⽣于 2005 年以来,Git ⽇臻成熟完善,在⾼度易⽤的同时,仍然保留着初期设定的⽬标。 它的速度⻜快,极其适合管理⼤项⽬,有着令⼈难以置信的⾮线性分⽀管理系统。
git的简单使用
克隆仓库
下载好git后。我们进入gitee或者github,新建一个仓库
将新建仓库的路径复制下来
在本地打开cmd窗口输入
git clone https://github.com/QinMou000/Code.git
你的当前目录下就会新建一个新文件了
其实在你新建仓库的时候,在云端为你新建了一个文件夹,这个新文件就是从云端的仓库克隆下来的。
上传文件
在里面新建一个.c文件
在当前页面打开cmd窗口输入
git add test.c // 你要上传的文件
git commit -m "这是一个测试" // 这次上传你做了什么工作
git push // 将代码上传到云端
如果一切正常,再次打开github就会在你的仓库里看到你刚刚上传的文件了
在我们本地仓库有一个隐形文件 .git 这个文件里面管理和记录了你本地仓库的所有提交,命令commit就是把你本地的更改记录到 .git 里面。push指令就是将本地的更改同步到云端。
那如果有两个人A B在管理这个仓库,今天上传了一个文件,B不知道A上传了,B也准备上传文件,但是此时B的本地仓库和云端仓库不一样,一个陌生的文件出现在了云端(A上传的)并且这个文件在B的本地没有任何记录,此时B就会上传失败。此时B的解决方法就是将本地与云端同步一次,也就是git pull指令。但这并不会删除B原来准备上传的文件,相当于把A上传的文件和上传记录拷了下来。这时B在git push 就没有任何问题了
调试器 - gdb/cgdb使⽤
程序的发布⽅式有两种, debug 模式和 release 模式, Linux gcc/g++ 出来的⼆进制程序,默认是 release模式。
要使⽤gdb调试,必须在源代码⽣成⼆进制程序的时候, 加上 -g 选项,如果没有添加,程序⽆法被 编译
gcc test -o test.c -g
常见指令
命令 | 作用 | 样例 |
list/l | 显示源代码+数字表示行数 | list/l 10 |
list/l 函数名 | 列出指定函数代码 | list/l main |
list/l 文件名:行号 | 列出指定文件的源代码 | list/l test.c:2 |
r/run | 从程序开始连续执行 | run |
n/next | 单步执行,不进入函数内部 | next |
s/step | 单步执行,进入函数内部 | step |
break/b 文件名:行号 | 在指定行号设置断点 | break test.c:10 b 10 |
break/b 函数名 | 在函数开头设置断点 | break fun |
info break/b | 查看当前所有断点信息 | info b |
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 |
watch
执⾏时监视⼀个表达式(如变量)的值。如果监视的表达式在程序运⾏期间的值发⽣变化,GDB 会暂停程序的执⾏,并通知使⽤者。如果你有⼀些变量不应该修改,但是你怀疑它修改导致了问题,你可以watch它,如果变化了,就会通知你.
条件断点添加常⻅两种⽅式:
- 新增
- 给已有断点追加
- 注意两者的语法有区别,不要写错了。
- 新增: b ⾏号/⽂件名:⾏号/函数名 if i == 30(条件)
- 给已有断点追加:condition 2 i==30, 其中2是已有断点编号,没有if
本期博客到这里就结束了,如果有什么错误,欢迎指出,如果对你有帮助,请点个赞,谢谢!