一.程序从代码到运行
在使用IDE编程时,写完代码直接点击运行就输出结果了,中间过程由编译器自动完成,而使用gcc时有必要对其中过程有一些简单了解。
一般来说,程序需要经过预处理、编译、汇编、链接四个步骤,下面就分别对这这个环节进行简单介绍。
//一步完成编译链接过程,-o为指定生成的文件名,默认名为a.out
gcc -E hello.c -o hello
1. 预处理
gcc -E hello.c -o hello.i//将hello.c预处理输出hello.i
预处理过程做的工作主要有以下几点(处理#开头的指令):
- 宏替换
- 展开文件
- 条件编译
- 去掉注释
2. 编译
gcc -S hello.i//将hello.i编译输出hello.s
编译时主要做的工作: 通过语法分析和词法分析,在确认所有指令都符合规则时,将其翻译成汇编代码
3.汇编
gcc -c hello.s//将hello.s汇编输出hello.o
将编译产生的汇编文件转换成机器代码,这个过程比较死,重要性相对较低,调试时有时能用到反汇编
4.链接
gcc hello.o -o hello//将编译生成的.o文件链接,生成可执行文件
地址和空间的分配,符号决议和重定位.
符号决议:地址绑定,分为静态链接和动态链接
重定位:
补充
对于多文件编译链接,可以多文件一起编译,也可以分别编译,最后链接到一起,其语法分别如下:
gcc test1.c test2.c -o test
gcc -c test1.c
gcc -c test2.c
gcc -o test1.o test2.o -o test
对于文件比较多,有时候可能对单一文件进行修改,如果用第一种方式将会把所有文件重新编译再链接,而用第二种只需对更改后的文件单独编译再与其余编译好的文件链接。
2 gdb使用
1. 程序编译
gcc -o hello hello.c -g //-g用来生成调试的符号表,不加无法调试
2. 进入gdb
gdb hello //指定目标文件开始调试
gdb //不指定目标文件
file hello //通过指令来确定文件
3. 开始调试
r(run) --直接运行程序,类似vs直接按F5的效果
start --程序会停在main函数的第一条语句,等待下一步操作
4. 查看代码
l(list) 函数名 //查看函数代码
l n .//查看第n行开始的代码
l n,m //查看n~m行的代码
5. 执行语句
n(next) --执行下一行语句,会跳过函数
s(step) --执行下一行语句,会进入函数
c(continue) --直接向下一直执行,没有错误会执行退出
6. 断点
b(breakpoint) n --在第n行下断点
b 函数名 --在函数处下断点
b n if b==1 --条件断点,满足条件才下断点
disable 断点号 --禁用断点
enable 断点号 - -启用断点
7. 监控变量
watch a --当变量a发生变化时停下,并显示变化前后的值
display a --每次程序停下都显示变量a的值,但a变化不会使程序停下
undisplay a --取消对a的跟踪显示
8. 显示参数
i(info) b --显示断点情况
i watch --查看监控的变量
i display --查看跟踪显示的变量
9. 其他
q --退出gdb
set var --设置变量的值
bt(backtrace) --查看函数调用情况
p(print) a --打印变量的值