本文主要讲解使用linux系统进行编程的一个完整流程
vim
Linux系统中最常用的编辑器,被称为“编辑器之神”。相比于vi,vim编辑器是他的升级版,在兼容vi的情况下,加入了很多其他新的特性。
特性
- 全屏编辑器,字符界面,非图形界面
- 工作模式:
-
- 命令模式:复制、剪切、粘贴、查找、保存退出登
- 文本模式:添加、修改等文本编辑操作
- 扩展模式:在末执行复杂的命令
- 使用单字母命令
- 通过模式匹配可以进行复杂的查找和替换
- 通过宏支持用户定义功能
工作图
相关指令
启动vi编辑器:vi vifile - “vifile”不存在将会创建一个新文件
启动后首先进入命令模式,键如以下字符进入文本模式
- a:在光标后添加(add)文本
- i:在光标前(insert)文本
- A:在光标所在的行末添加文本
- I:在光标所在的行首插入文本
- o:在光标所在的下一行输入文本
- O:在光标所在的bbbbbbb上一行输入文本
删除文本
- x:删除光标所在字符
- dw:删除光标所在单词(word)
- d$:删除光标至行末的所有字符
- d0:删除光标所在行首的左右字符
- dd:删除一行
- u:撤销操作
- . :重复上一次操作
- :20,40d:删除从20-40行(扩展模式)
操作
- yy:复制行数据
- dd:删除行(实际是剪切 也可以 n dd)
- p:粘贴
- 在字符上按r,之后输入需要替换的字符
- :wq:保存
- :q!:强制退出
- :set nu:显示行号
- :set nonu:取消行号
移动光标
- <Ctrl - f> 向上翻页
- <Ctril - b> 向下翻页
- <Ctrl - u>
- gg:跳至文首
- <shift - g> 跳至文末
- n 向下移动n行
- n+上/下/左/右:可以移动n个字符
- 命令模式下o:后方插入空白行
- 命令模式下O:前方插入空白行
文本替换
- : s/old/new - 用new替换当前行第一个old。
- : s/old/new/g - 用new替换当前行所有的old。
- :n1,n2s/old/new/g - 用new替换文件n1行到n2行所有的old。
- :%s/old/new/g - 用new替换文件中所有的old。
- :%s/^/xxx/g - 在每一行的行首插入xxx,^表示行首。
- :%s/表示行尾。
- 所有替换命令末尾加上c,每个替换都将需要用户确认。 如:%s/old/new/gc,加上i则忽略大小写(ignore)。
- /g:替换所有(global)的关键字
分屏操作
- :new:打开空白屏
- :only:取消分屏
- <Ctrl + W>:切换
-
- <Ctrl + W> + 扩大窗口
- <Ctrl + W> - 缩小窗口
- <Ctrl + W> h 跳转到左边的窗口
- <Ctrl + W> j 跳转到下边的窗口
- <Ctrl + W> k 跳转到上边的窗口
- <Ctrl + W> l 跳转到右边的窗口
- <Ctrl + W> t 跳转到最顶上的窗口
- <Ctrl + W> b 跳转到最顶下的窗口
gcc
使用vim编写好程序之后,需要对程序进行编译、汇编等操作,此时就需要使用到gcc编译器来编译源文件。
相关命令
gcc -o file file.c
- -o name.out:编译,输出,指定编译后的文件名字,不然默认为a.out
- -c test1.c test2.c test3.c:编译、汇编但是不连接,生成.o文件
- -g:生成调试信息,该程序可以被调试器调试
- -E circle.c -o circle.i:预处理指定的源文件,不进行编译,生成.i文件
- -S:编译指定的源文件,但是不进行汇编,生成.s文件
- -I dir:指定 include 包含文件的搜索目录
- -save-temps:不删除生成的中间文件
gdb
编译过程大多不会是一次成功的,所以我们要反复修改程序bug,这时就需要使用gdb调试工具来一步步的剖析我们的程序
注意:只用经过gcc -g
选项编译的.out
程序可以通过gdb进行调试
-
通过
gdb file.out
进入调试步骤 -
参数列表
- 命令/命令缩写:命令说明
- list l:显示多行源代码
- break b:设置断点,程序运行到断点的位置会停下来(break func / n:在函数func或者第n行设置断点)
- delet 断点号n:删除第n个断点
- disable 断点号n:暂停第n个断点
- enable 断点号n:开启第n个断点
- run r:开始运行程序
- display disp:跟踪查看某个变量,每次停下来都显示它的值
- step s:执行下一条语句,如果该语句为函数调用,则进入函数执行其中的第一条语句
- next n:执行下一条语句,如果该语句为函数调用,不会进入函数内部执行(即不会一步步地调试函数内部语句)
- stepi si nexti ni:用于单步跟踪一条机器指令,一条程序代码有可能由数条机器指令完成,此语句可以单步执行机器指令
- set step-mode on/off:进行单步跟踪是,程序不会因为debug信息而不停住,此参数设置可便于查看机器码
- print p:打印内部变量值
- continue c:继续程序的运行,直到遇到下一个断点
- set var name=v:设置变量的值
- start st:开始执行程序,在main函数的第一条语句前面停下来
- file:装入需要调试的程序
- kill k:终止正在调试的程序
- watch:监视变量值的变化
- backtrace bt:产看函数调用信息堆栈
- frame f:查看栈帧
- quit q:退出GDB环境
-
gdb -q filename:不出现过多的文字
- info i:描述程序的状态
- info break[n] / breakpoint[n] / break:显示第n个断点 / 所有断点
- info reg:查看寄存器的信息
- print p:打印内部变量值(p result[2] = 33 // p printf(“%d”,result[2]);)
-
查看内存地址
x/<n/f/u><addr>
eg:x /4bt 地址(&x)
-
n:需要显示的内存单元个数
-
f:显示的格式 — s:字符串 u:无符号十进制 i:指令地址
- x(hex) 按十六进制格式显示变量。
- d(decimal) 按十进制格式显示变量。
- u(unsigned decimal) 按十进制格式显示无符号整型。
- o(octal) 按八进制格式显示变量。
- t(binary) 按二进制格式显示变量。
- a(address) 按十六进制格式显示变量。
- c(char) 按字符格式显示变量。
- f(float) 按浮点数格式显示变量
-
u:从当前地址往后请求的字节数,默认4个bytes
(b - 单字节 h- 双字节 w- 四字节 g- 八字节)
-
-
查看寄存器
p/x %eda