gcc

gcc简介

GNU编译器套装(英语:GNU Compiler Collection,缩写为GCC),指一套编程语言编译器,以GPL及LGPL许可证所发行的自由软件,也是GNU计划的关键部分,也是GNU工具链的主要组成部分之一。GCC(特别是其中的C语言编译器)也常被认为是跨平台编译器的事实标准。可处理C、C++、Fortran、Pascal、Objective-C、Java、Ada,Go等其他语言。——Wiki

gcc编译流程

GCC 编译器在编译一个C语言程序时需要经过以下 4 步:

  1. (-E)将C语言源程序预处理,生成.i文件。
  2. (-S)预处理后的.i文件编译成为汇编语言,生成.s文件。
  3. (-c)将汇编语言文件经过汇编,生成目标文件.o文件。
  4. 将各个模块的.o文件链接起来生成一个可执行程序文件。

注:

  1. .i文件、.s文件、.o文件可以认为是中间文件或临时文件,如果使用 GCC 一次性完成C语言程序的编译,那么只能看到最终的可执行文件。中间文件被删除。
  2. 每一个步骤生产的文件都可以直接从.c 文件执行对应得命令后直接生成,不必按顺序。(到底还是按顺序,只是系统把它们删了)
gcc编译选项 选项的意义
-c 编译、汇编指定的源文件,但是不进行链接
-S 编译指定的源文件,但是不进行汇编
-E 预处理指定的源文件,不进行编译
-o [file1] [file2] 将文件 file2 编译成可执行文件 file1
-I directory 指定 include 包含文件的搜索目录
-g 生成调试信息,该程序可以被调试器调试

直接编译:gcc hello.c -o hello,生成hello可执行文件可直接运行。

gdb

gdb简介

GNU调试器(英语:GNU Debugger,缩写:GDB),是GNU软件系统中的标准调试器,此外GDB也是个具有移携性的调试器,经过移携需求的调修与重新编译,如今许多的类UNIX操作系统上都可以使用GDB,而现有GDB所能支持调试的编程语言有C、C++、Pascal以及FORTRAN。——Wiki

在用gcc编译时要加上-g选项,生成的可执行文件才能用gdb进行源码级调试

单步执行和跟踪

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ gcc -g main.c -o main
$ gdb main
# 进入gdb调试
$ (gdb) list 1 # list命令从第一行开始列出源代码,单纯list或l列出10行
$ (gdb) next # next或n——单条执行指令。next 3 运行到当前位置的后三行
$ (gdb) start #程序再次启动调试
$ (gdb) step #step或s——进入函数内部跟踪执行

$ (gdb) backtrace #backtrace或bt查看函数调用的栈帧
$ (gdb) frame 1 # 选择1号栈帧
$ (gdb) info locals # info或i查看当前栈帧中变量的值

$ (gdb) print value # print或p——打印变量value的值,变量也可以是表达式
$ (gdb) finish # 让当前程序一直运行到当前函数返回为止
$ (gdb) set var sum=0 # 在gdb中给变量sum设值
$ (gdb) run # run或r——直接运行程序
$ (gdb) quit # quit或q退出gdb

-g选项的作用是在可执行文件中加入源代码的信息,比如可执行文件中第几条机器指令对应源代码的第几行,但并不是把整个源文件嵌入到可执行文件中,所以在调试时必须保证gdb能找到源文件。

gdb提供了一个很方便的功能,在提示符下直接敲回车表示重复上一条命令。


参考文献

评论

载入天数...载入时分秒...