【Linux】环境基础与开发工具的使用
1.Linux 软件包管理器 yum
Linux安装软件有三种方法:
1.源代码安装 (编译安装)
是下载到程序的源代码, 并进行编译, 得到可执行程序
优点:灵活性高、性能优化、安装路径可控
劣势:需要处理环境依赖、版本匹配、安装过程复杂、日常维护等问题
2.rpm安装 – Linux下的安装包(本地二进制包)
优点:安装速度快、独立性强、信息详细、安全性高
劣势:依赖问题突出需手动安装依赖包、版本兼容性差、升级不便
3.yum安装(基于 RPM 的在线仓库管理)
优点:自动解决依赖、操作简单、软件丰富、集中管理
劣势:依赖网络,版本固定,灵活性较低
建议:
新手或日常运维:推荐使用 YUM 安装,简单高效。
无网络环境或快速部署:可使用 RPM 安装,但需注意依赖。
高级用户或性能优化需求:建议使用 源码安装,但需承担维护成本。
1.1什么是软件包
软件包是指将软件程序及其相关文件(如配置文件、依赖库、安装脚本等)打包成一个或多个文件的集合,便于安装、升级、卸载和管理。
把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装.
软件包和软件包管理器, 就好比 “App” 和 “应用商店” 这样的关系.yum(Yellow dog Updater, Modified)是Linux下非常常用的一种包管理器. 主要应用在Fedora, RedHat, Centos等发行版上.
yum是Linux下安装软件的一个客户端
软件下载有两种方式
1.直接下载软件 2.拿别人下好的安装包下载
对比yum:
也有两种方案,有对应的安装包可以不联网,运用云服务器的需要联网
登陆上云服务器以后一定是联上网的,可通过ping指令验证
出现类似就说明联网成功
1.2了解rzsz
这个工具用于 windows 机器和远端的 Linux 机器 通过 XShell 传输文件.
安装完毕之后可以通过拖拽的方式将文件上传过去
1.若想将Windows上的东西上传到Linux,可用rz指令上传,会出现界面
2.将Linux上文件传到windows下,用sz指令,同样显示界面
1.3查看软件包
通过 yum list 命令可以罗列出当前一共有哪些软件包. 由于包的数目可能非常之多, 这里我们需要使用 grep 命令只筛选出我们关注的包.
lrzsz是软件包名称,x86_64 表示适用64位系统架构,一串字符串为软件版本号,el7表示操作系统发行版的版本,最后一个表示的是软件源的名称
1.4安装软件
1.直接安装软件包,会自动根据你的系统架构(比如 x86_64)去仓库中查找合适的版本。
2.指定架构安装,若不匹配或兼容会报错
注意:
1.安装软件时由于需要向系统目录中写入内容, 一般需要 sudo 或者切到 root 账户下才能完成
2.yum安装软件只能一个装完了再装另一个. 正在yum安装一个软件的过程中, 如果再尝试用yum安装另外一个软件, yum会报错.
3.遇到不懂的报错可以去网上社区搜素
1.5卸载软件
1.卸载时系统会默认提示是否确认
2.若想直接卸载不要提示,可直接yum remove -y+软件包
1.6yum是如何下载的
客户端就是用来访问网络服务的程序或设备,在手机、ipad或笔记本中有对应的应用商店内置了软件的下载链接,可直接请求服务器。
对比yum同理,虽然不清楚具体的操作原理但里面一定有下载链接。yum 就像 Linux 系统的“应用商店客户端”,只不过它是命令行形式的。
可通过/etc/yum.repos.d/来查看下载链接
下载软件时yum会去如Base.repo和Epel.repo的yum源中去自动寻找下载链接。其中Base.repo是官方yum源,Epel .repo是扩展源,当官方源中没有我们想要的软件时就要去扩展源中下载。
就好比在手机中官方源提供了一款游戏的下载链接,而想要下载破解版官方不支持认可,只能去扩展源中下载
该下载指令的作用是把epel对应的软件从远端拉取下来,把该仓库中的下载链接都放在一个文件里
该指令安装 EPEL 仓库的配置文件和 GPG 密钥(检查软件包是否被篡改,验证安全),从而让你能够通过 yum 命令访问和安装 EPEL 提供的额外软件包。配置文件是连接系统和软件仓库的桥梁,没有它们,系统就无法访问外部仓库。
epel-testing.repo:这是EPEL的测试仓库配置文件,用于安装测试版本的软件包。这些软件包可能包含最新的功能或修复,但可能不如正式仓库中的软件包稳定。这个仓库通常用于测试目的。
注意:
一般Linux操作系统,默认配置的yum源是国外的,所以有可能我们的yum源访问比较慢,可能要更新yum源即替换yum源文件(虚拟机上运行的Linux);而云服务器上的yum,一般厂商已经替换了
2.Linux编辑器–vim
类似在Windows上用的vs系列是集成开发环境,集编译运行调试于一体,还支持多种语言。vim是一个多模式的编辑器,分别是命令模式、插入模式和底行模式
2.1vim的基本操作
1.进入vim,在系统提示符号输入vim及文件名称后,就进入vim全屏幕编辑画面。语法vim+文件名,默认模式是命令模式用户所有的输入都会被当作指令,一般不会给你作为文本输入
2.想要写入代码要切换到插入模式
1:命令模式切换到插入模式:可以直接输入a、i或o
i:按“i”进入插入模式后是从光标当前位置开始输入文件;
a:是从目前光标所在位置的下一个位置开始输入文字;
o:是插入新的一行,从行首开始输入文字。
2:插入模式切换到命令模式:按ESC键
3.不想编写代码要退出需进入底行模式
1:输入:号可由命令模式切换到底行模式
2.接着输入w:保存当前文件,wq:保存并退出,q:不保存直接退出vim
注意:在上述指令后+!代表强制的意思
注意:vim只会在打开文件后保存才会在磁盘上形成一个新的文件,直接退出将不会形成
2.2vim不同模式下命令集
- 1.命令模式
移动光标:
vim可以直接用键盘上的光标来上下左右移动,但正规的vim是用小写英文字母[h]、[j]、[k]、[l],分别控制光标左、下、上、右移一格
按 [gg]:移动光标至整个文本行开头
按 [G]:移动光标到结尾
按 [nG]:移动光标到任意行
按「 $ 」:移动到光标所在行的“行尾”
按「^」:移动到光标所在行的“行首”
按「w」:光标跳到下个字的开头
按「e」:光标跳到下个字的字尾
按「b」:光标回到上个字的开头
按「#l」:光标移到该行的第#个位置,如:5l,56l
按[gg]:进入到文本开始
按[shift+g]:进入文本末端
按「ctrl」+「b」:屏幕往“后”移动一页
按「ctrl」+「f」:屏幕往“前”移动一页
按「ctrl」+「u」:屏幕往“后”移动半页
按「ctrl」+「d」:屏幕往“前”移动半页
复制:
「yw」:将光标所在之处到字尾的字符复制到缓冲区中。
「(n)yw」:复制n个字到缓冲区
大小写:一直按~可改变整行的大小写
删除文字:
「x」:每按一次,删除光标所在位置的一个字符
「(n)x」:例如,「6x」表示删除光标所在位置的“后面(包含自己在内)”6个字符
「X」:大写的X,每按一次,删除光标所在位置的“前面”一个字符
「(n)X」:例如,「20X」表示删除光标所在位置的“前面”20个字符
「dd」:删除光标所在行,若删除后+p就是剪切
「(n)dd」:从光标所在行开始删除n行
替换:
「(n)r」:替换光标所在处的字符+之后的n个字符进行批量化替换
「R」:替换光标所到之处的字符,直到按下「ESC」键为止。
撤回操作:
「u」:如果误执行一个命令,可以马上按下「u」,回到上一个操作。按多次“u”可以执行多次回复。
「ctrl + r」: 撤销的恢复
更改:
「cw」:更改光标所在处的字到字尾处。会删除光标所在位置的单词,并进入插入模式,允许你输入新的单词来替换旧单词
「c#w」:例如,「c3w」表示更改3个字
跳至指定的行:
「ctrl」+「g」列出光标所在行的行号。
「(n)G」:例如,「15G」,表示移动光标至文章的第15行行首。
- 2.多文件模式
底行模式中,用vs指令打开多个文件编辑窗口
Ctrl+ww 窗口光标切换,光标在哪一个窗口里面就对哪一个窗口进行操作
- 3.底行模式
! 前缀用于在底行模式下强制执行某些命令。在底行当中可直接执行编译命令 ! gcc code和直接执行程序 ! ./a.out
在使用末行模式之前,请记住先按「ESC」键确定已经处于正常模式,再按「:」冒号即可进入末行模式。
列出行号:
「set nu」: 输入「set nu」后,会在文件中的每一行前面列出行号。
跳到文件中的某一行
「set nonu」:取消行号
「n」:「n」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字15,再回车,就会跳到文章的第15行。
查找字符:
「/关键字」: 先按「/」键,再输入想寻找的字符,如果第一次找的关键字不是想要的,可以一直按「n」会往后寻找到您要的关键字为止。
「?关键字」:先按「?」键,再输入想寻找的字符,如果第一次找的关键字不是想要的,可以一直按「n」会往前寻找到您要的关键字为止。/ 和 ?查找有和区别?:
1.搜索的方向上有所不同,使用 / 命令后,跟随你输入的搜索模式,Vim 会从当前光标位置开始向下搜索文本。而使用?命令后,Vim 会从当前光标位置开始向上搜索文本。
2.如果模式在文件的结尾(开头)之前被找到,Vim 会显示匹配项并停止搜索。但如果模式在文件的结尾(开头)还没有被找到,Vim 会显示 search hit BOTTOM, continuing at TOP(BOTTOM) 的消息,并从文件的开头( 结尾)继续搜索,直到再次到达文件的底部(头部)或找到匹配项。
保存文件:
「w」: 在冒号输入字母「w」就可以将文件保存起来
离开vim
「q」:按「q」就是退出,如果无法离开vim,可以在「q」后跟一个「!」强制离开vim。
「wq」:一般建议离开时,搭配「w」一起使用,这样在退出的时候还可以保存文件。
2.3简单vim配置
在目录 /etc/ 下面,有个名为vimrc的文件,这是系统中公共的vim配置文件,对所有用户都有效。该目录用于存放系统管理和配置文件。
每个用户根目录下可以自己建立配置文件".vimrc",如果没有的话,这个隐藏文件就是vim的配置文件,向里面写入配置项即可
往配置文件中写入配置信息,如果需要大量文本的复制粘贴可以使用nano往里写,这样打开文件开始编辑时默认就会多出一些提示信息等,不再是空白页面让你去编辑代码
可以看出设置了一点配置后默认增加了序号,高亮行的信息
也可以利用curl -sLf来“管道执行”或“远程代码执行”自动化安装脚本,要注意来源的安全性
注意:
一个用户一个vim配置文件,不会相互影响,每个用户都可以在自己的主目录下创建或修改 .vimrc 文件,以包含自己的 Vim 设置。
不建议给root做配置因为会影响所有用户
3.Linux编译器–gcc/g++的使用
3.1背景知识
为什么能够在Windows或Linux上进行C/C++或其他形式的开发呢?
因为系统中一定已经提前或者后续安装上了开发的相关头文件、库文件,所说的C/C++开发环境不仅仅指vs、gcc、g++,更重要的是语言本身的头文件和库文件,我们在安装编译器时选择的开发包,同步也在下载语言的头文件和库文件,语言的头文件、库文件在Windows和Linux上都存在。头文件提供方法声明,库提供方法的实现
1.可以通过指令查看,并使用vim进入具体文件编辑
2.头文件有两种写法,为什么常用上者,因为安装开发环境时对应头文件、库文件的安装包也给下载好了,编译器找得到,就不用写具体路径
3.2gcc如何完成编译
格式 gcc [选项] 要编译的文件 [选项] [目标文件]
1.预处理(进行宏替换)
a.去注释
b.头文件展开
c.条件编译
应用场景:部分软件分社区版和专业版,那么提供这些软件的公司需要维护两份代码?当然不用这样会极大增加维护成本,而是通过不同的编译条件,裁剪出不同版本不需要的功能
d.宏替换
指令gcc –E hello.c –o hello.i
1.-E后面跟的永远是要编译的文件源,-o后面跟的永远是要形成的目标文件。如果不加-o那么会把结果打印在显示器上,我们希望把结果打印到文件中去,文件名自定义,后缀要求.i
2.-E的意义?
告诉gcc编译器,从现在开始进行程序的翻译,将预处理工作做完就停下来,不要往后处理了,可理解为分阶段完成工作,后面的工作先不做
2.编译(生成汇编)
在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言
指令gcc –S hello.i –o hello.s:
1.-S后是源文件,一般是上一阶段预处理过的文件.i,若跟着.c要再走一遍预处理的过程,都可以;-o后是目标文件
2.意义是从现在开始进行程序的翻译,将汇编工作做完就停下来
3.汇编(生成机器可识别代码)
汇编阶段是把编译阶段生成的“.s”文件转成目标文件
指令:gcc –c hello.s –o hello.o,前为源文件后为目标文件,所有过程相同
将汇编工作完成后就停下,等待链接
注意:会生成可重定位目标二进制文件,简称目标文件,Linux下文件后缀为.o,Windows下后缀为.obj,这些文件不能独立执行,虽然已经是二进制了,需要链接才能执行
4.链接(生成可执行文件或库文件)
指令gcc hello.o –o hello,将可重定位目标二进制文件和库进行链接形成可执行程序
gcc 文件名 -o 文件名,一次性完成四个过程,并且生成的可执行文件不再是a.out而是-o后指定的文件,一般推荐该写法
总结:
链接阶段没有第一个选项,第二个选项都是-o。
预处理、编译、汇编的第一选项为-E、-S、-c,可以参考键盘左上角的ESC键,只需记住c是小写即可速记。文件后缀分别为.i、.s、.o,按顺序iso为镜像文件的后缀
3.3函数库
分为静态库和动态库
1.静态库是指编译链接时,静态链接把库文件中所需要的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要依赖静态库了
2.动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是拷贝库文件的地址进去,在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态链接完后可执行程序依旧依赖动态库在可执行程序中执行不了时会跳转到库中执行,然后返回到代码调用处,动态库不能缺失,一旦对应的动态库缺失,影响的不止一个程序,可能导致很多程序都无法进行正常运行
通过ldd指令可以查看可执行文件所依赖的动态库
Linux的指令主要由C语言实现,本质是一个个可执行文件,执行时也需要依赖C语言的动态库
同理,可以用ldd去具体路径下查找指令所依赖的动态库
库的本质也是一个文件有路径,Linux下后缀.so为动态库,.a为静态库,Windows中后缀为.dll为动态库,.lib为静态库。Linux中库有自己的命名规则:libname.so.XXX,只有name是真的文件名。gcc会到/usr/lib或/lib64/lib,在centos下路径一般为/lib64/
centos7.6机器下默认只会安装动态库,静态库是没有安装的。库其实就是源文件经过一定的翻译然后打包,只给外界提供一个文件,可以达到隐藏源文件的目的,意义是避免我们做重复工作,运用已有的实现来解决问题
安装静态库
由于已将自己的账号加入sudoers配置文件中被信任,可以直接使用sudo提权,安装C语言静态库
安装C++静态库
注意每次使用sudo都需要输入密码,用于临时提权,但sudoers中的时间配置信息可能让你短时间内不用再输密码,可更改
验证动静态链接
进行静态链接需要加-static选项
可看出静态链接方式生成的可执行文件占用更大空间
总结:
1.没有静态库,不能用-static静态链接的方式
2.如果没有动态库只有静态库,gcc是能找到的,只不过gcc默认优先动态链接,-static的本质是改变优先级
动态库:
优点:因为是共享库,有效节省磁盘空间、内存空间、网络空间等资源
缺点:程序的依赖程度高,一旦丢失会导致各个程序无法运行
静态库:
优点:程序链接后不依赖库,可独立运行
缺点:体积大,比较消耗资源
3.4debug与release
debug版是程序员编写的版本,release是发布给用户使用的版本。debug版本可以被追踪调试,因为形成可执行程序时添加了debug信息,注定debug版本的文件大小大于release版本,Linux下默认生成的可执行程序是release版本
gcc指令+-g选项可生成debug版本的可执行文件
可看出默认以动态链接生成的debug版本比动态链接的release版本大一点,不会像静态链接的方式那样大那么多
可用readelf -S指令来读取可执行程序的二进制构成
可用grep指令-i选项忽略大小写的方式找到debug版本的文件信息
扩展:
可执行程序形成时是有自己二进制格式的–ELF格式。只要能通过readelf查出来,就都属于ELF结构。
注意:
release通常是发布版本,包括软件的版本号,创建时间啥的,这些通常不是由程序自己确定的,而是开发者自己写的,并不是ELF文件的结构;所以readelf无法读取的,只能读debug信息
3.5基本使用
1.当用vim编辑有误时,gcc编译时会提示报错
2.编辑修改代码后需要重新编译
3.执行文件
用./+文件名,是为了找到当前可执行程序的位置,用文件的绝对路径也行。在Linux中执行一个程序必须找到该程序所对应的二进制文件
g++和gcc的使用完全相同,只是写代码编辑时用cpp写,编译时用g++。g++也支持用来编译C语言文件,gcc不能编译cpp文件
gcc选项总结
-E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
-S 编译到汇编语言不进行汇编和链接
-c 编译到目标代码
-o 文件输出到 文件
-static 此选项对生成的文件采用静态链接
-g 生成调试信息。GNU 调试器可利用该信息。
-shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统有动态库.
-O0
-O1
-O2
-O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高。是用来提高编译速度增效的,在进行大型项目开发时公司一般会规定优化等级,既然有4个等级,就一定说明对于大型项目效率有显著差距
-w 不生成任何警告信息。
-Wall 生成所有警告信息。
4.项目自动化构建工具-make/Makefile
4.1背景
1.会不会写makefile,侧面说明了是否具备完成大型工程的能力
2.一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作
3…makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
4.make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
5.make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。
4.2基本用法
生成可执行文件
make编译过程中会在当前目录下找Makefile文件,make会根据Makefile里面的依赖关系结合依赖方法来执行方法中的内容,最后编译生成目标文件
第一行为依赖关系,前者依赖后者,中间用:隔开
第二行为依赖方法。表示依赖的实现
清理文件
clean没有依赖关系只有依赖方法,是独立存在的
make会扫描makefile根据其中的依赖关系来递归生成所依赖的文件,最后再生成目标文件。该扫描递归的过程本质是函数调用的过程,函数调用的过程·本质又是调用栈的过程,最后递归找到起始所依赖的文件再层层返回生成目标文件.
注意:makefile的自动推导依赖关系地方顺序不影响,但是不能缺少,一般写一个总的依赖关系不用分开即可
make会自顶向下去扫描makefile,把形成第一个的目标文件当成make的默认动作,说白了如果编译文件指令在前就默认编译,清理在前就默认清理,哪个动作在前就默认谁,一般把清理动作放在最后
4.3重复编译问题
每个源文件只会编译一次,目的是提高编译效率。
如何做到?
一定是源文件形成可执行,先有源文件才有可执行,一般而言,源文件的最近修改时间比可执行文件要老。如果更改了源文件,历史上曾经还有可执行,那么源文件的最近修改时间,一定要比可执行程序新。
做到编译一次只需要比较可执行程序的醉经修改时间和源文件的最近修改时间即可:
1.可执行新于源文件,源文件是老的,不需要重新编译
2.可执行老于源文件,源文件是新的,需要重新编译
4.4文件的ACM三种时间
通过stat指令验证:
stat指令可查询源文件和可执行程序的时间问题
一个文件有三种时间
1.Access是最近访问进入的时间,比如执行cat、vim指令,增删查改都需要访问,所以基本上代表任何时间
2.文件是由文件内容+文件属性构成的,Modify是对文件内容修改的时间,Change是对文件属性修改的时间。
3.一般来说文件属性会跟随文件内容的修改而修改,因为文件size会变化,三个时间可以一次改一个、两个或者三个
4.Access不会每次都发生变化,文件是存储在磁盘上的,正因A时间会经常改变,如果每次都要在磁盘上更改文件信息那么会降低Linux整机系统的效率,所以一般在C时间和M时间中设置计数器,当到达一定次数后就会更新A时间
同时将三个时间都更新为统一
touch命令后跟一个不存在的文件时会新建,跟已存在的文件会更新其中三个时间为同一
也可以通过touch加-a、-m、-c选项来单独修改三个时间
所以make会对比可执行文件和源文件的时间,可以都转化为时间戳比大小,一般比Modify时间看谁新谁旧,决定是否重新编译问题。
编译不会每次都执行,那么我们想每次都执行怎么办?
vim编辑时写入.PHONY:伪目标,就会告诉编译器该目标文件不管时间只要make就重新编译
注意:
1.一般不建议把生成目标可执行文件的逻辑用.PHONY:伪目标来修饰,虽然每次都会重新编译,但都是基于原来文件上来新增内容,可能导致原来的问题依旧存在,最好是清理掉源文件再重新编译出一个新文件。
2.一般期望清理工作用伪目标来修饰
4.5两个特殊符号
在依赖关系中@代表要生成的目标文件,@代表要生成的目标文件,@代表要生成的目标文件,^代表所依赖的源文件,在执行的时候会回显依赖关系和依赖方法
若不想回显,想隐藏依赖关系和方法,在依赖方法前+@即可
5.版本控制器git
git是开源的具有网络功能的版本控制器,客户端和服务端是一体的
git核心工作有两个
1.开发工作时进行版本管理,就是对文件进行管理保存
2.多人协作
基于git搭建的网站主要是GitHub(国外)和Gitee(国内),它们之间的关系如同基于Linux内核搭建的商业化操作系统如Centos和Ubuntu。
目前主要学习命令行的用法
5.1基本用法
1.首先使用git clone指令将远端仓库克隆到本地电脑,由于是https协议,要求我们每次都输入用户密码
远端仓库名为 Linux
.git目录就是当前云服务器上的本地仓库,是个隐藏文件,包含各自信息,不要对其中信息进行任何修改,会自动维护好
2.配置用户身份信息,首次使用需要配置
git config user.name “你的姓名”
git config user.email “你的邮箱@example.com”
姓名是提交者的标识,可以是平台账号名称也可以不是,邮箱必须是git中提交的个人邮箱这样才能关联到一起,本质是为了对代码进行溯源
push.default的配置
push.default 是 Git 的一个配置项,决定执行 git push 时,默认推送哪些分支到远程仓库,涉及两种经典行为:
1.matching(旧默认):推送本地所有和远程同名的分支(可能推送你不想同步的分支,有风险)。
git config --global push.default matching
2.simple(新默认,Git 2.0+ 推荐):只推送当前所在本地分支,且要求本地分支名和远程分支名一致(更安全,避免误推)。
git config --global push.default simple
没有配置会提示
3.拷贝要提交的文件到当前目录
如果不是在克隆下来的本地仓库里面改的话,提交的文件内容是不变的,需要重新拷贝
3.添加到本地仓库
add将没有添加到仓库里的全部添加到仓库,-m""里一定要输入一些说明信息方便查看
如果后续对文件有增删查改也要add,add不是提交全部而是提交变化的部分
4.push到远端仓库
username可以是注册用的用户名,或者绑定的手机号或邮箱,密码是注册用的
推送成功信息
5.2其他操作
1.可通过git log查看提交信息
2.别人可以进入你的开源仓库,git clone复制链接到本地文件下查看相关信息
3.git status可查看当前状态,若所有文件已提交显示nothing to commit,若有新文件会提示你提交到本地仓库,再用git status指令查看时会显示本地仓库已干净,但未推送到远端仓库去接下来push即可
4.除本地仓库.git外还有一个隐藏文件.gitignore,里面存储的都是文件后缀信息,代表这些文件不会被推送到远端仓库,我们可以通过vim来自己编辑添加文件的后缀信息进去不让这些后缀文件被推送到远端
6.基于命令行的调试器–gdb
判断一个文件是debug版本还是release版本可以看是否有调试信息,可以用gdb看是否允许调试,或readelf -S看文件的二进制构成+管道来查看debug信息。
已知gcc默认编译是release方式发布,无法直接调试。要被gdb调试,必须以debug方式发布,gcc必须携带-g选项
6.1调试命令
gdb+文件名
出现该信息提示证明可执行文件是经过调试信息编译的,gdb可以正常识别并调试这个程序。如果中途意外退出,断点等调试信息会清空
1.list/l 行号:显示可执行文件源代码,接着上次的位置往下列,每次列10行。
想看可执行文件全部源码时,可以先执行指令list或l,然后一直回车即可不断显示,因为gdb会记录你的历史命令
2.list或l+文件名
3.r或run:没有断点时从头启动运行程序。
4.break(b) 行号:在某一行设置断点
5.break 函数名:在某个函数开头设置断点
6.info break :查看断点信息。
Num代表断点编号,Enb代表是否起效
7.delete/d:删除断点,注意添加断点是行号,删除是断点的编号
8.有断点时的运行程序:
接下来要进行逐过程(把函数当成一个语句直接调试)或逐语句(进入函数逐句调试)调试
n或nest逐过程执行:执行过程会自动跳过没有代码所在的行,执行完后打的断点还在
s或step:进入函数调用逐语句执行
9.如何进行监视?
1.利用p变量打印监视值:
可以在运行可执行程序时中间穿插p来打印监视信息
2.display 变量名:跟踪查看一个变量,每次停下来都显示它的值,进行常显示
3.undisplay:取消对先前设置的那些变量的跟踪,注意+编号而不是变量名,和delete相同
10.until X行号:跳至X行,可以跳过一些循环
11.finish:执行到当前函数返回,常用于排查错误
12.continue(或c):从当前位置开始连续而非单步(逐过程,语句)执行程序
13.disable +断点编号:禁用断点,保留断点信息,支持多个断点同时操作
14.enable +断点编号:启用断点,支持多个断点同时操作
15.set var +变量=修改值:修改变量的值,相当于条件断点,用于跳过一些循环打印结果
16.breaktrace(或bt):查看各级函数调用及参数,堆栈情况
17.info(i) locals:查看当前栈帧局部变量的值