调试选项(DEBUGGING OPTION)
GNU CC拥有许多特别选项,既可以调试用户的程序,也可以对GCC排错:- -g
- 以操作系统的本地格式(stabs, COFF, XCOFF,或DWARF).产生调试信息. GDB能够使用这些调试信息.
在大多数使用stabs格式的系统上, `-g'选项启动只有GDB才使用的额外调试信息;这些信息使GDB 调试效果更好,但是有可能导致其他调试器崩溃,或拒绝读入程序.如果你确定要控制是否生成额外的信息, 使用`-gstabs+', `-gstabs', `-gxcoff+', `-gxcoff', `-gdwarf+',或`-gdwarf' (见下文).
和大多数C编译器不同, GNU CC允许结合使用`-g'和`-O'选项.优化的代码偶尔制造 一些惊异的结果:某些声明过的变量根本不存在;控制流程直接跑到没有预料到的地方;某些语句因为计算结果是常量或已经确定而 没有执行;某些语句在其他地方执行,因为他们被移到循环外面了.
然而它证明了调试优化的输出是可能的.对可能含有错误的程序使用优化器是合理的.
如果GNU CC支持输出多种调试信息,下面的选项则非常有用.
- -ggdb
- 以本地格式(如果支持)输出调试信息,尽可能包括GDB扩展.
- -gstabs
- 以stabs格式(如果支持)输出调试信息,不包括GDB扩展.这是大多数BSD系统上DBX使用的格式.
- -gstabs+
- 以stabs格式(如果支持)输出调试信息,使用只有GNU调试器(GDB)理解的GNU扩展.使用这些扩展有可能导致 其他调试器崩溃或拒绝读入程序.
- -gcoff
- 以COFF格式(如果支持)输出调试信息.这是在System V第四版以前的大多数System V系统上SDB使用的 格式.
- -gxcoff
- 以XCOFF格式(如果支持)输出调试信息.这是IBM RS/6000系统上DBX调试器使用的格式.
- -gxcoff+
- 以XCOFF格式(如果支持)输出调试信息,使用只有GNU调试器(GDB)理解的GNU扩展.使用这些扩展有可能导致 其他调试器崩溃或拒绝读入程序.
- -gdwarf
- 以DWARF格式(如果支持)输出调试信息.这是大多数System V第四版系统上SDB使用的格式.
- -gdwarf+
- 以DWARF格式(如果支持)输出调试信息,使用只有GNU调试器(GDB)理解的GNU扩展.使用这些扩展有可能导致 其他调试器崩溃或拒绝读入程序.
-glevel
-ggdblevel
-gstabslevel
-gcofflevel -gxcofflevel
- -gdwarflevel
- 请求生成调试信息,同时用level指出需要多少信息.默认的level值是2.
Level 1输出最少量的信息,仅够在不打算调试的程序段内backtrace.包括函数和外部变量的描述,但是 没有局部变量和行号信息.
Level 3包含更多的信息,如程序中出现的所有宏定义.当使用`-g3'选项的时候,某些调试器支持 宏扩展.
- -p
- 产生额外代码,用于输出profile信息,供分析程序prof使用.
- -pg
- 产生额外代码,用于输出profile信息,供分析程序gprof使用.
- -a
- 产生额外代码,用于输出基本块(basic block)的profile信息,它记录各个基本块的执行次数,供诸如 tcov此类的程序分析.但是注意,这个数据格式并非tcov期待的.最终GNU gprof 将处理这些数据.
- -ax
- 产生额外代码,用于从'bb.in'文件读取基本块的profile参数,把profile的结果写到'bb.out' 文件. `bb.in'包含一张函数列表.一旦进入列表中的某个函数, profile操作就开始,离开最外层的函数后, profile操作就结束.以`-'为前缀名的函数排除在profile操作之外.如果函数名不是唯一的,它可以写成 `/path/filename.d:functionname'来澄清. `bb.out'将列出一些有效的文件名.这四个函数名具有 特殊含义: `__bb_jumps__'导致跳转(jump)频率写进`bb.out'. `__bb_trace__'导致基本块序列通过 管道传到`gzip',输出`bbtrace.gz'文件. `__bb_hidecall__'导致从跟踪(trace)中排除call 指令. `__bb_showret__'导致在跟踪中包括返回指令.
- -dletters
- 编译的时候,在letters指定的时刻做调试转储(dump).用于调试编译器.大多数转储的文件名 通过源文件名添加字词获得(例如`foo.c.rtl'或`foo.c.jump').
- -dM
- 预处理结束的时候转储所有的宏定义,不输出到文件.
- -dN
- 预处理结束的时候转储所有的宏名.
- -dD
- 预处理结束的时候转储所有的宏定义,同时进行正常输出.
- -dy
- 语法分析(parse)的时候在标准错误转储调试信息.
- -dr
- RTL阶段后转储到`file.rtl'.
- -dx
- 仅对函数生成RTL,而不是编译.通常和`r'联用.
- -dj
- 第一次跳转优化后转储到`file.jump'.
- -ds
- CSE (包括有时候跟在CSE后面的跳转优化)后转储到`file.cse'.
- -dL
- 循环优化后转储到`file.loop'.
- -dt
- 第二次CSE处理(包括有时候跟在CSE后面的跳转优化)后转储到`file.cse2'.
- -df
- 流程分析(flow analysis)后转储到`file.flow'.
- -dc
- 指令组合(instruction combination)后转储到`file.combine'.
- -dS
- 第一次指令安排(instruction schedule)后转储到`file.sched'.
- -dl
- 局部寄存器分配后转储到`file.lreg'.
- -dg
- 全局寄存器分配后转储到`file.greg'.
- -dR
- 第二次指令安排(instruction schedule)后转储到`file.sched2'.
- -dJ
- 最后一次跳转优化后转储到`file.jump2'.
- -dd
- 推迟分支调度(delayed branch scheduling)后转储到`file.dbr'.
- -dk
- 寄存器-堆栈转换后转储到`file.stack'.
- -da
- 产生以上所有的转储.
- -dm
- 运行结束后,在标准错误显示内存使用统计.
- -dp
- 在汇编输出加注指明使用了哪些模式(pattern)及其替代模式.
- -fpretend-float
- 交叉编译的时候,假定目标机和宿主机使用同样的浮点格式.它导致输出错误的浮点常数,但是在目标机上运行的时候, 真实的指令序列有可能和GNU CC希望的一样.
- -save-temps
- 保存那些通常是``临时''的中间文件;置于当前目录下,并且根据源文件命名.因此,用`-c -save-temps'选项编译`foo.c '会生成` foo.cpp'和`foo.s' 以及`foo.o'文件.
- -print-file-name=library
- 显示库文件library的全路径名,连接时会使用这个库---其他什么事情都不作.根据这个选项, GNU CC既不编译,也不连接,仅仅显示文件名.
- -print-libgcc-file-name
- 和`-print-file-name=libgcc.a'一样.
- -print-prog-name=program
- 类似于`-print-file-name',但是查找程序program如`cpp'.
评论