一、GCC 编译器
1. 什么是 GCC
GCC 是 GNU Compiler Collection (GNU 编译器套装)的简称,目前 GCC 可以支持 C,C++,ADA,JAVA,Fortran,PASCAL 等多种高级语言。支持主流的 CPU 平台,完成从源程序向特定 CPU 硬件平台上自标代码的转换。
2. GCC 编译流程
2.1 方法一:四步完成编译
1)预处理
对包含的头文件(#include)和宏定义(#define、#ifdef等)进行处理。可以使用 gcc 的选项 -E 让 gcc 在预处理结束后停止编译过程。
gcc -E filename.c -o filename.i
2)编译
gcc 首先检查代码的规范性、是否有语法错误等,以确定代码实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。用户可以使用 -S 选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
gcc -S filename.i -o filename.s
3)汇编
将编译阶段生成的 .s 文件转成目标文件,用选项 -c 只产生目标代码,不链接。
gcc -c filename.s -o filename.o
4)链接
将库链接进来生成可执行文件,可执行文件没有统一的后缀名。如果 GCC 编译时没有 使用 -o 选项明确给出输出文件名,则系统自动生成一个 a.out 的可执行文件。
gcc filename.o -o filename
2.2 方法二: 单步完成编译
gcc filename.c -o filename
2.3 运行
./filename
2.4 GCC 总体选项列表
选项名 | 含义 |
---|---|
-E | 只进行预编译,不进行其它处理 |
-S | 只是编译,不汇编;生成汇编文件 |
-c | 只是编译,不链接;生成目标文件 .o |
-g | 在可执行程序中包含标准调试信息 |
-o file | 把输出文件输出到 file |
-v | 输出 GCC 的版本信息 |
-I dir | 在头文件的搜索路径列表中添加 dir 目录 |
-L dir | 在库文件的搜索路径列表中添加 dir 目录 |
-static | 链接静态函数库 |
-library | 链接名字为 library 的库文件 |
二、GDB 调试器
1. 什么是 GDB
GDB (GNU Debugger) 是 GNU 开发的一款调试器,在 Linux/UNIX 编程调试中应用广泛。要想使用 GDB 对程序进行调试,必须在对源码进行编译的时候,使用 -g 编译选项开关。
2. GDB 使用流程
1)使用 -g 选项编译源程序
gdb 调试的不是 .c 的源代码文件,而是可执行文件,因此要调试一个文件,应该先使用 gcc 工具编译成可执行文件。
gcc -g filename.c -o filename
2)进入 gdb 调试环境
gdb filename
3)查看文件
在列出的源代码中,给出了行号
(gdb) l
4)设置断点
在源代码的第14行设置断点。利用行号设置断点,代码运行到该行之前停止
(gdb) b 14
5)查看断点情况
(gdb) info b
6)运行代码
(gdb) r
7)查看变量值
查看变量 a 当前的值
(gdb) p a
8)单步运行
两种方式:n(next)或 s(step)。遇到函数调用时 s 会进入到函数内部,n 不会进入。
(gdb) n
(gdb) s
9)继续运行程序
(gdb) c
10)退出调试
(gdb) q
3. GDB 常用命令
命令 | 描述 |
---|---|
file | 指定要调试的可执行程序 |
kill | 终止正在调试的可执行程序 |
list | 部分列出源程序 |
step | 单步调试,并进入函数内部 |
next | 单步调试,不进入函数内部 |
run | 运行当前调试的可执行程序 |
quit | 退出 gdb |
watch | 检查一个变量 |
打印表达式的值到标准输出 | |
break N | 在指定第 N 行插入断点 |
info break | 显示当前断点信息 |
info files | 显示被调试程文件信息 |
info func | 显示所有的函数名 |
info local | 显示当前函数中局部变量信息 |
info prog | 显示被调试程序的执行状态 |
clear N | 清楚第 N 行的断点 |
make | 在不退出 gdb 使用 make 命令 |
shell | 在不退出 gdb 使用 shell 命令 |
continue | 继续执行正在调试的程序 |
disable N | 关闭第 N 行的断点 |
enable N | 开启第 N 行的断点 |