博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《深入分析GCC 》——2.4 shell工具及graphviz绘图工具
阅读量:5742 次
发布时间:2019-06-18

本文共 1985 字,大约阅读时间需要 6 分钟。

本节书摘来自华章出版社《深入分析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提供的绘图工具()就是笔者进行GCC分析时常用的图形生成工具。
例如,对于如下的源代码test.c:

[GCC@host2 g2r]$ cat test.cint 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.dotdigraph 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片段图示

转载地址:http://vpszx.baihongyu.com/

你可能感兴趣的文章
POJ 2236 Wireless Network (并查集)
查看>>
python分类
查看>>
GitBlit (1)-- 在linux 安装 GitBlit 并运行
查看>>
程序是如何执行的(一)a=a+1
查看>>
18 已知下面的字符串是通过RANDOM随机数变量md5sum|cut-c 1-8截取后的结果
查看>>
BZOJ - 3578: GTY的人类基因组计划2
查看>>
爱——无题
查看>>
分布式服务框架原来与实践 读书笔记一
查看>>
【http】post和get请求的区别
查看>>
TFS强制撤销某个工作区的文件签出记录
查看>>
EL表达式无法显示Model中的数据
查看>>
ps6-工具的基础使用
查看>>
灵活运用 SQL SERVER FOR XML PATH
查看>>
linux下使用过的命令总结(未整理完)
查看>>
时间助理 时之助
查看>>
英国征召前黑客组建“网络兵团”
查看>>
Silverlight 2.5D RPG游戏“.NET技术”技巧与特效处理:(十二)魔法系统
查看>>
PHP 命令行模式实战之cli+mysql 模拟队列批量发送邮件(在Linux环境下PHP 异步执行脚本发送事件通知消息实际案例)...
查看>>
pyjamas build AJAX apps in Python (like Google did for Java)
查看>>
LAMP环境搭建1-mysql5.5
查看>>