Linux工具篇
这里简单介绍一下Linux中常用的几个工具,直接开始吧。
包管理器(yum)
相当于商店的概念,在这个商店中有许多软件,可以让用户进行下载和安装
yum的三板斧----需要root用户的权限
安装:yum install [软件名称]
移除:yum remove [需要移除软件的名称]
查看:yum list
编辑器(vim)
vim有三种常用的模式:普通模式,命令行模式,插入模式,下面来介绍一下这三种模式的转换。
vim+文件名称可以进入普通模式,在普通模式下按:可以进入命令行模式,按esc键可退出命令行模式,在普通模式下按i,I,o,O,a,A可进入插入模式,区别在于光标位置不同,但大多使用i,同样按esc退出插入模式。如果想退出普通模式可使用:q,:wq,:q!。功能也各有所不同。:q退出,:wq保存并退出,:q!强制退出。一般来说这几种就已经够用了。
接下来介绍一些vim中的一些操作:
移删复替撤更跳
移:光标移动
上下左右键可以进行移动
在普通模式下,童工了四个键也可以支持光标的移动
h(光标向左)j(光标向下)k(光标向上)l(光标向右)
w:跳到下一个单词的词首
b:调到上一个单词的词首
e:调到下一个单词的词尾
删:删除字符或者行
普通模式下:
x:删除光标所在的字符
[num]x:删除包含光标在内的字符后的num个字符
X:删除光标所在字符的前一个字符
[num]X:删除光标前的num个字符
dd:删除光标所在的一行,本质是剪切
[num]dd:向下删除包含光标在内的num行
插入模式下直接使用delete键就行了
复:复制
yy:复制光标所在的一行数据
[num]yy;复制包含光标所在的多行数据
yw:复制一个单词
y[num]w:复制多个单词
p(小写):粘贴
P(大写):在光标所在的上一行进行粘贴
替:替换
r:替换光标所在的字符 用法:(r,直接输入想要替换成为的哪一个字符)
R:替换多个字符,切换到replace模式,替换光标所在字符,按esc结束替换
在命令行模式下也有替换字符串的功能,我们可以根据需要使用对应的命令
撤:撤销
u:撤销,撤销上一个动作(复制,删除,粘贴)==>相当于win的ctrl+z
ctrl+y:反撤销= =>相当于win的ctrl+y
更:更改
cw:更改光标所在的单词,并且变成insert模式
c[num]w:更改光标所在单词后的num个单词,并且变成insert模式
C(大写):从光标位置开始,删除当前光标位置之后的所有字符(包含当前光标所在字符),并且变成insert模式
跳:跳转
gg:跳到首行
G:跳到末行
ctrl+o:跳到刚才光标所在的位置
[num]G:跳到num行
gg=G调整代码格式
命令行模式:
:set nu/set nonu设置行号和取消行号
:vs[filename]可以进行分屏,分屏后可以使用ctel+ww进行跳转(这个我感觉还挺有用的)
vim当中如何注释代码和取消注释
vim中注释代码:
1.ctrl+v
2.使用j或者k来选择需要注释的行
3.shift+i变成insert模式
4.插入注释符号"//"
5.按下esc退出
vim中取消注释
1.ctrl+v
2.使用j或者k加上h或者l来选择需要取消注释的行和删除的列
3.按下x,就删除掉了注释的符号
编译器(gcc/g++)
gcc-> C语言的编译器
g+±>C++语言的编译器
编译的4个步骤
1.预处理:宏替换,头文件展开,去注释
gcc -E [源码文件] -o [生成的预处理之后的文件名称].i
2.编译:语法语义的检测,生成汇编代码
gcc -S[源码文件] -o [生成的编译之后文件的名称].s
3.汇编:将汇编代码转换成机器语言(二进制代码)
gcc -c[源码文件] -o [生成的汇编之后文件的名称].0
4.链接:让生成的不同的汇编代码或者加上库,链接到一起,生成可执行程序 文件
gcc [源码文件] -o [可执行程序名称
静态链接:需要在编译命令中增加-static选项,将当前源码依赖的最基本的c库或者第三方库,全部编译到可执行程序当中去,所以文件特别大,编译的时候特别慢。
动态链接:将当前源码所依赖的函数位置,记录在 可执行程序的符号表中(库+函数的位置),文件不大。
调试器(gdb)
前提:可执行程序采用-g选项进行编译
一.调试可执行程序(重要)
1.起手式:gdb[execute_binary_filename]
2.常用命令:
l(list):查看源码
r(run):使程序跑起来
b(break)[num]:在main函数所在的文件当中打断点
i b(info breakpoints):查看断点信息
b [filename]:[num]:在某个文件的某一行打断点
enable [断点的序号]:使断点生效
disable:[断点的序号]:使断点不生效
delete [断点的序号]删除断点
n(next):逐过程执行 win F10
s(step):逐过程执行 winF11
c(continue):继续执行 win F5
bt(backtrace):查看调用堆栈
f[堆栈的序号]:切换到不同的堆栈当中去查看具体的信息
p(print)[变量名称]:打印一个变量的值
i locals:查看当前作用域当中临时变量的值
q(quit):退出调试
sisassemble:查看汇编代码
二.可执行程序已经跑起来了,如何使用gdb进行调试(不太重要)
gdb -p[pid] / gdb attach [pid] (将gdb附加到进程)
pid:进程ID --> 用ps aux | grep [待查询的可执行程序的名称]命令获取当前进程的pid
三.当一个程序执行的时候,崩溃掉了,如何进行调试(灰常重要)
1.首先我们先用ulimit -a命令查看当前系统当中的限制信息,只要查看core file size变量的值。
如果是0,即使程序崩溃也不会核心转储文件(核心转储文件保存的是程序在崩溃签的所有内存镜像也称coredump文件)。
如果是unlimited,程序崩溃理论上会产生核心转储文件,但还要取决于磁盘空间的大小,如果产生的coredump文件比较大的话,但是磁盘空间没有那么大的话,也不会产生核心转储文件。
2.程序崩溃的现象
程序崩溃会报错,条件符合的话会产生核心转储文件core [成产coredump文件进程生前的pid(没用)]
一般有两种崩溃报错,Segmentation fault和Aborted,内存访问越界和解引用空指针会产生Segmentation fault,而free野指针会产生Aborted。
3.调试coredump文件
gdb [可执行程序文件] [coredump文件]
需要确定当前代码崩溃在哪一行,使用bt命令查看程序崩溃的时候,代码运行堆栈长什么样,跳转到具体的崩溃堆栈f[堆栈序号],进行打印崩溃的时候变量的值。或者直接根据崩溃提示的代码行进行源码分析。二选其一即可。
解释器(make/makefile)
make:解释器,本质上是一个程序
makefile:本质上是一个文件,被make解释器解释的一个编译可执行程序的规则文件
1.makefile的编写规则
(1)如何在makefile当中注释#xxx
(2)目标对象:依赖对象
编译命令
目标对象:需要生成的可执行程序的名称
依赖对象:生成可执行程序的源码文件
编译命令:如何使依赖对象生成目标对象
2.make解释器的解释规则
(1)对比目标对象和依赖对象的最后一次修改时间,当目标对象比依赖对象最后一次修改时间距离现在比较近,意味着目标对象比较新,则make在解释makefile当中的解释规则时,对比完成后就不会执行编译命令。但可以用伪目标来消除这一限定。
(2)永远只为生成第一个目标对象而服务
(3)在生成目标对象的时候,发现依赖对象在当前目录下不存在,则在makefile中查找生成依赖对象的方法。如果查找到,先生成依赖对象,在反过来生成目标对象。如果没有找到,make会默认补全一个依赖对象的生成方法,但这个依赖对象的名称起到一个至关重要的作用,如果依赖对象和源码文件的名称不一致,则补全的时候就会有问题,则不会生成依赖对象会报错,如果名称一致,make解释器补全依赖对象。但这种很low,所有我们自己在编写makefile的时候,要主要依赖对象的生成方法,不要遗漏。
3.预定义变量:
$^:所有依赖的对象
$@:目标对象
$<:第一个依赖对象
4.清理:
clean:
5.伪目标:
起手式.PHONY
6.自定义变量
版本管理工具(git)
git我目前了解的比较少,但先用起来吧。git提交三板斧git add/git commit -m" "/ git push。
先整理这些吧。以后再添加。