目录
- 一、Linux 开发工具分布式版本控制软件 git
- 1、背景
- 2、使用 git
- (1)预备工作——安装 git:
- (2)克隆远程仓库到本地
- (3)把需要提交的代码拷贝到本地仓库
- (4)提交本地仓库文件到远程仓库,三板斧(add,commit, push)
- (6)补充
- 二、Linux 开发工具调试器 gdb / cgdb
- 1、安装
- 2、背景
- 3、基本概念
- 4、基本操作
- 5、cgdb
一、Linux 开发工具分布式版本控制软件 git
1、背景
git 是一个分布式版本控制软件,最初由林纳斯·托瓦兹创作,于 2005 年以 GPL 许可协议发布。最初目的是为了更好地管理 Linux 内核开发而设计。
2、使用 git
(1)预备工作——安装 git:
ubuntu:
$ sudo apt install -y git
centos 7:
$ sudo yum install -y git
在 gitee / github 创建新仓库,然后在创建好的仓库页面中复制远程仓库的地址 url,推荐 HTTPS。
(2)克隆远程仓库到本地
windows下我们的操作:
Linux下我们的操作:
$ git clone [url] # 这里的url就是刚刚建立好的仓库的链接
执行命令后,输入 gitee / github 的用户名和密码,将会直接在本地创建一个放置代码的目录。
仓库中的内容(注意:不要修改隐藏文件 .git 里面的内容):
(3)把需要提交的代码拷贝到本地仓库
(4)提交本地仓库文件到远程仓库,三板斧(add,commit, push)
- 查看本地仓库所有文件状态
$ git status # 查看本地仓库所有文件状态
如上可知 test.c 没有被添加到仓库里,他建议我们用git add
- 把文件添加到仓库中(git的暂存区——index)
$ git add test.c # 添加所有文件到暂存区(git里的index),将需要用git管理的文件告知git
要是想放弃上述操作,输入如下代码 git reset …
- 不放弃上面 add操作,确认提交文件到本地仓库
$ git commit -m "添加第一个源代码 test.c"
" "中写提交日志,不能乱写,描述改动的详细内容
下图即日志:
下图中这个master 89ee7fb有什么作用呢?
- 推动本地仓库的文件到远程仓库,即同步到远端服务器上
$ git push
第一次使用 git 时候,会让你设置用户名和邮箱(每次 git 提交都会使用到该信息,它被永远的嵌入到了你的提交中)
$ git config --global user.email "you@example.com" # 邮箱
$ git config --global user.name "Your Name" # 用户名
当依次执行上述命令后,输入 gitee/github 的用户名和密码,在 gitee/github 上的远程仓库刷新就可以看到自己的代码了。
(6)补充
- 查看所有提交日志的信息
$ git log # 查看所有提交日志信息
- 忽略掉不想本地托管/上传的文件
- git 仓库提交,本地与远端不同,会产生冲突。
Windows 和 linux 用户可以同时使用git 。假如 windows的 别的用户提交了仓库,那你的仓库就和远端不同步,内容不同,因此linux的你需要以下指令
$ git pull
把远端拉取下来。
接着正常进行 push 就好。
问题1:
windows用户首先提交修改代码:
linux 用户 也想提交自己的,但首先要pull 同步远端本地
然后我们会发现,系统把与linux相同的部分保存不变,与linux不同的内容依次出现在文档里,需要我们手动同步
接着完成正常操作,就可以把代码传到远端。
注:更多git内容移步 git 精品课。
二、Linux 开发工具调试器 gdb / cgdb
1、安装
$ sudo apt install -y gdb
安装成功如下:
2、背景
程序的发布的两种模式:
- debug 模式(在生成可执行程序的时候,会加入调试信息,可调试)。
- release 模式(没有调试信息,不可被调试)。
3、基本概念
Linux gcc / g++ 出来的二进制程序,默认是 release 模式。
要使用 gdb 调试,必须在源代码生成二进制程序的时候, 加上 -g 选项。
我们用 readelf 可以读取可持续程序格式,管理信息
我们可以发现 debug 版本的多了调试信息,同时文件大小还比不加 debug 的大。
4、基本操作
gdb 命令格式:gdb [目标文件名]
q / quit 退出
这些基本操作中,常用操作都在下面举了例子,例子也是大致按照调试步骤来排列的。
- list/l + 行号:列出行号前后五行源代码,若为前五行,则往后列够10行,若为后五行,则列出前面五行加最后几行。
- list/l:显示程序源代码,从上次的位置开始,每次列出10行。
- list/l + 函数名:列出指定函数的源代码。
- list/l + 文件名:行号:列出指定函数的源代码。
- 无命令:按回车执行最近一次命令。
- b / break + 行号:在某一行设置断点。
在一个调试周期下,把 gdb 打开不退,断点号即使删了也会线性递增,就是删了断点2,他下个断点会是3,但是退出gdb重新启动,断点就没有了。
- b / break + 函数名:在某个函数开头设置断点。(实际上是这个断点是打在该函数的第一行)
- info / i b:查看断点信息。当前设置了哪些断点。
- delete / d breakpoint:删除所有断点
- delete / d Num:删除序号为 Num 的断点。
- disable Num:禁用断点。
- enable Num:启用断点。
- r 或 run:开始调试,如果没有设置断点,就直接运行结束,有断点,就停下。(相当于 VS 中的 F5)
- n 或 next:单条执行。(逐过程,不会进入函数,相当于 VS 中的 F10)
- s 或 step:进入函数调用。(逐语句,会进入函数,相当于 VS 中的 F11)
- display + 变量名:设置常显示。跟踪查看一个变量,每次停下来都显示它的值。
- undisplay + 序号:取消常显示。取消对先前设置的那些变量的跟踪。
注意: 再次 display 时,i 的值同样是线性递增的,与断点相同。
- print / p + 变量:打印变量值。
- until X(指定行号):跳转到第 X 行。
- continue / c:从当前位置开始连续而非单步执行程序。(运行至下一个断点处停下来)
- finish:执行到当前函数返回,然后停下来等待命令。输入 finish 可直接结束当前函数调用,用此命令可以快速判断一个程序中到底是哪个函数出了 bug(此命令在非 main 函数中才有效)。
- info / i locals:查看当前栈帧局部变量的值
- bt / breaktrace:查看各级函数调用及参数(相当于 VS 中的查看调用堆栈)。
- watch + 变量名:执行时监视一个表达式(如变量的值)。如果监视的表达式在程序运行期间的值发生变化,gdb会暂时暂停程序的执行,并通知使用者。
类似于断点,但是类型不一样,可以 info b一下:
发现类型是 watchpoint
- set var i = 100:修改变量 i 的值(比如在调试过程中,有一个变量值是flag,我不小心设成了0,应该是-1,结果在Sum函数中,我想算sum*flag,导致怎么算都是0,因此可以直接改变var flag 的值先行验证)。
- 条件断点1(新增):b + 行号 + if 的判断语句:当判断语句满足时,断点便触发。如:b 28 if i = 10
- 条件断点2(已有断点):condition + 断点序号 + if 的判断语句:当判断语句满足时,断点便触发,与上述不同的是改已有的断点。
5、cgdb
(1)安装
$ sudo apt install -y cgdb
(2)好处是可以分屏
cgdb的命令与gdb基本相同。
我们调试过程中可以使用连招,断点 b + 逐过程n + 逐语句s定位到函数,同时可以结合display显示变量,watch监视,finish结束函数,until跳转等功能进行调试