一 . gcc编译器
1. 简介及功能
GNU CC(简称为Gcc)是GNU项目中符合 ANSIC 标准的编译系统,能够编译用 C、C++和Object C等语言编写的程序。Gcc不仅功能强大,而且可以编译如 C、C++、Object C、Java、Fortran、Pascal、Modula-3 和 Ada 等多种语言,而且 Gcc 又是一个交叉平台编译器,它能够在当前CPU平台上为多种不同体系结构的硬件平台开发软件, 因此尤其适合在嵌入式领域的开发编译。
后 缀 名 | 所对应的语言 | 后 缀 名 | 所对应的语言 |
.c | C原始程序 | .s/.S | 汇编语言原始程序 |
.C/.cc/.cxx | C++原始程序 | .h | 预处理文件(头文件) |
.m | Objective-C原始程序 | .o | 目标文件 |
.i | 已经过预处理的C原始程序 | .a/.so | 编译后的库文件 |
.ii | 已经过预处理的C++原始程序 | ||
2. Gcc 编译流程分为4个步骤:
· 预处理(Pre-Processing) ;
· 编译(Compiling) ;
· 汇编(Assembling) ;
· 链接(Linking) 。
(1)预处理阶段
在该阶段,编译器将头文件编译进来,并且用户可以使用Gcc的选项“-E”进行查看,该选项的作用是让Gcc在预处理结束后停止编译过程。
(2)编译阶段
Gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,Gcc 把代码翻译成汇编语言。用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
(3)汇编阶段
汇编阶段是把编译阶段生成的“.s”文件转成目标文件,在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了。
4)链接阶段
在成功编译之后,就进入了链接阶段。在这里涉及到一个重要的概念:函数库。 函数库一般分为静态库和动态库两种。静态库是指编译链接时,把库文件的代码全部加入到可执行文件中。其后缀名一般为“.a” 。动态库与之相反,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so” 库。Gcc在编译时默认使用动态库。
3 格式及选项参数
Gcc指令的一般格式为:Gcc [选项] 要编译的文件 [选项] [目标文件]
(1) . 总体选项
后 缀 名 | 所对应的语言 |
-c | 只是编译不链接,生成目标文件“.o” |
-S | 只是编译不汇编,生成汇编代码 |
-E | 只进行预编译,不做其他处理 |
-g | 在可执行程序中包含标准调试信息 |
-o file | 把输出文件输出到file里 |
-v | 打印出编译器内部编译各过程的命令行信息和编译器的版本 |
-I dir (大写i) | 在头文件的搜索路径列表中添加dir目录 |
-L dir | 在库文件的搜索路径列表中添加dir目录 |
-static | 链接静态库 |
-llibrary | 连接名为library的库文件 |
(2) . 告警和出错选项
选 项 | 含 义 |
-ansi | 支持符合ANSI标准的C程序 |
-pedantic | 允许发出ANSI C标准所列的全部警告信息 |
-pedantic-error | 允许发出ANSI C标准所列的全部错误信息 |
-w | 关闭所有告警 |
-Wall | 允许发出Gcc提供的所有有用的报警信息 |
-werror | 把所有的告警信息转化为错误信息,并在告警发生时终止编译过程 |
3)优化选项
Gcc可以对代码进行优化,它通过编译选项“-On”来控制优化代码的生成,其中 n是一个代表优化级别的整数。对于不同版本的 Gcc 来讲,n 的取值范围及其对应的优化效果可能并不完全相同,比较典型的范围是从0变化到 2或 3。
(4)体系结构相关选项
选 项 | 含 义 |
-mcpu=type | 针对不同的CPU使用相应的CPU指令。可选择的type有i386、i486、pentium及i686等 |
-mieee-fp | 使用IEEE标准进行浮点数的比较 |
-mno-ieee-fp | 不使用IEEE标准进行浮点数的比较 |
-msoft-float | 输出包含浮点库调用的目标代码 |
-mshort | 把int类型作为16位处理,相当于short int |
-mrtd | 强行将函数参数个数固定的函数用ret NUM返回,节省调用函数的一条指令 |
二 . gdb 调试器
1. Gdb 调试器是一款 GNU 开发组织并发布的 UNIX/Linux 下的程序调试工具
使用格式是:
gdb [选项] + gdc编译过的文件 ;
里面的选项参数:
查看文件: "l"(list);
设置断点: "b"(breakpoint); 例: b 8 ;//就是在第8行设置断点
查看断点: "info"b
运行代码: "r"(run)
查看变量值: "p"变量名
单步运行: "s"(step), "n"(next) //两者间的区别在于:若有函数调用的时候, “s”会进入该函数而“n”不会进入该函数。因此, “s”就类似于 VC等工具中的“step in” (F11), “n”类似与VC等工具中的“step over” (F10)。
恢复程序运行: "c"(continue)
别名: aliases —— 指其他命令的别名
断点 : breakpoints —— 使计划在指定的点停止
数据 : data —— 检查数据
Gdb的使用切记点:
· 在Gcc编译选项中一定要加入“-g”。
· 只有在代码处于“运行”或“暂停”状态时才能查看变量值。
· 设置断点后程序在指定行之前停止。
1.工作环境相关命令
Gdb中不仅可以调试所运行的程序,而且还可以对程序相关的工作环境进行相应的
设定,甚至还可以使用 shell 中的命令进行相关的操作,其功能极其强大。
命 令 格 式 | 含 义 |
set args运行时的参数 | 指定运行时参数,如set args 2 |
show args | 查看设置好的运行参数 |
path dir | 设定程序的运行路径 |
show paths | 查看程序的运行路径 |
set enVironment var [=value] | 设置环境变量 |
show enVironment [var] | 查看环境变量 |
cd dir | 进入到dir目录,相当于shell中的cd命令 |
pwd | 显示当前工作目录 |
shell command | 运行shell的command命令 |
2. 设置断点与恢复命令
命 令 格 式 | 含 义 |
bnfo b | 查看所设断点 |
break 行号或函数名 <条件表达式> | 设置断点 |
tbreak 行号或函数名 <条件表达式> | 设置临时断点,到达后被自动删除 |
delete [断点号] | 删除指定断点,其断点号为“info b”中的第一栏。若缺省断点号则删除所有断点 |
disable [断点号]] | 停止指定断点,使用“info b”仍能查看此断点。同delete一样,省断点号则停止所有断点 |
enable [断点号] | 激活指定断点,即激活被disable停止的断点 |
condition [断点号] <条件表达式> | 修改对应断点的条件 |
ignore [断点号]<num> | 在程序执行中,忽略对应断点num次 |
step | 单步恢复程序运行,且进入函数调用 |
next | 单步恢复程序运行,但不进入函数调用 |
finish | 运行程序,直到当前函数完成返回 |
c | 继续执行函数,直到函数结束或遇到新的断点 |
3. gdb 中源码查看相关命令
命 令 格 式 | 含 义 |
list <行号>|<函数名> | 查看指定位置代码 |
file [文件名] | 加载指定文件 |
forward-search 正则表达式 | 源代码前向搜索 |
reverse-search 正则表达式 | 源代码后向搜索 |
dir dir | 停止路径名 |
show directories | 显示定义了的源文件搜索路径 |
info line | 显示加载到Gdb内存中的代码 |
4. gdb中查看运行数据相关命令
gdb中查看运行数据是指当程序处于“运行”或“暂停”状态时,可以查看的变量及表达式信息。
命 令 格 式 | 含 义 |
print 表达式|变量 | 查看程序运行时对应表达式和变量的值 |
x <n/f/u> | 查看内存变量内容。其中n为整数表示显示内存的长度,f表示显示 |
display 表达式 | 的格式,u表示从当前地址往后请求显示的字节数 |
5.Gdb 中修改运行参数相关命令
Gdb 还可以修改运行时的参数,并使该变量按照用户当前输入的值继续运行。它的设置方法为:在单步执行的过程中,键入命令“set 变量=设定值” 。这样,在此之后,程序就会按照该设定的值运行了。
gnu编译器——oracle_1010个人笔记
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论