天天看点

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

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

为了更好地分析gcc的运行过程,可以使用gcc支持的一些编译选项,例如,-fdump-tree-all、-fudmp-ipa-all、-fdump-rtl-all等,这样编译过程中将产生大量的中间运行结果信息,帮助用户理解gcc的处理细节。另外,用户也可以根据需要在源代码中增加适当的调试代码,从而输出一些运行时的中间信息。对这些输出结果进行高效分析,从中提取有价值的信息是gcc分析过程中非常关键的一种途径。

笔者认为,借助于linux shell命令的强大字符串处理功能,可以极大地提高信息处理的效率。例如,可以使用grep对输出中的特定模式进行匹配,利用sed对输出的信息进行各种强大的编辑处理,包括替换、修改等,利用awk可以对输出结果进行进一步的处理。建议读者熟练使用grep、sed、awk等工具,并能熟练编写一些简单的处理脚本。

例如,对于如下的源代码test.c:

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

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

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

如图2-4所示。

<code>dot -tpng -o control_flow.png control_flow.dot</code>

可以看出,使用图形表示可以非常直观地展示程序中的控制流程,也为代码分析提供了最直观形象的辅助。

再举一例。在分析gcc的ast生成及gimple生成等过程中,需要了解ast节点的具体内容及其相互关系,此时,也可以通过对gcc生成的ast中间结果进行脚本的处理,并生成其图示结果,例如图2-5给出了上述源代码中sum=a+b语句对应的关键ast节点及其相互关系,该结果形象直观,节点之间的关系清晰,对于分析ast的生成和gimple转换等都具有非常重要的意义。

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

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

继续阅读