🚀每日鸡汤:生活不相信眼泪,即使你把眼泪流成珍珠,灰暗的生活也不会因此而闪光。
目录
②readelf -S 可执行程序(debug/release)
一、使用git命令行
1.1安装git、配置仓库
安装git :sudo yum install -y git
我们在自己的gitee开创一个仓库,用于上传我们的Linux文件。然后就可以克隆到Linux
在我们git下来的文件里面除了两个说明书和一个通行证,还有隐藏文件:.gitignore和.git. 我们先来谈.gitignore
Ⅰ.gitignore
它的里面全是文件后缀:
这些后缀是做什么的呢?凡是在.gitignore里面的后缀,我们在上传的文件后缀凡是被包含于其中的,都不会被上传到gitee,相当于一个过滤器。
Ⅱ.git
而所谓的git仓库,本身就是一个目录.git +里面的内容。
.git类似于我们的一个中转站,我们先把新增的文件添加到.git目录,然后再上传到码云gitee。介绍完这些,我们再来看一下git的基本使用。
1.2git的基本使用
①git add
git add 文件名 这个指令的作用在于将我们刚刚clone下来的目录里新增的文件添加到.git目录。
②git commit -m ‘日志’
这个指令先把.git新增的文件合并到本地仓库,注意,这里我们还没上传到远端,而引号里面就是我们要写的日志,我们可以添加一些备注或者日期。
③git push
把本地的推送到码云。需要我们输入gitee的用户名和密码,我们可以设置为免密码,但是不推荐。
④git status
查看git状态,会显示我们当前进行到git的哪一步了。
当我们git add .之后,查询状态,会提示我们下一步要commit。
⑤git mv
git mv source destination
要求source文件必须是文件,链接或目录,如果destination是现有的目录,则被认为是移动source到destination,如果destination不存在,则被判定是更改名字。
演示:
我们这里的git mv pu.c love包含三步:
mv pu.c love
rm pu.c
git add .
我们查询git status 就会发现已经执行了git add . 到了git commit的阶段。
需要注意的是如果是改名必须在git commit之后才能改名。
⑥git pull
如果你把远端的仓库里的文件给修改了,就会导致git push失败,这时就需要git pull把文件拉回来进行合并,然后我们就可以提交git push。git保证本地和远端仓库的文件要保持一致。
⑦git log
git log 可以查看所有的提交记录:
我们发现我们commit时写的日志也会显示,所以要提醒各位老铁,不要乱写,hr会看的!!😄
二、Linux调试器-gdb
2.1、gdb的使用
Windows下我们通过编译器比如说vs进行调试,那么在Linux下我们也有自己的调试工具--gdb。gdb是基于命令行式的调试,两者在方法上有区别,gdb没有vs调试起来那么方便,但是在思路上还是相近的。
一般我们的编译器上是没有配备gdb的,需要自己安装。
安装指令:sudo yum install -y gdb
这里要提到两个指令,在gdb模式下:
🖊list(l)是查看代码
🖊run(r)是运行代码
🖊quit(q)是推出gdb模式
那么我们可以看到我这里的查看代码什么也没有看到,这是为什么呢?这是因为,在默认情况下,gdb无法进行对现在发布的程序进行调试。也就是说,默认情况下,我们发布的程序是release版本。我们知道vs下我们想调试必须将软件设为debug模式,设为debug后才能生效,否则不能调试。
怎么才能让他以debug版本发布呢?我们需要在gcc编译软件时添加-g选项。
2.2、 debug与release版本的区别
①release版本大小小于debug版本
这肯定是毋庸置疑的,因为debug版本需要我们使用工具调试,需要文件展示的信息更多。
②readelf -S 可执行程序(debug/release)
Linux下有一个readelf -S 可执行程序(debug/release) 指令用于读取可执行程序的二进制构成。
虽然我们看不懂这些二进制,但是我们可以利用管道过滤一下得到debug信息。
我们可以小结一下Linux下的默认行为:
gcc默认行为:
1、默认是动态链接的。
2、默认是release版本
vim默认行为:
默认打开就是命令模式
2.3、 gdb的基本指令
gdb 退出:CTRL+d 或quit/q调试命令:
🖊list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。
🖊list/l 函数名:列出某个函数的源代码
🖊r或run:运行程序
🖊n或next:逐过程调试,相当于f10
🖊s或step:逐语句调试,相当于f11,可以进入函数
🖊break(b) 行号:给第n行断点。注意:如果打断点的所在行没有代码,就会相当于断点打在后面有代码的行。
🖊info break(b):用于查看所有断点
🖊finish:首先需要进入函数,finish直接运行到将对应函数跑完,如果跑时挂掉,直接确定函数有问题。
🖊p 变量:查看变量内容。
🖊p &变量:查看变量地址。
🖊set var:修改变量的值
🖊continue(c):从一个断点运行到下一个断点
🖊run(r):r相当于f5.当没有断点的时候,就是运行程序,有断点的时候就是运行到第一个断点处。
🖊d b:删除所有断点
🖊d b 断点编号:d 断点编号去掉指定断点,这里需要注意,不是d 行号 去掉断点,而是我们info b 查看到的每个断点的编号。
🖊disable breakpoints:禁用断点
🖊enable breakpoints:启用断点
🖊info(或i) b:查看当前设置了哪些断点
🖊display 变量名:跟踪查看一个变量,每次停下来都显示它的值
🖊undisplay:取消对先前设置的那些变量的跟踪
🖊until X行号:跳至X行,跳出循环到有效代码行(不是空)
🖊breaktrace(或bt):查看各级函数调用及参数,查看调用堆栈
🖊info(i) locals:查看当前栈帧局部变量的值,显示特定区域中的临时变量。
Ⅰ断点
①gdb l 1
从第一行开始显示,显示后面的不用再输入指令,回车即可,gdb会默认记住之前的指令。
②gdb b(break) #
gdb b(break) #:给第#行断点。
我们可以打多个断点。
打过断点后,我们不像在vs上能看到红色断点,我们怎么在Linux上查看断点呢?
③info(i) b
info b:用于查看所有断点。
④delete(d) 断点编号
d 断点编号去掉指定断点,这里需要注意,不是d 行号 去掉断点,而是我们info b 查看到的每个断点的编号。
在掌握这些基本指令之后,怎么调试呢?在vs下我们f5是执行到断点,当断点比较多的时候,f5表示从一个断点执行到另一个断点。CTRL+f5 是执行可执行程序。那么在Linux下与之对应的哪些指令是调试呢?
Ⅱ调试
①gdb r
r相当于f5.当没有断点的时候,就是运行程序,有断点的时候就是运行到第一个断点处。
②gdb p
p 变量用于查看内容,p &变量,查看地址。
但是我们这样查看很不方便,只能看到临时的,不能常显示。
③display && undisplay
display可以常显示变量。 display &变量可以常显示变量地址。
取消常显示:undisplay 编号
undisplay用于取消常显示,我们取消的也是变量的编号。
④disable && enable
有些断点虽然我们打下了,但是我们不想让它生效,我们又不想取消这个断点就可以使用disable 断点编号指令。
与之对应的是enable 断点编号:重新使断点生效。