我是靠谱客的博主 孝顺大白,最近开发中收集的这篇文章主要介绍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
-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的简单使用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部