目录
- 一、GCC和GDB
-
- 1.1 GCC编译器
-
- 1.1.1 GNU工具
- 1.1.2 GCC简介
- 1.1.3 编译器的主要组件
- 1.1.4 gcc的基本用法
- 1.1.5 gcc的错误类型及对策
- 1.1.6 GCC编译过程
- 1.2 GDB调试工具
一、GCC和GDB
1.1 GCC编译器
1.1.1 GNU工具
编译工具:把一个源程序编译为一个可执行程序 调试工具:能对执行程序进行源码或汇编级调试 软件工程工具:用于协助多人开发或大型软件项目的管理,make,CVS,Subvision 其他工具:用于把多个目标文件链接成可执行文件的链接器,或者用作格式转换的工具
1.1.2 GCC简介
全称为GNU CC,GNU项目中符合ANSI C标准的编译系统 编译如C,C++,Object C, JAVA, Fortran,Pascal,Modula-3 和Ada等多种语言 GCC是可以在多种硬件平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率高百分之20-30 一个交叉平台编译器,适合在嵌入式领域的开发编译
gcc所支持后缀名解释
- .c C原始程序
- .C/.cc/.cxx C++原始程序
- .h 预处理文件(头文件)
- .i 已经过预处理的C原始程序
- .ii 已经过预处理的C++原始程序
- .s/.S 汇编语言原始程序
- .o 目标文件
- .a/.so 编译后的库文件
1.1.3 编译器的主要组件
1.1.4 gcc的基本用法
- -c ,只编译,不连接成为可执行文件,编译器只是由输入的.c 等源代码文件生成 .o 为后缀的目标文件,通常用于编译不包含主程序的子程序文件
- -o , output_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名,如果不给出这个选项,gcc就给出预设的可执行文件 a.out
- -g , 产生符号调试工具(GNU的gdb)所必要的符号资讯,要想对源代码进行调试,我们就必须加入这个选项。
- -O , 对程序进行优化编译、连接采、采样这个选项,整个源代码会在编译,连接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译,连接的速度就相对应的要慢一些。
- -O2, 比 -O更好的优化编译,连接,当然整个编译,连接过程会更慢。
- -l , dirname,将dirname所指出的目录加入到程序头文件目录列表中,是在预编译过程中使用的参数。
- -L, dirname,将 dirname所指出的目录加入到程序函数档案库文件的目录列表中,是在链接过程中使用的参数。
1.1.5 gcc的错误类型及对策
第一类:C语法错误 错误信息:文件source.c中 的第几行有语法错误(syntex error)。
有一些情况下,一个很简单的语法错误,gcc会给报错一大堆错误,我们最主要的就是要保持头脑清醒,不要被其吓到
必要的时候再参考C语言的基本教材。
第二类:头文件错误 错误信息:找不到头文件head.h (Can not find include file head.h)
这类错误是源代码文件中的包含的头文件有问题,可能的原因有头文件名错误、指定的头文件所在目录名错误等
也可能是错误的使用了双引号和尖括号。
第三类:档案库错误 错误信息:链接程序找不到所需的函数库(ld: -lm : No such file or directory)。
这类错误是与目标文件相连接的函数库有错误,可能的原因是函数库名错误,指定的函数库所在目录名称错误等
检查的方法是使用find命令在可能的目标中寻找相应的函数库名,确定档案库以及目录的名称并修改程序中及编译选项的名称。
第四类:未定义符号 错误信息:有未定义的符号(Undefined symbol)
这类错误是在链接的过程中出现的。可能有两种原因,一是使用者自己定义的函数或者全局变量所在源代码文件
没有被编译、连接,或者干脆还没有定义;二是未定义的符号是一个标准的库函数的名称,或者是该档案库的目录名称有问题
这时需要使用档案库维护命令ar检查我们的库函数到底位于哪一个函数库中,确定之后,修改Gcc连接项目中的-l 和-L项。
1.1.6 GCC编译过程
GCC的编译流程分为四个步骤: 1、预处理(Pre-Processing) 2、编译(Compiling) 3、汇编(Assembling) 4、链接(Linking) 
1.2 GDB调试工具
首先使用GDB进行调试,注意一定要加上选项 ‘-g’
- 查看文件(gdb) l
- 设置断点(gdb) b 6
- 查看断点情况(gdb) i b
- 运行代码(gdb) r
- 查看变量值(gdb) p n
- 单步运行(gdb) n (gdb) s
- 恢复程序运行(gdb) c
- 帮助(gdb)help [command]
- 查看函数调用栈(当程序崩溃或暂停时很有用) bt
- 退出 GDB(gdb) q
只有在代码处于 ”运行“ 或 ”暂停“ 状态时才能查看变量值
设置断点程序在指定行之前停止
常用 GDB 命令详解
| l | list | 列出源代码。默认显示当前函数附近10行;可加行号如 l 1,20 查看1~20行。 |
| b 6 | break 6 | 在第6行设置断点。也可对函数设断点:b main。 |
| i b | info breakpoints | 查看所有断点信息 |
| r | run | 开始运行程序(遇到断点会暂停)。 |
| p n | print n | 打印变量 n 的当前值。支持表达式,如 p a + b。 |
| n | next | 单步执行(不进入函数内部)。 |
| s | step | 单步执行(会进入函数内部)。 |
| c | continue | 继续运行程序,直到下一个断点或程序结束。 |
| bt | backtrace | 查看函数调用栈(当程序崩溃或暂停时很有用)。 |
| q | quit | 退出 GDB。 |





