本节书摘来自华章出版社《深入分析GCC 》一书中的第2章,第2.5节,作者 王亚刚 ,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.5 GCC调试选项

GCC本身对包含了众多的调试选项,既可以为用户程序生成调试信息,也可以将GCC运行过程中的关键信息保存在文件或输出在终端上,常用的调试选项如表2-2所示。如果需要了解GCC在处理的各个阶段里中间表示的具体内容,或者需要了解GCC中某个处理过程对于中间表示的处理细节时,就可以使用表2-2中给出的各种GCC调试选项,输出GCC运行过程中所生成的中间表示的调试信息和处理过程细节,并结合GCC的代码,从而了解GCC的具体工作细节。


假设有如下的源代码:

[GCC@localhost test]$ cat test.c
int main(){int i=0, sum=0;sum = sum + i;return sum;
}

为了了解GCC对该文件编译过程中的主要处理过程,可以使用如下命令输出GCC处理过程的主要调试信息和工作流程。

[GCC@localhost test]$ ~/paag-gcc/host-i686-pc-linux-gnu/gcc/cc1 -fdump-tree-all -fdump-rtl-all test.c
[GCC@localhost test]$ ls test.c*
test.c                   test.c.123t.optimized        test.c.168r.asmcons
test.c.001t.tu           test.c.125t.blocks           test.c.171r.subregs_of_mode_init
test.c.003t.original     test.c.126t.final_cleanup    test.c.172r.ira
test.c.004t.gimple       test.c.128r.expand           test.c.173r.subregs_of_mode_finish
test.c.006t.vcg          test.c.129r.sibling          test.c.176r.split2
test.c.007t.useless      test.c.131r.initvals         test.c.178r.pro_and_epilogue
test.c.010t.lower        test.c.132r.unshare          test.c.192r.stack
test.c.011t.ehopt        test.c.133r.vregs            test.c.193r.alignments
test.c.012t.eh           test.c.134r.into_cfglayout   test.c.196r.mach
test.c.013t.cfg          test.c.135r.jump             test.c.197r.barriers
test.c.014t.cplxlower0   test.c.154r.reginfo          test.c.200r.eh_ranges
test.c.015t.veclower     test.c.157r.outof_cfglayout  test.c.201r.shorten
test.c.021t.cleanup_cfg  test.c.163r.split1           test.c.202r.dfinish
test.c.023t.ssa          test.c.165r.dfinit           test.c.203t.statistics
test.c.038t.release_ssa  test.c.166r.mode_sw

可以看出,此时输出的各种调试文件名称格式为:test.c.nnn[r/t].name,其中nnn为一个编号,t表示该处理过程是基于tree的GIMPLE处理过程,r表示该处理过程是基于RTL的处理过程。如果读者关注函数控制流图(CFG,Control F?low Graph)的信息,那么可以打开test.c.013t.cfg文件,查看其中的具体内容。内容如下:

[GCC@localhost test]$ cat test.c.013t.cfg
;; Function main (main)
Merging blocks 2 and 3
main ()
{int sum;int i;int D.1234;<bb 2>:i = 0;sum = 0;sum = sum + i;D.1234 = sum;return D.1234;
}

其中就包含了例子中给出函数的控制流图,如果想了解更详细的CFG信息,也可以使用如下的编译形式:

[GCC@localhost test]$ ~/paag-gcc/host-i686-pc-linux-gnu/gcc/cc1 -fdump-tree-cfg-all test.c
[GCC@localhost test]$ cat test.c.013t.cfg
;; Function main (main)
Scope blocks:
{ Scope block #0 intD.0 iD.1232; (unused)intD.0 sumD.1233; (unused)
}
Pass statistics:
----------------
Merging blocks 2 and 3
main ()
{intD.0 sumD.1233;intD.0 iD.1232;intD.0 D.1234;# BLOCK 2# PRED: ENTRY (fallthru)iD.1232 = 0;sumD.1233 = 0;sumD.1233 = sumD.1233 + iD.1232;D.1234 = sumD.1233;return D.1234;# SUCC: EXIT
}

可以看出,GCC编译时会生成更加详细的CFG信息。
读者也可以根据自己的需要,合理地使用表2-2中的调试选项,输出GCC编译过程中感兴趣的调试信息,从而分析GCC的工作细节。

