gcc、gdb的简单使用
1.编译器 - gcc
(1)预处理 -> *.i
-E 预处理
-o 指定输出文件名
1)干掉注释
2)宏替换
3)#pragma 不替换
4)加入了很多行号信息,用于报错和警告使用
file 查看文件类型
(2)编译 -> *.s
把预处理后C的代码转成汇编代码
-S 编译
1)词法分析
2)语法分析
3)语义分析
4)优化
file 查看文件类型
汇编文件
(3)汇编 -> *.o
把汇编源代码转成目标机器的机器码
-c
file 查看文件类型
ELF文件 (execution and link format) 可指行文件的格式
readelf -h 查看elf文件头信息
(4)链接
将外部代码加入到我们的程序中。加上启动代码
file 查看文件类型
a.out和.o文件都是ELF 格式的,为什么a.out就可以执行?
.o文件没有启动代码
gcc默认生成的二进制程序是动态链接的。
用file命令来验证
优化:
-O0 缺省
-O1
-O2
-O3编译优化的四个级别
可以看出,优化之后才会去内存中取值。
2.调试器 - gdb
-g 编译时加-g选项
gdb a.out
l(list) 显示源码
l + 行号:从指定行显示
直接回车:执行上一条指令
l 函数名:从函数名那显示
b(breakpoint) 行号:在指定的行上设置断点
i b(info break):查看断点
按条件来设置断点:b 行号 if i == 9
r(run):执行
n(next):下一步,不进入函数
s(step):如果有函数,进入函数
bt:查看函数堆栈
f + 数字:进入该函数(数字为函数堆栈前所对应的数字)
print 变量:打印变量的值
whatis 变量/函数:打印类型
q(quit):退出
d 断点编号:删除第几个断点
finish:结束当前的函数,返回到函数调用的地方
例:调试程序
调试步骤
在Linux中应用程序运行崩溃之后一般会产生core文件。core文件是通过Linux系统中的工具 core dump来产生的,core dump又称为核心转储。
当程序运行过程中发生异常崩溃时,由core dump把运行程序当前的内存状况存储在一个core文件中。根据core文件查找问题的所在,并作出相应的分析和调试。
Segment fault(段错误)是应用程序崩溃的主要原因,可以通过gdb和核心转储(core dump)定位段错误位置。
调试段错误
1、编译时加上-g选项
2、ulimit -c unlimited
3、运行可执行程序 产生core文件
4、gdb 可执行程序 core文件(例:gdb a.out core.18197)
ulimate -a 查看各种内核资源的限制
修改时加上后面的选项修改
运行后出现段错误就会产生一个core文件
例:调试有段错误的文件