背景
C语言函数调用关系图可以通过ide比如sourceinsight或者understand的关系生成。但是修改便利性不高。
graphviz提供提供了draw图的功能
原理
c语言的rtl(register transfer language)提供了汇编前的一种关系表达
gcc通过 编译选项增加 --fdump-rtl-expand,会额外生成 xxx.rtl.expand文件
egypt是一个开源工具,能够读取rtl文件,然后分rtl文件,根据调用关系生成graphviz的dot格式的关系图
流程
egypt下载和编译
下载:http://www.gson.org/egypt/download/egypt-1.10.tar.gz
编译和解压:
tar -zvxf egypt-1.10.tar.gz
cd egypt-1.10
perl Makefile.PL
make
make install
egypt如何生成一个图
egypt默认处理一个文件,可以通过结合awk等方式生成所有文件
egypt `find . -name "*.expand"` 2>/dev/null | awk '{if (NR>1) if($0!="}") print $0 }' | awk 'BEGIN{print "digraph callgraph {\nnode [shape=box, fontcolor=blue];\nrankdir=LR;"} {print $0} END{print "}"}'
查找所有expand文件
将stderr输出到null
第一行不打印,最后一行}不打印(因为egypt默认前面是定义dot头,现在放到awk中)
输入给awk
awk开始打印dot文件头 定义形状和color和方向
awk打印输出信息
awk结尾打印}
然后将生成的文档拷贝到Graphviz工具软件中转义出来
后记
egypt的高级功能可以自己开发处理。
核心是egypt能够从rtl读出关系,生成dot
dot文件给Graphviz组合提供了非常灵活的生成图的方式