《深入分析GCC 》——2.5 GCC调试选项相关推荐

  1. Gcc编译链接及常用选项总结

    转载文章:http://www.franktly.com 前言 GNU CC(简称Gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C.C++和Object- C等语言编写的程序.Gcc ...

  2. GCC的编译和调试--入门介绍

    编译与调试 1.1编译的概念和理解 在进行C程序开发时,编译就是将编写的C语言代码变成可执行程序的过程,这一过程 是由编译器来完成的.编译器就是完成程序编译工作的软件,在进行程序编译时完成了一系 列复 ...

  3. gcc/g++ 命令的常用选项

    gcc/g++ 命令的常用选项 使用g++编译CPP文件如果用gcc编译C++源文件时,加以下选项:-lstdc++,否则使用了C++操作的文件编译会出错.假如在程序中用到new delete操作,而 ...

  4. gcc编译命令的常用选项——强烈推荐大家使用 -Wall 选项

    C程序编编译的过程分为如下四个阶段 1.预处理:头文件展开(#include).宏替换(#define).条件编译(#ifdef)(.i)使用预处理器(预处理阶段处理的都是以#开头的代码) 2.编译: ...

  5. Linux下gcc/g++编译器gdb调试器和makefile的使用

    文章目录 一.gcc的使用 gcc选项 二.gdb的使用 三.Linux项目自动化构建工具-make/Makefile 3.1 概念 3.2 使用 3.3 原理 一.gcc的使用 首先我们知道一个C/ ...

  6. arm linux gcc fpic,【待整理】Gcc中编译和链接选项 -fpic -fPIC -fpie -fPIE -pie的含义

    [待整理]Gcc中编译和链接选项 -fpic -fPIC -fpie -fPIE -pie的含义 -fpic Generate position-independent code (PIC) suit ...

  7. GCC Inline ASM GCC内联汇编

    GCC 支持在C/C++代码中嵌入汇编代码,这些汇编代码被称作GCC Inline ASM--GCC内联汇编.这是一个非常有用的功能,有利于我们将一些C/C++语法无法表达的指令直接潜入C/C++代码 ...

  8. C++:GCC编译:GCC编译C++程序分步流程

    C或者C++程序从源代码生成可执行程序的过程,需要经历4个过程分别是:预处理,编译,汇编,链接. 但考虑实际使用过程中,用户可能并不关心程序的执行结果,只是想快速得到最终的可执行程序,因此gcc和gc ...

  9. VScode检测到#include 错误,请更新includepath。已为此翻译单元 禁用波形曲线//gcc : 无法将“gcc”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。

    VScode检测到#include 错误,请更新includepath. 可能会遇到的问题: 1. VScode检测到#include 错误,请更新includepath. 2.gcc : 无法将&q ...

最新文章

  1. LeetCode实战:寻找两个有序数组的中位数
  2. m3u8 video ios h5_【H5】iOS系统下的video视频播放完后重新刷新视频
  3. 查看服务器cpu是否支持VT
  4. 树莓派4直接运行linux,树莓派4最小化安装Linux
  5. mysql链路跟踪工具_SkyWalking全链路追踪利器
  6. 运行Java程序时 Tomcat出错 显示端口被占用
  7. html 自定义打印模板,HTML+CSS入门 自定义模板详解
  8. linux系统时间代表,Linux上有两种时间,一种是硬件时间,一种是系统时间
  9. spm on mysql_Announcement: MySQL Performance Monitoring in SPM_MySQL
  10. 程序员伪装 AI 编程,竟骗来 2 亿的投资!
  11. POJ4001 HDU4121 UVA1589 UVALive5829 Xiangqi【模拟+回溯】
  12. 小木棍 [数据加强版]*
  13. Java POI 导出EXCEL经典实现 Java导出Excel弹出下载框(转载)
  14. java sdk怎么配置_Java SDK环境配置教程
  15. Latex复杂三线图的处理
  16. Java打包exe文件
  17. 加载mysql的jdbc驱动_JDBC驱动加载
  18. Krpano元素的一些解析
  19. flex布局 gird布局
  20. 植物大战僵尸自动拾取阳光

热门文章

  1. 解析教育机器人的综合应用能力
  2. B站up主排名丨B站2021年4月up主充电排行榜榜单发布!
  3. 被勒索后的72 小时“生死时速”
  4. 简单的命令控制同一局域网内的电脑
  5. vue2中使用VantUI
  6. 解决按钮失效问题-iOS小技巧
  7. ADAU1860调试心得(1)背景描述-耳机主动降噪芯片的调试
  8. Mybatis-plus LambdaQueryWrapper 模糊查询 like方法使用记录
  9. 《王者荣耀》新英雄金蝉携86版西游记联动皮肤登场,你期待吗?
  10. MySQL事务及实现原理全面总结,再也不用担心面试