シーケンス図を用いて実行履歴を可視化するデバッグ環境の試作 井上研究室の淺利です. ただいまから、 「シーケンス図を用いて実行履歴を可視化するデバッグ環境の試作」 というタイトルで発表します. (タイトルを読み上げるのは能がない(谷口先生)というので、) 「デバッグ上の問題を解決するために、実行履歴をシーケンス図として表示するデバッグ環境を作りましたので、それについて説明します」 大阪大学基礎工学部情報科学科 井上研究室 淺利 勇太
研究の背景 デバッグプロセス Step1: テストで発見された不具合の再現 Step2: 不具合の原因であるバグ位置の特定 デバッガによる支援が行われている まず始めに、本研究の背景として デバッグプロセスについて簡単に説明します. デバッグプロセスは一般に3つの作業から構成されます. まず、テストで発見された不具合の再現、 つぎに、不具合の原因であるバグ位置の特定 そして、バグ修正 です この中で、「バグ位置の特定」が最もコストを必要とする作業だと言われていて、 デバッガによる支援が行われています
デバッガの機能 ブレークポイントによる、プログラムの実行の一時停止 ステップ実行による、文単位の実行 一時停止状態では、停止した時点のスタック内の各変数の値を取得できる 次に、一般的なデバッガの機能について説明します. デバッガでは、 ユーザが設定したブレークポイントによって、プログラムを実行中に一時停止させることができます. また、ステップ実行による、文単位の実行ができます. さらに、一時停止状態では、停止した時点のスタック内の各変数の値を取得できます. これらの機能を用いて、ユーザはバグ位置の特定を行います.
オブジェクト指向プログラムの デバッグの難しさ OOPでは、動的束縛のために、ソースコード上のメソッド呼び出しの記述と、実際のメソッド呼び出しの動作が異なる オブジェクト群がどのような相互作用(状態)を経て現在に至ったか 特定のオブジェクトに対するメソッド呼び出し履歴 しかし、これらのデバッグ機能だけでは対処できない問題もあります. オブジェクト指向プログラムでは、動的束縛のために、 ソースコード上のメソッド呼び出しの記述と、実際のメソッド呼び出しの動作が異なることがあります。 そこで、以下のような情報が必要です。 一つ目は、オブジェクト群がどのような相互作用を経て現在に至ったかという情報です. 二つ目は、特定のオブジェクトに対するメソッド呼び出し履歴です。 これらは、通常のデバッガでは取得できません
研究の目的 通常のデバッガでは得られない、メソッド呼び出し履歴をシーケンス図として表示することで、デバッグ支援を行う 対象:Javaプログラム シーケンス図: オブジェクト間のメッセージのやり取りを時間に沿って表すための図 そこで、本研究では、 通常のデバッガでは得られないメソッド呼び出しの履歴を シーケンス図として表示することで、デバッグ支援を行うことを目的とします. 対象はJavaプログラムとします. ここで出てきた「シーケンス図」とは、オブジェクト間のメッセージのやり取りを時間に沿って表すための図のことです.
シーケンス図の生成方法 Amida: 実行履歴からシーケンス図を生成するツール A(1).a(){ B(2).b(){ } a() a() では次にシーケンス図の生成方法について説明します. 実行履歴からのシーケンス図の生成には、我々の研究グループで開発したツール、 Amidaを利用します. ここでいう実行履歴とは.メソッド開始と終了のイベントの履歴であり、また、 どのオブジェクトのメソッドか、ということも含まれます. この図は実行履歴の例です.これを用いて説明すると まず、クラスA、ID[1]のオブジェクト のメソッドa() が呼び出されています、 その中でクラスB、ID[2]のオブジェクト のメソッドb() が呼び出されています. 次に、もう一度メソッドb()が呼び出されています この実行履歴をシーケンス図に表現すると、このようになります。 横方向にオブジェクトを並べて、縦軸は時間軸を表しています。 時間の経過に従って、オブジェクト間のメソッド呼び出しが記述されます。 しかし、このような実行履歴は膨大な量になるため、そのままシーケンス図を生成しても理解しにくくなってしまいます. そのため、Amidaはループや再帰を圧縮し 圧縮した結果を元に、シーケンス図を生成します. (アニメーション) この実行履歴では、 同じメソッドb() が2回続けて呼び出されているので、ここが圧縮され、 シーケンス図はこのように生成されます. A(1).a(){ B(2).b(){ } 谷口、 石尾、 神谷、 楠本、 井上: "Javaプログラムの実行履歴に基づくシーケンス図の作成"、 ソフトウェア工学の基礎XI、日本ソフトウェア科学会FOSE2004、pp.5-15(2004).
シーケンス図からのバグ位置の特定 プログラムの設計と、生成されたシーケンス図の比較 設計では呼び出す(呼び出されない)はずのメソッドが実際は呼ばれていない(呼ばれている) メソッド呼び出しの順序 不具合が見つかったオブジェクトに対してのメソッド呼び出し履歴の調査 では次に、デバッグ作業において、シーケンス図からのバグ位置の特定方法について説明します. 一つめは、プログラムの設計と、実行履歴から生成されたシーケンス図の比較です. 設計では呼び出すはずのメソッドが実際は呼ばれていない、 逆に、設計では呼び出されないはずのメソッドが実際は呼ばれている、 といった状況をチェックします。 また、メソッド呼び出しの順序は設計通りか、などをチェックします.
設計と生成されたシーケンス図との比較 設計時に作成したシーケンス図 実行履歴から生成されたシーケンス図 A[1] B[2] C[3] その例を図に示します. 左が設計時に作成されたシーケンス図で、 右が実行履歴を元に生成されたシーケンス図です。 この例の場合、 a1()では、b1() を呼び出した後、b2() を呼び出す、という設計だったのに、 実際はb1() の呼び出しを忘れている、 また、c2()、c3()という順番で呼び出す設計だったのに、 実際はc3()、c2という順番で呼び出している ということが 設計と、生成されたシーケンス図との比較により分かります. b2() b2() c1() c1() c2() c3() c3() c2()
シーケンス図からのバグ位置の特定 プログラムの設計と、生成されたシーケンス図の比較 設計では呼び出す(呼び出されない)はずのメソッドが実際は呼ばれていない(呼ばれている) メソッド呼び出しの順序 不具合が見つかったオブジェクトに対してのメソッド呼び出し履歴の調査 バグ位置の特定のもう1つの方法は、 不具合が見つかったオブジェクトに対してのメソッド呼び出し履歴を調査することです. シーケンス図にはオブジェクトごとのメソッド呼び出しが記述されるので、 不具合が見つかったオブジェクトに対するメソッド呼び出しが分かります.
不具合が見つかったオブジェクトについてのメソッド呼び出し履歴 実行履歴から生成されたシーケンス図 A[1] B[2] C[3] b1() その例を図に示します. ブレークポイントで停止した際に、 ID2のオブジェクトの変数に不正な値が格納されていたとします、 そのとき、生成されたシーケンス図上でそのオブジェクトについてのメソッド履歴をたどります. すると、このように呼び出されていることが分かります. これらのメソッドの中で、不正な値の変数について代入を行っている処理があれば、 その中にバグがあるかもしれない、ということが分かります a1() b2() b3() c1() 不正な値の変数 ブレークポイントでの停止位置
開発環境への実装 シーケンス図生成機能を、統合開発環境Eclipseのプラグインとして組み込み、デバッグ環境を試作 デバッグ時に実行履歴の取得 ブレークポイントでの停止時・実行終了時に実行履歴をシーケンス図として表示・更新 シーケンス図からソースコードへの参照 次に、この手法の開発環境への実装について説明します. 本研究ではJavaプログラムの開発環境として代表的なEclipseを選びました. そして、提案手法をEclipseのプラグインとして組み込み、シーケンス図生成機能を持ったデバッグ環境を試作しました. このデバッグ環境の機能は以下の3つです. 一つ目は、デバッグ時に実行履歴を取得する機能、 二つ目は、ブレークポイントでの停止時、または実行の終了時に、実行履歴をシーケンス図として表示、更新する機能、 三つ目は、表示されたシーケンス図から各メソッドのソースコードを参照する機能 です。
実行画面 エディタ シーケンス図表示部 スタックトレース これは、作成したデバッグ環境の実行画面です. この図では、Eclipseの右半分に、実行履歴から生成されたシーケンス図が表示されています. エディタ シーケンス図表示部
適用例 試作した環境でドローツールを開発 バグの特定作業にシーケンス図生成機能を利用 直線、長方形、楕円の配置 配置済みの図形のリスト表示 マウスによる配置 パラメータ設定エリアからの座標入力による配置と着色 配置済みの図形のリスト表示 図形の重なりの順序変更 図形の削除 不具合:マウスによる図形配置の際に、頂点の座標が別の値に変更されてしまう 次に、適用例について説明します. 試作したデバッグ環境の有効性を確認するために、 実際の開発作業に適用しました。 適用対象は、 簡単なドローツールの開発です。 その際に実際に作り込んでしまったバグの特定作業に、シーケンス図生成機能を利用しました. このドローツールには、このような機能があります. 直線、長方形、楕円のマウスによる配置 パラメータ設定エリアからの座標入力による配置と着色 配置済みの図形のリスト表示 図形の重なりの順序変更 図形の削除 です ここで紹介する不具合は、 マウスによる図形配置の際に、頂点の座標が別の値に変更されてしまう というものです.
適用例: 正常な図形配置動作 追加 図形リスト 頂点座標をセット パラメータ設定エリア 図形描画部 この不具合について具体的に説明します. まず、正常な図形配置の動作ですが、 マウスのボタンを押して、ドラッグしてから、離すと、 図形が配置され、リストにその図形が追加、パラメータ設定エリアに座標がセットされます. 図形リスト 頂点座標をセット パラメータ設定エリア 図形描画部
適用例: 不具合 追加 不正な頂点座標をセット しかし、最初に作った時は今から説明するような不具合が発生しました. 先ほどの例と同じ操作で、 ドラッグを終了して、図形を配置しようとすると、 頂点の座標がおかしくなって、 図形リストには正しい座標が出ていますが、 指定した場所には描画されず、 パラメータ設定エリアには正しい頂点座標がセットされませんでした. この左上隅を拡大すると、小さく長方形が描画されているのが分かります.
適用例: 設計と生成されたシーケンス図との比較 図形配置の処理設計 実行履歴から生成されたシーケンス図 キャンバス 図形オブジェクト キャンバス 図形オブジェクト ドラッグの終了() 頂点2の座標設定() ここで、この実行履歴からシーケンス図を生成し、設計との比較を行ないます. これは、図形配置の処理の設計です. マウスのドラッグが終わると、頂点の座標を設定するメソッドが呼ばれる、という設計でした. しかし、生成されたシーケンス図と比較すると、 設計にはない頂点設定のメソッドが呼ばれていることが分かりました. なぜこのメソッドが呼ばれているのかと考えて、呼び出し元へたどっていくと、 バグが見つかりました。 図形の配置と パラメータ設定エリアの更新() バグ 設計にはない
考察 シーケンス図から実際の動作を把握し、バグ位置の特定をすることができた 設計と実際の動作との比較は、デバッグに有効であると確認できた 有効に使うには、対象のプログラムについての設計情報が利用できることが必要 全体の大まかな設計についての知識 クラス名、メソッド名から処理内容が分かること 考察を行います. まず、シーケンス図から実際の動作を把握し、バグ位置の特定をすることができました また、設計と実際の動作との比較は、デバッグに有効であると確認できました. さらに、デバッグ環境を有効に使うためには、対象のプログラムについての設計情報が利用できること、つまり 全体の大まかな設計についての知識や、クラス名、メソッド名から処理内容が分かることなどが 必要だと分かりました.
まとめ 主な結果 今後の課題 デバッグ支援のため、プログラム実行履歴からシーケンス図を生成する機能を持つデバッグ環境を試作した Javaプログラムの実際の開発に使用し、デバッグにおける有効性を確認した 今後の課題 より多くのソフトウェア開発への適用 最後にまとめです. デバッグ支援のため、プログラム実行履歴からシーケンス図を生成する機能を持つデバッグ環境を試作しました. また、Javaプログラムの実際の開発に使用し、シーケンス図生成機能のデバッグにおける有効性を確認しました. 今後の課題としては、 より多くのソフトウェア開発への適用 が考えられます 以上で発表を終わります.