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