Graphviz + pvtrace

人の書いたソースコードを最初に読むのは結構大変である。そんなわけで前から気にかけていたが Graphvizを今回試してみる事にした。グラフ定義のテキストファイルをグラフ画像に展開するソフトウェアツールである。Graphviz 以外に必要なものは pvtraceがある。簡単なソフトウェアで実行時の関数呼び出しのトレースログをグラフ定義のテキストファイルに落とすためのものである。またコンパイラgcc 専用のようである。
きっかけは IBMdeveloperWorksにあった紹介記事を読んで使ってみようと思ったのである。詳しい解説はそこを読んで欲しい。pvtrace と Graphviz のインストールが無事に済んだとする。その後のグラフ画像作成の簡単な段取りは以下のとおりである。

  1. gcc への コンパイラオプションに -finstrument-functions を加え、解析対象の依存ファイルに pvtrace のパッケージに含まれている instrument.c を加える。
  2. 解析対象の実行ファイルを仮に testHoge とする。上記の設定をでコンパイル。そして、いちど testHoge を実行する。
  3. 実行したディレクトリに trace,txt が出来ている。それを確認して、pvtrace testHoge としてグラフ定義のテキストファイル(graph.dot)を作成する。(コマンドラインで pvtrace testHoge と打ち込む)
  4. 生成されたグラフ定義のテキストファイルに対して、graphviz の dot コマンドを適用する。出力グラフ画像名は testHoge.jpg とする。(コマンドラインで dot -Tjpg graph.dot -o testHoge.jpg と打ち込む)
  5. 完成。

コマンドラインでの処理でみるなら以下の通りである。

 1:  $ ls
 2:  instrument.c    testHoge.c
 3:  $ gcc -g -finstrument-functions testHoge.c instrument.c -o testHoge
 4:  $ ./testHoge
 5:  $ ls
 6:  instrument.c     testHoge.c
 7:  testHoge             trace.txt
 8:  $ pvtrace testHoge
 9:  $ ls
10:  graph.dot        testHoge           trace.txt
11:  instrument.c     testHoge.c
12:  $ dot -Tjpg graph.dot -o testHoge.jpg
13:  $ ls
14:  graph.dot        instrument.c   testHoge.c
15:  testHoge.jpg        testHoge           trace.txt
16:  $

何事も百聞は一軒であろう。実際に使ってみると便利なものだ。出来上がったグラフ画像を使って、もらったコードの担当者と確認を行うとスムーズに引継ぎが出来た。実行結果からグラフを書き、関数呼び出しの回数もちゃんと表示されるのでちょっとした動作検証にも使えると思う。ところでこの pvtrace って C++ でも使えるのだろうか。仮想関数などの動的遅延呼び出しなんかちょっとややこしそうだな。また暇をみて試してみようか。

出力結果の例。(IBM の developerWorks の該当記事から引用。)