miau's blog?

Graphviz

3月19日あたり、VBReport を使って VB のプログラムを解析してたわけだけど。

ツリー形式だと処理の流れはわかりやすいけど、ノード数が膨大になるので処理の概観がわかりにくい。1関数1ノードで、親:子が多:1になれるような図が書ければずいぶんすっきりしそうなもんだけど・・・。

とか考えてたら、友人が教えてくれました。

Graphviz

テキストファイルでリンク状態を定義しておいて、それをビジュアル化してくれるソフト、らしい。
(詳しくは dot user's guide(PDF) あたりを参照のこと)

さてさて、実験開始。


対象は同僚が作った VB のプロジェクト。
まず VBReport で解析(オプションは「呼出」のみ有効に)して、「ファイル」配下のみチェックを入れ Text 形式で保存。
こういうのができあがる。
.. ファイル
... Const1.bas(Const1)
.... Public Declare Sub Sleep
.... Public Sub Main
..... Public Function F_GetCmdline[Const1]
.... Public Function F_GetCmdline
(中略)
... DBEdit.frm(frmDbEdit)
.... Private Sub cmdClear_Click
..... Private Sub S_Clear[frmDbEdit]
...... Public Sub CS_OnError[Const1]
....... Public Sub CS_WriteLog[Const1]
..... Private Sub EnableControls[frmDbEdit]
(以下略)

関数の呼び出し関係ががツリー状に表現されてます。
これを perl で解析しつつ dot 形式に変換。

digraph G {
Const1 -> Sleep;
Const1 -> Main;
Main -> F_GetCmdline;
CS_OnError -> CS_WriteLog;
CF_GetDbDataFldNo -> CS_OnError;
(中略)
cmdClear_Click -> S_Clear;
cmdClear_Click -> EnableControls;
(以下略)
}

dot 形式っていうのは親子関係を記述する。
上のと見比べればなんとなくわかっていただけるかと。

さて、準備は整った。早速 Graphviz →dot で読み込んでみよう。
出来上がった GIF ファイルを開いてみると…


Graphvizてすと1
にぎゃあ。
5149 x 757 pixels って。どでかい上にバランス悪い。
ということでトップノードが左側にくるようにオプション設定。

	rankdir="LR";
※dot のプロパティのとこからでも設定可。

さて、どうなったかというと・・・


Graphvizてすと2

うん。ちょっとは見れるようになったかな。

でも左右にやたら線が集中しているノードが。

左側のノードは、ファイル名のノード。
ファイル名毎のまとまりがわかりやすいようにファイル名→関数の情報ももたせていたんだけど、これは排除したほうがいいっぽい。
代わりにクラスタってやつを使ってみることにする。

subgraph "cluster_Const1" {
label="Const1";
DeclareSleep;
Main; F_GetCmdline;
CS_OnError;
CS_WriteLog;
(以下略)
}


こうしておけば、このまとまりは四角で囲まれて表示される、はず。

でもって、右側のほうで線が集中しているノードは、エラー処理関数。
まぁいろんな関数から呼ばれているのでこうなるのも納得。
でもこのプログラムの流れをつかむ目的からは外れてる関数なので、この関数への呼び出しはコメントアウトしてみる。

ついでにどこから処理が始まるかわかりやすいように xxx_Click という名前のノードは四角で表すことに。

	cmdClear_Click [shape=box];

とかやっとけば OK。


Graphvizてすと3

かなり見れた感じに。
でもクラスターとやらを使ったせいで、クラスタの境界部に線が集中してるなぁ。
気になったのでクラスタを解除してみる。


Graphvizてすと4

ん。こっちのほうがわかりやすいかな。

この作業の難しいとこは、なかなか思い通りの出力になってくれないこと。
例えば「ごちゃごちゃしてるからこのノード省略しよう」なんてことを考えると、階層数が少なくなって線が入り乱れる結果になってしまったりも。
色々試行錯誤するのがよさそう。

ま、何にせよ同じようにしてクラス図や E-R 図みたいなのも作れそうだし、色々試してみる予定。
posted at 01:29:53 on 2004-03-30 by miau - Category: VB6 No Trackbacks - Permalink

TrackBack

このエントリにトラックバックはありません
現在トラックバックは受け付けていません。

Comments

No comments yet

Add Comments

現在コメントは受け付けていません。
お手数ですが、 こちら のコメント欄にでも記載していただければと思います。