180 likes | 312 Views
木構造の比較に基づく メソッド呼び出し履歴の変化の可視化手法. 井上研究室 伊藤芳朗. 概要. 背景 オブジェクト指向プログラムの解析 メソッド呼び出し履歴の比較 提案手法 木構造の比較に基づくメソッド呼び出し履歴の変化の可視化手法 実験 ソースコードの変更による影響を確認 まとめ. 背景. オブジェクト指向プログラム オブジェクト同士の相互作用としてシステムの振る舞いを捉える考え方 実行時の動作を理解するのは難しい クラスの継承 多態性(ポリモーフィズム) オブジェクト指向プログラムの動作理解 メソッド呼び出し履歴等の動的情報の解析が有効
E N D
木構造の比較に基づくメソッド呼び出し履歴の変化の可視化手法 井上研究室 伊藤芳朗
概要 • 背景 • オブジェクト指向プログラムの解析 • メソッド呼び出し履歴の比較 • 提案手法 • 木構造の比較に基づくメソッド呼び出し履歴の変化の可視化手法 • 実験 • ソースコードの変更による影響を確認 • まとめ
背景 • オブジェクト指向プログラム • オブジェクト同士の相互作用としてシステムの振る舞いを捉える考え方 • 実行時の動作を理解するのは難しい • クラスの継承 • 多態性(ポリモーフィズム) • オブジェクト指向プログラムの動作理解 • メソッド呼び出し履歴等の動的情報の解析が有効 • オブジェクト間のメソッド呼び出し関係を可視化
シーケンス図生成システム Amida • Javaプログラムのメソッド呼び出し履歴を取得し,シーケンス図を生成するシステム • メソッド呼び出し履歴はメソッド名,オブジェクトID,スレッドIDなどの情報の系列 • メソッドの呼び出し関係をシーケ ンス図で表示 • ループや再帰呼び出しを 圧縮する機能を持つ • シーケンス図が巨大になるのを防ぐ 谷口, 石尾, 神谷, 楠本, 井上: “プログラム実行履歴からの簡潔なシーケンス図の作成手法” , コンピュータソフトウェア,Vol.24,No.3 (2007),pp.153-169.
A B C D E F G H I シーケンス図 • オブジェクト間のメッセージ通信を時系列に沿って表現する • システムの設計時に作成される • プログラムの動作の理解に有効
プログラムの振る舞いの比較の必要性 • ソースコードを変更すると実行時の動作が変わる • デバッグ作業でのソースコードの変更 • ソースコードの変更が正しいかの確認したい • 予想していない動作の変化を発見したい • 実行時の動作はメソッド呼び出し履歴に記録される • メソッド呼び出し履歴を比較すれば動作の変化がわかる • ソースコードの変更前後で同じシナリオを実行する • ソースコードの変更による動作の変化が表れる
メソッド呼び出し履歴の比較の問題点 • メソッド呼び出し履歴は巨大 • 人間が比較すると時間がかかってしまう • 予想していない変更点の発見が困難 • メソッド呼び出し履歴ごとに生成したオブジェクトのIDが異なる • オブジェクトIDは生成順序やメモリ上の配置などを元に実行ごとに決定するため • 同じ役割のオブジェクトの対応が取れない
提案手法 • 2つのメソッド呼び出し履歴を比較し,動作の変化を検出する • ソースコードの変更前後で同じシナリオを実行したメソッド呼び出し履歴を取得 • メソッドの呼び出し関係を木構造にして比較 • 動作の変化を可視化する • 可視化にはAmidaを利用し,シーケンス図を生成する • メソッド呼び出し履歴全体のシーケンス図を生成 • 動作の変化である部分を強調表示
A B C D E F G 0 2 0 1 3 4 1 5 5 2 3 6 6 6 6 4 木構造への変換 • メソッド呼び出し履歴を木構造に変換する • 1つのメソッド呼び出しを1つのノードにする • メソッドの実行中に呼ばれたメソッドを子ノードとして親子関係を作る • これをメソッド呼び出し関係木と呼ぶ
メソッド呼び出し関係木の比較 • 一方のメソッド呼び出し関係木の中から部分木を取り出し,一致する部分木があるか判定する • トップダウン方式で比較していく • 部分木が一致したら,ノードにマークをつける • マークのついた部分木は変化していない部分である • 全ての部分木で探索が終わったら比較が終わる • 最終的にマークのないノードが変化した部分だとわかる
部分木の一致条件 • 部分木T1とT2が以下の全てを満たすと一致する • T1の根 r1 と T2 の根 r2 が一致する • r1と r2の子ノードの数が一致する • r1の i 番目の子ノード r1iを根とする部分木 T1i と r2の i 番目の子ノード r2iを根とする部分木 T2iが一致する • ノード r1と r2が以下の全てを満たすと一致する • メソッド呼び出し名が等しい • 引数の型が等しい • 返り値の型が等しい • 呼び出し元オブジェクトのクラス名が等しい • 呼び出し先オブジェクトのクラス名が等しい
メソッド呼び出し関係木の比較の例 • 左側の木の部分木に一致する部分木を探す • ノード1と一致するノードを探す • ノード1の子ノードが一致するか調べる • ノード3の子ノードが一致するか調べる • 一致する部分のないノードは変化した部分とする 0 0 1 1 5 7 2 3 2 3 6 6 6 4 4
0 1 2 3 4 5 6 3 5 6 シーケンス図へ可視化 • メソッド呼び出し履歴全体をシーケンス図にする • 変化した部分を強調して表示 • 変化した部分を自動で探索 • シーケンス図が巨大になると探すのが困難 • 変化した部分に関係する一連のメソッド呼び出しを抜き出す 抽出
適用実験 • 実験の目的 • 提案手法で実際にソースコードの変更による影響を確認する • 実験対象 • 画像編集ソフトJHotDrawのメソッド呼び出し履歴 • バージョン7.3と7.3.1で同じシナリオを実行 • プログラムを起動し,三角形を1つ描き保存せずに終了する • 評価方法 • バージョン間の変更点を発見できるか
実験結果 • 実際にソースコードの変更を動作の変化として表示できた • 3つのクラスで変更点を発見 • 新しいメソッドの追加(DefaultDrawingEditorクラス) • メソッドの処理の変更(AbstractToolクラス) • コンストラクタの処理の変更(DefaultDrawingViewクラス) • ソースコードが変更されていないのに動作の変化があると判定された • 実行時に派生クラスが変わっていたため
考察 • 提案手法のメリット • 全体の流れが追える • メソッドを追加したときにどのような影響が出たのかが分かる • ソースコードの変更以外での変化を捉えられる • 設定ファイルや入力データの変更による動作の変化 • 入力による振る舞いの変化の理解 • バグ検出に応用
まとめ • まとめ • 木構造の比較に基づくメソッド呼び出し履歴の変化の可視化手法を提案した • プログラムの変更による動作の変化を検出 • 検出した動作の変化をシーケンス図に視覚化 • 実験を行い,動作の変化からソースコードの変更点を発見した • 今後の課題 • 比較計算にかかる時間の削減 • アルゴリズムの改良 • Amidaのループ圧縮処理と組み合わせる