《深入分析GCC 》——2.4 shell工具及graphviz绘图工具

2.4 shell工具及graphviz绘图工具

为了更好地分析GCC的运行过程,可以使用GCC支持的一些编译选项,例如,-fdump-tree-all、-fudmp-ipa-all、-fdump-rtl-all等,这样编译过程中将产生大量的中间运行结果信息,帮助用户理解GCC的处理细节。另外,用户也可以根据需要在源代码中增加适当的调试代码,从而输出一些运行时的中间信息。对这些输出结果进行高效分析,从中提取有价值的信息是GCC分析过程中非常关键的一种途径。
笔者认为,借助于Linux shell命令的强大字符串处理功能,可以极大地提高信息处理的效率。例如,可以使用grep对输出中的特定模式进行匹配,利用sed对输出的信息进行各种强大的编辑处理,包括替换、修改等,利用awk可以对输出结果进行进一步的处理。建议读者熟练使用grep、sed、awk等工具,并能熟练编写一些简单的处理脚本。
另一方面,图形直观生动,擅长展示逻辑关系,因此,为了说明问题,往往需要对处理结果进行图形方式的展示,graphviz提供的绘图工具(http://www.graphviz.org/)就是笔者进行GCC分析时常用的图形生成工具。
例如,对于如下的源代码test.c:

[GCC@host2 g2r]$ cat test.c
int global_int = 0;
int main(int argc, char *argv[])
{
int i;
static int static_sum=0;
int array[10]={0,1,2,3,4,5,6,7,8,9};

  for(i=global_int; i<10; i++){
        int j=i*2;
        static_sum = static_sum + j + array[i];
        if(static_sum>1000) goto Label_RET;
  }
Label_RET:
  return static_sum;
}

通过在GCC中增加调试代码,可以生成main函数的控制流图文件Control_F?low.dot。

[GCC@host2 g2r]$ cat Control_Flow.dot
digraph G {
  node [shape = record];
0 [label = "{ENTRY}"];
0 ->  2 [style=solid, label=fallthru];
2 [label = "{BB-2}"];
2 ->  6 [style=solid, label=fallthru];
3 [label = "{BB-3}"];
3 ->  4 [style=solid, label=true];
3 ->  5 [style=solid, label=false];
4 [label = "{BB-4}"];
4 ->  7 [style=solid, label=fallthru];
5 [label = "{BB-5}"];
5 ->  6 [style=solid, label=fallthru];
6 [label = "{BB-6}"];
6 ->  3 [style=solid, label=true];
6 ->  7 [style=solid, label=false];
7 [label = "{BB-7}"];
7 ->  8 [style=solid, label=fallthru];
8 [label = "{BB-8}"];
8 ->  1 [style=solid];
1 [label = "{EXIT}"];
}

显然,该控制流图是不直观、不容易理解的,然而通过将Control_F?low.dot中描述的逻辑关系转换成graphviz的图形脚本,就可以利用graphviz中dot工具生成其图示结果Control_F?low.png,



如图2-4所示。
`dot -Tpng -o Control_Flow.png Control_Flow.dot`
可以看出,使用图形表示可以非常直观地展示程序中的控制流程,也为代码分析提供了最直观形象的辅助。
再举一例。在分析GCC的AST生成及GIMPLE生成等过程中,需要了解AST节点的具体内容及其相互关系,此时,也可以通过对GCC生成的AST中间结果进行脚本的处理,并生成其图示结果,例如图2-5给出了上述源代码中sum=a+b语句对应的关键AST节点及其相互关系,该结果形象直观,节点之间的关系清晰,对于分析AST的生成和GIMPLE转换等都具有非常重要的意义。

图2-5 sum=a+b对应的AST片段图示

时间: 2024-10-06 22:42:01

《深入分析GCC 》——2.4 shell工具及graphviz绘图工具的相关文章

《深入分析GCC 》导读

前 言 GCC(GNU Compiler Collection,GNU编译器套件)是一套由GNU开发的程序设计语言编译工具,是GNU工程中最重要的组成部分.经过近30年的发展,GCC不仅支持众多的前端编程语言,还支持各种主流的处理器平台和操作系统平台,成为公认的跨平台编译器的事实标准,也成为编译器设计的成功典范. 作为一名GCC编译器的使用者和源码阅读的爱好者,我一直想写一本关于GCC的技术书. 2002年,我开始在Linux系统上进行一些软件开发,GCC就是我使用的编译工具.我一直对从源代码到

10款最佳HTML5绘图工具

  HTML5无疑是当前最受宠的一项技术,每个web设计者都在热烈的讨论这种神奇的标记语言的兴起.HTML5是一种学起来毫不费力的标记语言,但它却能提供迷人的.富有艺术性的特征,帮助web设计人员完成他们的构思想象.HTML5对于一个设计人员来说能毫不费力的理解,轻松的掌握. 草绘和制图是设计工作者工作中一个重要的特征.HTML5将会这方面显露出不可限量的前途. 今天,我给web设计人员收集了几款最好的HTML5绘图或涂鸦工具.这些绘图工具大多数是用HTML5画布(Canvas)实现的,部分辅以

《深入分析GCC 》——1.2 GCC的特点

1.2 GCC的特点 GCC作为目前较为成功的编译系统之一,具有非常突出的优点,主要包括: (1)GCC编译系统支持众多的前端编程语言,GCC 4.4.0中${GCC_SOURCE}/gcc/目录下包含了前端编程语言处理的目录及其代码(其中,${GCC_SOURCE}表示GCC源代码的主目录,下同),主要包括C.C++.Ada.Fortran.Java.Objective-C.Objective-C++等语言的前端处理,可以使用如下命令查看这些目录: [GCC@localhost gcc-4.4

利用Shell配合绘图工具GnuPlot图形化监控网络流量

网络流量的监控工具有很多,如:Mrtg.Cacti.Zabbix等等,他们都有着各自的特点,不同的侧重,只为适合不同的应用场景的各种特殊需求.除了网络流量监控工具以外,还有Nagios这样的监控主机状态的工具,不仅能有效监控Windows.Linux和Unix的主机状态,交换机路由器等网络设置,打印机等.还能在系统或服务状态异常时发出邮件或短信报警第一时间通知网站运维人员,在状态恢复后发出正常的邮件或短信通知等功能.除此之外Nagios简单地插件设计使得用户可以方便地扩展自己服务的检测方法.也正

脚本绘图工具总结(转)

我们总是要写各种文档,演示各种PPT,写各种博客,其中都少不了需要作出一些图形,用于形象的展示出想要表达的信息.Windows自带的画图.Paint.Net,Visio.Rose等各种工具,只要有足够的耐心,并且对这些工具足够熟悉,都可以做出各种强大.各种类型的图形. 但是我作为程序员,非常不擅长这种用鼠标操作的作图工具,迫切需要一款用键盘敲出来的脚本绘图工具,就像写文档时,不喜欢用Word而是用Markdown一样. 经过了解,总算是找到了一些这样的工具,下面分别介绍一下. graphviz

FW MX 2004教程(2):绘图工具

教程 和许多主流的图像处理软件一样,Fireworks的绘图工具主要都集中在"工具条"上.利用这些工具可以绘制出各种图形,并可为其设置相应的属性,如颜色.大小.位置等等. Fireworks MX 2004的"工具条"中增加了不少新工具,并与原有的工具在一起被编排为六个类别:选择区.位图.矢量.Web.颜色和视图区.有些工具按钮的右下角有一个小三角,说明这个工具包含有其它几种不同的工具,按住这个工具按钮不放就能显示其它的工具. 我们先来介绍位图区的绘图工具. 1.选

Flash 8 新功能使用技巧实战(4):绘图工具

技巧 上一节:Flash 8 新功能实例使用技巧(3):混合模式 第四部分:Flash 8 绘图工具的改进 Flash 8 的绘图工具也有了一些改进,虽然没有重大功能的改变,但是在细节处理上增添了许多方便我们绘制线条或图形的功能,在本节中,我们就来详细了解这些功能的改进.(下载本文的实例源文件, 9KB) 1.对象的绘制 在以前版本的Flash中,如果我们使用绘图工具绘制两个重叠但不互相结合到一起的对象时,需要分别将两个对象转换为元件,或者单独放在两个图层中才可以实现,否则两个对象会重叠联合在一

外链查链工具新贵族 SEOMOZ工具

  雅虎yahoo外链查询不了,怎么办?雅虎外链工具关闭后我们还能用什么?外链查链工具新贵族,SEOMOZ工具.那这个工具究竟是如何使用呢?今天来简单的看下: 首先:打开opensiteexplorer.org,输入网址以百度为例:   从最上面,Page Authrity 表示的是页面权重,domain authority表示域名权重,linking root domains表示的是有效链接数(不包括301.nofollow等)total links表示总的外链数量.Fackbook shar

用Word 2003绘图工具制作树状结构图

近日,同事找到我说要在Word 2003中制作一个树状结构图,虽然常听说树状结构,却没有真正的制作过.但是想到Microsoft Office作为办公软件中的龙头老大,一定会把这个功能集成到软件中,经过一番摸索后,终于在Word中找到了制作树状结构的方法. 在"绘图"工具栏上,单击"插入组织结构图或其他图示",如图1所示,在接着出现的"图示库"中选择"用于显示层次关系"的第一种后,单击"确定"按钮后会出现一