egypt と GraphViz で Call Graph を描く

egypt と GraphViz で Call Graph を描く

RTL 出力のプリフィックスを修正。数値はインクリメントされるみたい。2010/9/13
コマンドが微妙に間違っていたのを修正した。2010/1/20
-dr の付加について書き換えた。2010/1/20
RTL を吐くオプションについての記述が抜けていたので追加した。 2009/5/10

日頃は GNU Global に html を吐かせて使用しているのだが、たまに Call Graph で見たい場合もある。現在はクロス開発をしているので静的に生成できるものを探したところ egypt が良さそうなので使ってみることにした。

egypt
http://www.gson.org/egypt/
GraphViz
http://www.graphviz.org/

egypt は gcc の RTL(Register Transfer Language) を元に GraphViz の dot ファイルを生成する簡単なスクリプトである。RTL を利用するために Makefile

CC = gcc -dr

として、*.expand ファイルを生成する必要がある。
GraphViz と egypt をインストールして

$ egypt `find ./ -name "*.expand"` | dot -Gsize=100,100 -Grankdir=LR -Tsvg -o callgraph.svg

とすると SVG の Call Graph が生成される。

当然 libc の呼び出しも描かれるが、邪魔な場合は

for i in `find . -name *.expand`
do
    cat $i | sed -e "/printf/d" > $i.mod
done

とかして RTL から libc の関数を削除すればなんとかなる。

Call Graph を見るときは ZgrViewer を使うと拡大/縮小やノードの追跡ができるので比較的便利だと思うが、ノードのハイライトを固定できないなどイマイチな点もある。

ZgrViewer
http://zvtm.sourceforge.net/zgrviewer.html

ここの記述を参考にした。
http://nion.modprobe.de/blog/archives/556-creating-dynamic-function-call-graphs.html