vim,gcc/g++,gdb的基本使用
vim
vim是Linux下的一款编辑器,是用来专门写代码的,vim有三种模式
- 命令模式
- 插入模式
- 底行模式
vim打开时处于命令模式,是不能直接写代码的,需要切换到插入模式才可写代码。vim从命令模式切换到插入模式有如下方法:
命令 | 作用 |
---|---|
a | 光标后移一个字符,进行插入 |
A | 在光标所在行的行尾进行插入 |
i | 光标位置不变,在光标位置插入 |
I | 在光标所在行的行首插入 |
o | 在光标所在行的下一行进行插入(会新起一行) |
O | 在光标所在行的上一行进行插入(会新起一行) |
s | 删除光标位置的一个字符后在光标位置插入 |
S | 删除光标所在行后进行插入 |
其中切换到行首(I)/行尾(A)进行插入较常用,vim从编辑模式切换到命令模式按Esc。
vim命令模式的命令:
命令 | 作用 |
---|---|
ctrl + b | 上翻一页 |
ctrl + f | 下翻一页 |
ctrl + u | 上翻半页 |
ctrl + d | 下翻半页 |
zz | 将光标所在行调整到屏幕中间 |
zb | 将光标所在行调整到屏幕下方 |
zt | 将光标所在行调整到屏幕上方 |
0 | 光标位置定位到行首 |
^ | 光标位置定位到行首 |
$ | 光标位置定位到行尾 |
x | 删除光标位置的字符 |
X | 删除光标前一个位置的字符 |
D | 删除光标所在位置到行尾的所有内容 |
dG | 删除光标所在行到文件末尾的内容 |
u | 撤销上一步的操作 |
~ | 大小写转换 |
yy | 赋值光标所在行 |
dd | 剪切光标所在行 |
p | 将复制(剪切)的内容粘贴到光标的下一行 |
P | 将复制(剪切)的内容粘贴到光标的上一行 |
r | 取代光标所在位置的一个字符 |
R | 取代光标所在位置的多个字符 |
在vim的命令模式下,可以使用ctrl + v切换到视图模式实现代码的批量注释。具体操作:
- ctrl + v进入视图模式
- 使用
hjkl
选择想要注释的区域
-
按下
I
-
输入
//
-
Esc
vim的底行模式:在vim的命令模式下,按住shift + :
进入底行模式,vim的底行模式可以支持查找,批量修改等丰富操作。
底行模式命令 | 作用 |
---|---|
n | 将光标切换到第n行 |
n1,n2d | 删除行号为[n1,n2]的所有内容 |
! | 在使用vim的时候不用退出编辑器即可使用命令 |
wq! | 强制保存退出 |
set nu | 显示行号 |
/string | 在文本中搜索与指定字符串string相关的内容 |
gcc/g++
- gcc/g++是Linux下的编译器,专门用来编译代码
- gcc编译器不光可以编译c语言,还支持编译 Go、Objective-C,Objective-C ++,Fortran,Ada,D 和 BRIG(HSAIL)等程序
- gcc/g++编译器可以展示一个.c文件到二进制可执行文件的所有过程
gcc/g++可以分步实现对.c文件的预处理,编译,汇编,链接。
-
预处理(pre-processing)
gcc -E test.c -o test.i # -E表示编译器仅对.c文件进程预处理操作生成.i文件
-
编译(compiling)
gcc -S test.i -o test.s # -S表示对预处理过后的.i文件进行编译,生成.s文件
-
汇编(assembing)
gcc -c test.s -o test.o # -c表示对编译过后的.i文件进行汇编,生成.o文件
-
链接(linking)
gcc test.o -o mybin # 生成可执行文件
gcc/g++编译器的重要参数:
-
-g 表示编译产生的可执行文件带有调试信息。默认产生的可执行文件是release的
-
-o 可以对源代码进行优化,-o参数有4个等级,-o0,-o1,-o2,-o3,-o0默认是不优化,-o3是最高优化级别,一般如果进行优化,-o2就足够。使用-o优化可能会丢失程序的调试信息,使其无法调试。
-
-Wall 打印警告信息,例如这里有一段代码:
#include<stdio.h> int main() { int a=10; printf("hello world\n"); return 0; }
使用-Wall:
[slowstep@localhost day01]$ gcc test.c -o mybin -Wall test.c: In function ‘main’: test.c:4:9: warning: unused variable ‘a’ [-Wunused-variable] int a=10; ^
-
-std=c++11 指定使用的c标准或c++标准。
-
-D 定义宏。例如:
#include<stdio.h> int main() { #ifdef DEBUG printf("hello\n"); #endif #ifndef DEBUG printf("world\n"); #endif return 0; }
运行:
gcc -DDEBUG test.c -o mybin_debug gcc test.c -o mybin ./mybin world ./mybin_debug hello
gdb
gdb是Linux下一款强大的调试器,其主要功能有:
-
设置断点(断点可以是条件表达式)
-
使程序在指定的代码行上暂停执行,便于观察
-
单步执行程序,便于调试
-
查看程序中变量值的变化
-
动态改变程序的执行环境
-
分析崩溃程序产生的core文件
gdb调试的程序必须是debug的,在使用gcc/g++编译程序时,要加上-g选项,生成的程序才能调试。
gdb的常用命令:
$(gdb)run(r) # 开始运行程序,到断点处停止
$(gdb)list(l) # 查看原代码
$(gdb)next(n) # 单步调试(逐过程,函数直接执行)
$(gdb)step(s) # 单步调试(逐语句:跳入自定义函数内部执行)
$(gdb)break+num(b) # 在第num行设置断点
$(gdb)info b # 查看断点信息
$(gdb)delete breakpoints num(d) # 删除断点(根据断点编号删除)
$(gdb)finish # 结束当前函数,返回到函数调用点,如果函数中有循环且循环内有断点需删除该断点才能结束
$(gdb)continue(c) # 继续运行到下一个断点
$(gdb)print(p) # 打印值及地址,只在当前打印一次
$(gdb)info breakpoints # 查看断点信息
$(gdb)enable breakpoints # 启用断点(使用的是断点编号)
$(gdb)disable breakpoints # 禁用断点(根据编号禁用)
$(gdb)display # 追踪查看具体变量值,多次打印
$(gdb)undisplay # 取消追踪观察变量,undisplay后面跟变量的编号,不是名称
启用断点和禁用断点的解释:gdb中可以使用info b来查看断点信息,默认打的断点是开启的。可以通过Enb查看。
(gdb) info b
Num Type Disp Enb Address What
1 breakpoint keep y 0x0000000000400529 in Sum at test.c:6
breakpoint already hit 29 times
2 breakpoint keep y 0x0000000000400555 in main at test.c:12
在禁用断点以后,断点的Enb变为n,表示断点失效。
(gdb) disable breakpoints 2
(gdb) info b
Num Type Disp Enb Address What
1 breakpoint keep y 0x0000000000400529 in Sum at test.c:6
breakpoint already hit 29 times
2 breakpoint keep n 0x0000000000400555 in main at test.c:12