gcc、gdb的简单使用

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文件

例:调试有段错误的文件
这里写图片描述

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值