コールグラフについて

静的/動的コールグラフ

本編で静的コールグラフと動的コールグラフという言葉について触れた。 この言葉は static call graph と dynamic call graph を直訳した だけなのだが、もしかすると一般には通用しないかもしれない。 どうも日本語だと dynamic call graph が「コールグラフ」、 static call graph が「関数呼び出し関係」と呼ばれることが多いようだ。

ちなみに、コールグラフのグラフ (graph) は 線グラフとか棒グラフとは関係ない。ソフトウェア工学で グラフと言ったら点を線で結んで作れる構造のことである。 線が矢印だと有向グラフ、ただの線だと無向グラフと言う。

グラフの視覚化

関数は呼び出す側と呼ばれる側の区別が明確にあるので、 呼び出し関係は有向グラフで表せる。それを図にして 見せてくれたらとてもわかりやすいのではないだろうか。 例えばこんなふうに。

(call graph)

これは eval.c の重要関数の静的コールグラフを図にしたものだ。

こういうものをコマンド一発で生成してくれると一番いいのだが、 直接的にそういうことをしてくれるツールはなかなかない。 そこでせめて役に立ちそうなツールを紹介しておく。

dot という言語でグラフを表現したものを渡すと、グラフを描いて 様々なフォーマットで出力してくれる。 対応フォーマットは PostScript、png、jpeg など。

さきほどの図も graphviz を使って生成したのだが、もちろん完全な全自動で はない。もし eval.c の関数をそのまま全部渡してしまうと、矢印が多すぎて 真っ黒な図になってしまう。そこでまずいらない関数、いらない関係を手動で 削り、その後の構造を dot に渡して生成した。その削る部分がどうしても自 動化できないのだ。小さいコマンド言語を作ることで数行書けばいいだけには なったのだが、そこからが難しい。結局人間の介入はある程度不可欠のようだ。

Copyright (c) 2002 Minero Aoki <aamine@loveruby.net>