我是靠谱客的博主 孝顺大白,这篇文章主要介绍gcc、gdb的简单使用,现在分享给大家,希望可以做个参考。

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
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
-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文件

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

最后

以上就是孝顺大白最近收集整理的关于gcc、gdb的简单使用的全部内容,更多相关gcc、gdb内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部