《深入分析GCC 》——2.4 shell工具及graphviz绘图工具-阿里云开发者社区

开发者社区> 华章计算机> 正文

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

简介:
+关注继续查看

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

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,


4292e3c4a481971aac0cacd07d69bec34a9b568f
如图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转换等都具有非常重要的意义。


15035f5d3cd68d79f4b2f2857f5b327ff19d0f11

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
使用下载工具
今天是玩 SUSE 10的第 二 天装的 软件如下:    suse 10体验版     Eclipse 3.
614 0
[开源] 分享导出博客园文章成本地 Markdown 文件存储的工具
此文主要分享了如何将自己博客园的文章自动导出到 Markdown 文档进行存储,以便在本地进行归档管理,程序中也对文章的分类、tag、代码块以及文章中的图片进行了保存处理,以便上传到自己的图。 整理后的 Markdown 可以在本地整理成册或者发布到自己的个人博客上,比如我使用 Markdown 书写的 个人博客 。
822 0
多进程监控自动关机工具升级远程关闭多台server——C# works with PowerShell
之前给单位做过一个多进程监控的自动关机工具,详见那篇blog。 这次领导又加了需求,说要等进程监控结束后,不止需要关闭主控端server,还需要关闭其他servers。于是就用到了我上篇文章所介绍的知识——通过PowerShell来远程管理计算机。
937 0
表格存储命令行工具CLT( cli python)
由于之前使用驻云科技的Cli,遇到较多的问题,关键是版本也没有及时更新,使用起来比较吃力。所以我这边利用业余的写了一个表格存储的命令工具,提供给大家使用。
2002 0
Win软件私家珍藏-常用软件工具使用总结
原文:Win软件私家珍藏-常用软件工具使用总结 Windowns常用软件 看图 FastStoneImageViewer 免费软件,好用到爆!没广告!功能齐全!不光能看图,还能修图! Picasa3 谷歌家的图片管理软件 文件搜索 Listary 小众软件介绍,超...
1230 0
《数据分析实战 基于EXCEL和SPSS系列工具的实践》一第2章 数据分析的理论、工具、模型
记得在我上研究生的时候,曾经有一位老师问我,什么是足球的“越位”?我很奇怪他为什么问这个问题,他说看世界杯转播老是在说越位,但他不知道啥意思。而我上大学的时候特别喜欢踢球,大学毕业之后也经常踢球,所以“越位”对我来说再简单不过了,只是没想到一位智力超群、知识渊博的大学老师却并不知晓,所以这件事给我留下了深刻的印象。
1940 0
cluvfy(Cluster Verification Utility,集群检验工具),简称CVU,cvuqdisk包
cluvfy(Cluster Verification Utility,集群检验工具),简称CVU,cvuqdisk包 A Cluster Verification Utility Reference     ...
795 0
GraphScope 图分析引擎 - GRAPE 介绍
GraphScope 中的图分析引擎继承自 GRAPE,该系统实现了论文 Parallelizing Sequential Graph Computations 中提出的不动点计算模型
173 0
10059
文章
0
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载