肥後研究室志望の方へ

実行履歴の可視化

プログラムを実行し,その経過を図示することで,プログラムの動作を分析することができます. 私たちは,プログラムが実際にどんな機能を実行したのか,出てきた図がプログラムのどの機能に対応するのかを,自動的に判定する手法を研究しています.

研究の目的

ソフトウェアは,一度完成した後も不具合の修正や機能の変更,追加をするためにどんどん改良されていきます. このような改良作業のことを保守作業と言います.

保守作業を行う人は,ソフトウェアに改良を加える前に,まずそのソフトウェアがどのような構造で作られていて,どのように動作しているのかをしっかりと理解しなければなりません. しかし,ソフトウェアはそれぞれに実装が大きく違っていたり,複雑な構造になっていたりして,簡単にはその構造や動作を理解できません.

ソフトウェアの設計仕様書などがあれば,そこにはソフトウェアの構造や動作についての記述があるかもしれません. しかし設計仕様書はあくまで設計図であるため,ソフトウェアの開発中に起こった変更や,完成後の保守作業で行われた改良を反映していないことがあります. そのため,仕様書からソフトウェアの構造や動作を理解したとしても,それが目の前のソフトウェアに正しく対応しているかどうかは分かりません.

ソースコードにはコンピュータがどのように演算を行うかが記述されているため,最新のソースコードを全て読めば,ソフトウェアの構造や動作が分かるかもしれません. しかし,ソースコード上からソフトウェアのどの機能がどこに記述されているのかを探し出すのは困難です. これは,一つの機能を実現するために動作するコードが,ソースコードの中に断片的に散らばっていたり,また,実行中のシステムの状態に応じて動作を変更するような仕組みになっている場合があるからです.

そこで私たちは,動作しているソフトウェアそのものを観察し,その情報を分析・提示する事で,ソフトウェアの構造と動作を分かりやすい形で表現し,理解を手助けする手法を提案しています. 動作しているプログラムの動作の様子(具体的に何をどのように実行しているか)を記した情報を実行履歴と呼びます. 実際に今あるソフトウェアの動作を記録しているため,仕様書のような実際との齟齬はありませんし,実行している機能に関する情報だけが取得されます. 私たちは,この実行履歴を人間の目で読みやすい形にする可視化と,分析結果の応用について研究しています.

実行履歴をシーケンス図として読む

近年,ソフトウェアはオブジェクト指向という考え方を使って作られることが多くなっています. オブジェクト指向で作られたソフトウェアでは「オブジェクト」と呼ばれる登場人物たちが,お互いにメッセージを交換していくことで,ソフトウェア全体が動作する仕組みになっています.

私たちは,オブジェクト指向で作られたソフトウェアを実際に実行し,その時に各オブジェクトがメッセージ交換を行う様子を記録し,下に示すようなシーケンス図を用いて表現します. シーケンス図とは,オブジェクト間のメッセージ通信の様子を時間軸に沿って表現する図です. この図を用いて表現することで,ソフトウェアの実行時の様子をわかりやすい形で示すことができます.

シーケンス図
シーケンス図

私たちは,Javaプログラムを対象とする実行履歴取得・可視化ツール「Amida」を開発しました. このツールは,Javaプログラムから実行履歴を取得し,その履歴をシーケンス図として表示する機能を持っています.

図を小さくして分かりやすくする

実行時の情報からシーケンス図を作成するには,1つ問題があります. コンピュータは,多数の命令を高速に実行することができるため,短時間のソフトウェアの実行であってもその情報は膨大なものとなり,作成した図も非常に大きくなってしまいます. その結果,作成した図を見てその内容を全て理解することは難しくなり,また自分が知りたい機能が図示されている部分を探し出す事も困難になってしまいます. 更に,実行履歴上に登場するオブジェクトが増えれば,シーケンス図で見たい部分を拡大しても読み取れる情報が殆どないような図になってしまうこともあります.

そこで私たちは,実行履歴のシーケンス図を簡略化し,取扱を容易にする以下のアプローチを提案しています.

  • 繰り返しの圧縮
  • 実行履歴上では,例えばソースコード上でfor文などによる繰り返し処理が記述されていた場合,その繰り返された回数分だけの実行情報が記載されているため,図はその回数に比例して大きくなります. 多くのソフトウェア開発者は,繰り返しの回数や一度の処理の中で何が行われるかには興味がありますが,同じものを複数回数分見たいとは思いません. そこで,実行時の情報の中から同じような処理が繰り返されている箇所を見つけて,繰り返しを1つにまとめることで,図を小さくして分かりやすくします.

  • フェイズ分割
  • プログラムの実行を時間軸に沿って見ると,一つの機能を実行している区間ごとに区切る事ができます. この区間をフェイズと呼びます.実行履歴は複数の機能の実行を記録しているため,複数のフェイズから構成されていることになります. 一般に,ある機能のフェイズで動作するオブジェクトは,別の機能のフェイズでは動作しないものが多いということが知られています. そこで,実行履歴をフェイズごとに分割します.すると,分割された部分履歴のシーケンス図は,時間軸もオブジェクト数も減って小さく見やすいものになります. 保守担当者は,履歴中から自分の見たい機能を実行しているフェイズだけを選択・閲覧することができます.

  • オブジェクトのグループ化
  • 一つのシーケンス図上に現れるオブジェクトの数が多いと,メッセージ通信を表す矢印が極端に長くなってしまう場合があります. そこで,登場するオブジェクトを複数のグループに分け,グループを一つのオブジェクトとして表示する事で,シーケンス図上での総オブジェクト数を減らし,可読性を向上させます. グループを段階的に作成し,展開・格納を可能にする事で,保守担当者は実行履歴中で詳しく見たいオブジェクトだけを図上に展開し,その他のオブジェクトを省略するなどして可読性の高い図を得ることができます.

実行履歴に対する以上のような分析を施して作成したシーケンス図を用いて,ソフトウェアの構造や動作を理解する作業を手助けし,保守作業をスムーズに行えるようにしています.

生成したシーケンス図
生成したシーケンス図

実行履歴分析の応用

取得した実行履歴とその分析結果は,単にシーケンス図化してソフトウェアの理解を手助けするだけではなく,様々なことに応用できます.

例えば,不具合を修正する時に,不具合が発生した際の実行履歴と通常時の実行履歴とを比較することで,本来は起こってはならないような動作がどのフェイズで生じたかを発見し,不具合の箇所を特定することができます.

また,ソフトウェアの組み合わせテストを行う際,テスト時の実行履歴をフェイズ分割し,それぞれのフェイズが実行した機能を対応付ける事で,テストの対象である複数機能が実際に組み合わさっていたかを確認する事ができます.

更に,作成したシーケンス図はそのソフトウェアを実行した時の様子を表しているので,これを解析することで,そのソフトウェアの複雑さや規模を評価することもできます.

私たちは現在,このような応用方法についての研究に取り組んでいます.

代表的な論文

ソフトウェア

  • Amida: Java プログラムの実行履歴に対するフェイズ分割およびシーケンス図生成手法を実装したソフトウェアです.

研究紹介に戻る

肥後研究室

大阪大学 大学院情報科学研究科

コンピュータサイエンス専攻

ソフトウェア工学講座