オブジェクト生成の観測に基づく プログラム実行の要約の抽出

Slides:



Advertisements
Similar presentations
API 呼び出し列の差分を利用した Android アプリケーション比較ツールの 試作 井上研究室 神田 哲也.
Advertisements

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 保守支援を目的とした コードクローン情報検索ツール.
OWL-Sを用いたWebアプリケーションの検査と生成
シーケンス図の生成のための実行履歴圧縮手法
画像処理学習用RTコンポーネントライブラリ 田窪 朋仁,大原 賢一,吉岡 健伸(大阪大学)
XHTML構文検証手法における スクリプト要素の静的解析アルゴリズム
Chapter5 ステートチャート図 FM 于 聡.
JavaによるCAI学習ソフトウェアの開発
Javaのための暗黙的に型定義される構造体
プログラムの変更前後での 実行履歴の差分検出手法
Myoungkyu Song and Eli Tilevich 発表者: 石尾 隆(大阪大学)
情報伝播によるオブジェクト指向プログラム理解支援の提案
Object Group ANalizer Graduate School of Information Science and Technology, Osaka University OGAN visualizes representative interactions between a pair.
プログラムの動作を理解するための技術として
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
メソッド名とその周辺の識別子の 相関ルールに基づくメソッド名変更支援手法
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
クラス動作シナリオ可視化手法の プログラム理解作業に対する有効性評価
川口真司 松下誠 井上克郎 大阪大学大学院情報科学研究科
Java ソフトウェア部品検索システム SPARS-J のための リポジトリ自動更新機能の実現
ソースコードに対する適用可能な修正手順を 可視化するリファクタリング支援手法の提案
プログラム実行履歴を用いたトランザクションファンクション抽出手法
プログラム実行時情報を用いたトランザクションファンクション抽出手法
ソースコードの変更履歴における メトリクス値の変化を用いた ソフトウェアの特性分析
静的情報と動的情報を用いた プログラムスライス計算法
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十一回 知能情報学部 新田直也.
暗黙的に型付けされる構造体の Java言語への導入
動的依存グラフの3-gramを用いた 実行トレースの比較手法
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
シーケンス図を用いて実行履歴を可視化するデバッグ環境の試作
動的スライスを用いたバグ修正前後の実行系列の差分検出手法
利用関係に基づく類似度を用いたJavaコンポーネント分類ツールの作成
実行時情報に基づく OSカーネルのコンフィグ最小化
Javaプログラムの変更を支援する 影響波及解析システム
プログラム動作理解支援を目的とした オブジェクトの振舞いの同値分割手法
コードクローンの動作を比較するためのコードクローン周辺コードの解析
コードクローン検出に基づくデザイン パターン適用支援手法の提案と実現
プログラム理解におけるThin sliceの 統計的調査による有用性評価
バイトコードを単位とするJavaスライスシステムの試作
○ 後藤 祥1,吉田 則裕2 ,井岡 正和1 ,井上 克郎1 1大阪大学 2奈良先端科学技術大学院大学
ソフトウェア保守のための コードクローン情報検索ツール
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
コーディングパターンの あいまい検索の提案と実装
JAVAバイトコードにおける データ依存解析手法の提案と実装
コードクローン間の依存関係に基づく リファクタリング支援環境の実装
オブジェクトの協調動作を用いた オブジェクト指向プログラム実行履歴分割手法
類似した振舞いのオブジェクトの グループ化による クラス動作シナリオの可視化
設計情報の再利用を目的とした UML図の自動推薦ツール
保守請負時を対象とした 労力見積のためのメトリクスの提案
「マイグレーションを支援する分散集合オブジェクト」
コードクローン間の依存関係に基づく リファクタリング支援手法の提案と実現
オブジェクトの動的支配関係解析を 用いたシーケンス図の縮約
プログラムの差分記述を 容易に行うための レイヤー機構付きIDEの提案
オープンソースソフトウェアに対する コーディングパターン分析の適用
メソッドの同時更新履歴を用いたクラスの機能別分類法
開発作業の形式化に基づく プロセス評価 松下誠 大阪大学.
UMLモデルを対象とした リファクタリング候補検出手法の提案と実現
ソフトウェア理解支援を目的とした 辞書の作成法
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
プログラムの一時停止時に 将来の実行情報を提供するデバッガ
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
コードクローン解析に基づく デザインパターン適用候補の検出手法
木構造の比較に基づく メソッド呼び出し履歴の変化の可視化手法
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
識別子の読解を目的とした名詞辞書の作成方法の一試案
プログラム理解のための 付加注釈 DocumentTag の提案
オブジェクト生成の観測に基づく プログラム実行の要約の抽出
Presentation transcript:

オブジェクト生成の観測に基づく プログラム実行の要約の抽出 大阪大学大学院情報科学研究科 ○中野 佑紀,渡邊 結 石尾 隆,井上 克郎 オブジェクト生成の観測に基づくプログラム実行の要約の抽出というタイトルで 大阪大学の中野が発表させていただきます.

背景 デバッグ,保守作業ではプログラムの動作理解が重要 プログラムはデータを加工していくことで処理を実現 データを追跡すれば,動作の理解が可能 デバッガとブレイクポイントを用いてデータを追跡 すべての命令をステップ実行することは非現実的 一気に実行するとその間のデータの様子が分からない 予定データ ファイル 暦データ 表示用 データ 更新後の 表示用データ ある予定管理プログラムでの例 本研究の背景について説明します. ソフトウェアのデバック,保守作業ではプログラムの動作理解が重要となります. プログラムはデータを加工していくことで処理を実現するため, データの加工プロセスを理解することでプログラムの動作を理解できます. この図はある予定管理プログラムを実行した際のデータの加工プロセスの例です. このプログラムでは,予定データを保存しているファイルから予定データを取り出し, そこに暦データを反映することで,表示用のデータを作成しています. そして,予定データを更新し,表示用データに反映させて, 最後に予定データをファイルに保存しています. このようにプログラムはデータの加工を繰り返すことで処理を行っており, デバッガなどを用いることでそのプロセスを追跡していくことができます. しかし,すべての命令をステップ実行することは非現実的であり,かといって, ブレイクポイント間を一気に実行するとその間のデータの様子が わからないという問題があります. そのため,データの加工プロセスを可視化する手法が必要となります.

提案手法 プログラムの実行時情報からデータの加工 プロセスをオブジェクトの生成関係として抽出 区間における動作理解を支援 指定された実行区間を対象 多くのオブジェクトが生成 出力となるオブジェクトは少数 生成関係を要約 入出力に無関係なものを排除 生成関係を簡潔にする 区間における動作理解を支援 Register Dialog Time Date String Content Schedule 生成 利用 そこで本研究では,プログラムの実行時情報からデータの加工プロセスを オブジェクトの生成関係として抽出する手法を提案します. この図は予定管理プログラムでのオブジェクトの生成関係の例を示しています. まず日付を表すDateオブジェクト,時刻を表すTimeオブジェクト, 登録する予定内容の文字列を表す Stringオブジェクトを用いて,予定登録ダイアログを表すRegisterDialogオブジェクトが 予定をあらわすScheduleオブジェクトを生成しています. そして,このScheduleオブジェクトがStringオブジェクトを利用して 予定内容を表すContentオブジェクトを生成しています. 本手法ではユーザにより指定されたプログラムの実行区間を対象とし, その区間におけるオブジェクトの生成関係を示します. プログラムの実行中はオブジェクトが多数生成されますが, 一つの処理の出力となるオブジェクトは少数です. そこで本手法では区間の入出力となるオブジェクトと無関係なオブジェクトを排除し, 要約されたオブジェクトの生成関係を提示することで, 指定の実行区間における動作の理解を支援します.

詳細 入力 : 実行履歴,区間,省略するクラス集合 1. オブジェクトの分類 2. 生成関係の特定 3. 生成関係の要約 実行履歴 : プログラムの実行時情報を記録したもの メソッド呼び出し,フィールドアクセス等の情報を含む 1. オブジェクトの分類 2. 生成関係の特定 3. 生成関係の要約 3-1.オブジェクトの省略 3-2.オブジェクトの集約 出力 : 入出力オブジェクト一覧,要約した生成関係 提案手法の詳細について説明します. 本手法は入力としてプログラムの実行履歴,加工プロセスを抽出する区間,省略するクラス集合を取ります. 実行履歴とはプログラムの実行時情報を記録したもので,実行されたメソッド呼び出し, フィールドアクセス等の情報を含んでいます. 加工プロセスを抽出する区間はこの実行履歴上の区間となります. 本手法の手順としては,まず区間内で利用されたオブジェクトの分類を行い, 次に区間内で生成されたオブジェクトの生成関係の特定を行います. そして,この生成関係の要約を行います. 生成関係の要約ではオブジェクトの省略,集約を行います. 最終的に入出力オブジェクト一覧と要約した生成関係が出力され, 指定区間がどのオブジェクトを入力として,どのオブジェクトを出力したか, その間の加工プロセスを明らかにします. ここから,本手法の手順について詳しく説明します.

1. オブジェクトの分類 入力オブジェクト 出力オブジェクト 内部オブジェクト 指定区間より前で生成 区間内で利用 区間内で生成 区間終了後も利用 内部オブジェクト 区間終了後は利用されない 内部 時間 区間開始 区間終了 : 生成 : 利用 1 2 3 4 5 6 出力 入力 まず指定区間内で利用されるオブジェクトを 入力オブジェクト,出力オブジェクト,内部オブジェクトに分類します. この図は時間の流れに対するオブジェクトへのアクセスを示しており, 横軸に時間,縦軸にオブジェクトをとっています. 青の四角形はオブジェクトが生成されたことを表し, 黄色の四角形はオブジェクトがアクセスされたことを表します. 入力オブジェクトは区間より前で生成され,区間内で利用されるオブジェクトであり, 図における2,3のオブジェクトが該当します. 出力オブジェクトは区間内で生成され,区間終了後も利用されるオブジェクトであり, 図における4,5のオブジェクトが該当します. 内部オブジェクトは区間内で生成され,区間終了後で利用されないオブジェクトであり, 図における6のオブジェクトが該当します.

2. 生成関係の特定 オブジェクト間の生成関係 TRIGGER : オブジェクト生成を行ったオブジェクト BASE : オブジェクト生成に利用されたオブジェクト class RegisterDialog { newSchedule = new Schedule (date, time, memo); } class Schedule { Schedule (Date date, Time time, String memo){ … } . Register Dialog Time Date String Schedule TRIGGER BASE . 次に区間内で生成されたオブジェクト, すなわち出力オブジェクトと内部オブジェクトに対して生成関係を特定します. 本手法ではオブジェクトの生成関係としてTRIGGERとBASEを定義します. TRIGGERとはオブジェクトの生成を行ったオブジェクトを表し, BASEとはオブジェクトの生成に利用されたオブジェクトを表します. JavaにおいてはTRIGGERはコンストラクタ呼び出し時のthisオブジェクト, BASEはコンストラクタ引数のオブジェクトが該当します. このソースコードで示すようにRegisterDialog内ではScheduleのコンストラクタが 呼び出されています. この部分で生成されるScheduleオブジェクトのTRIGGERはこのコンストラクタ呼び出しを 行っているRegisterDialogオブジェクト,BASEはコンストラクタ引数に対応するオブジェクト, この場合はDateオブジェクト,Timeオブジェクト,Stringオブジェクトとなります. 特定した生成関係は図に示すように有向グラフで表します. . .

3-1. オブジェクトの省略 内部オブジェクトのうち,いずれかの条件を満たすものを省略 入出力オブジェクトと無関係 生成関係をたどり,入出力オブジェクトに到達不可能 コンストラクタ内のみで利用 コールスタックの深い部分のみで利用 内部クラス ユーザが指定したクラス 中間データ 自身の生成にBASEを持つ 他のオブジェクトの生成において,BASEにしかならない 最後に他のオブジェクトの生成に利用された後,利用されない 続いて,オブジェクトの省略を行います. オブジェクトの生成関係は巨大な有向グラフになるため, 重要でないと思われるオブジェクトを出力から除外します. 入力オブジェクトと出力オブジェクトは区間外の処理に対するデータの受け渡しが行われるため, 区間の加工プロセスの起点と終点として残す必要があります. そこで,区間内でしか利用されない内部オブジェクトのうち, 入出力オブジェクトと無関係,すなわち生成関係をたどり,入出力オブジェクトに 到達不可能なもの,コンストラクタ内のみでしか利用されないもの,コールスタックの 深い部分のみでしか利用されないもの,内部クラス,入力においてユーザが指定したクラス, 中間データとなるものを出力から除外します. 中間データとはオブジェクト間でのデータの受け渡しのみに利用されているオブジェクトのことで, データをBASEとして受け取っており,かつ他のオブジェクトの生成に対してBASEとしてデータを渡し, その後は利用されないようなオブジェクトのことです.

3-2. オブジェクトの集約 同じ生成関係を持つオブジェクト集合を集約 対応するオブジェクトのクラス,分類が等しい 対応するオブジェクト間の関係が等しい A : 入力 B(1) : 内部 B(2) : 内部 C(1) : 出力 C(2) : 出力 TRIGGER BASE B : 内部 2 objects C : 出力 B,Cの オブジェクト集合 を集約 最後に,オブジェクトの生成関係では 同様の生成関係を持つ部分が複数存在すると考えられるため, それらの集約を行います. 集約を行う条件は,二つのオブジェクト集合について 対応するオブジェクトのクラスと入力,出力,内部の分類が等しく, 対応するオブジェクト間の関係が等しいことです. 図に示す例ではB(1)とB(2)についてみると, どちらも内部オブジェクトであり,AからのTRIGGERのエッジを持ち, クラスCのオブジェクトへのTRIGGERのエッジを持っています. また,C(1)とC(2)についてみると, どちらも出力オブジェクトであり,AからのBASEのエッジを持ち, クラスBのオブジェクトからのTRIGGERのエッジを持っています. したがって,B(1)とB(2),C(1)とC(2)はそれぞれ集約されます.

ケーススタディ 対象 : 予定管理プログラム 実行履歴のシナリオ 指定区間 : 日付の選択前から予定の登録後 省略クラス : 指定なし 起動,日付の選択,予定の入力,予定の登録,終了 指定区間 : 日付の選択前から予定の登録後 省略クラス : 指定なし 提案手法を実装したツールを試作し,ケーススタディを実施しました. ケーススタディはJavaで記述された予定管理プログラムを対象として行いました. 用いた実行履歴のシナリオについて説明します. 予定管理プログラムを起動すると,このようなカレンダーが表示されるので, 予定を追加する日付を選択します.今回は予定のない3/4を選択しました. すると,このような予定入力ダイアログが表示されるので,予定の入力を行います. 今回は16:30 meetingと入力しました. 入力後,予定の登録を行うとカレンダーに戻ります.予定のある日付は黄色で表示されます. カレンダーに戻ったあと,予定管理プログラムを終了しました. 本手法で加工プロセスを抽出する区間として,日付の選択前から予定の登録後までを指定しました. memo : イベント数 37241 区間イベント数 955 実行時間 約4秒 入力 20(5) 出力 4(4) 内部 124(12) STATIC 4(1) UNKNOWN 1(1)

入出力オブジェクトの一覧 入出力オブジェクトの情報を出力 I/O ID Name Value I 6 scheduler.domain.Scheduler 399 java.sql.Date 2010-03-04 O 2358 java.sql.Time 16:30:00 2359 java.lang.String meeting 2360 scheduler.domain.Schedule このツールが出力する入出力オブジェクト一覧では, 入力オブジェクト,出力オブジェクトについての情報が出力されます. 内容としては入出力の分類,オブジェクトID,クラスの完全修飾名が出力されます. また,String, Integer,Boolean等のクラスについては実行履歴からそのオブジェクトが表す値を 取得し,その値も出力します. 示しているリストは出力結果の一部です. 指定区間では,予定を管理しているSchedulerオブジェクトと選択された日付を表すDataオブジェクトが 入力されており,登録された予定を表すScheduleオブジェクトと予定内容であるTimeオブジェクト, Stringオブジェクトが出力されていることが分かります.

生成関係の出力例 scheduler.util DateTimeUtils(STATIC) java.sql Time(2358) “16:30:00” Date(399) “2010-03-04” javax.swing JComboBox 2 objects java.lang String(2359) “meeting” scheduler.domain Schedule(2360) Content(2361) scheduler.gui RegisterDialog(2248) String 1 object : “16” 1 object : “30” 36464 : TRIGGER Thread : 17 DateTimeUtils.java Line.38 36471 : TRIGGER RegisterDialog.java Line.112 36471 : BASE1 36471 : BASE2 36471 : BASE3 36479 : BASE1 Schedule.java Line.18 36479 : TRIGGER TRIGGER RegisterDialog.java : STATIC : 入力 : 出力 : 内部 生成関係は図に示すような有向グラフとして出力されます. ノードはオブジェクトを表し,パッケージ名,クラス名,オブジェクトIDが 示されています. また,値が取得可能なクラスに関してはその値も示しています. ノードが集約されたオブジェクトを表す場合は,枠を二重にして オブジェクトIDは示さずに集約されている個数を示しています. 値が取得可能なクラスに関しては値ごとの個数を示しています. ノードでは入力オブジェクトを青,出力オブジェクトを緑というように色分けしています. エッジは生成関係を表し,生成時刻,関係,生成スレッドID, ソースコードの位置情報としてファイル名,行番号を示しています. 集約されたエッジに関しては集約前の情報のうち,共通する情報のみを示しています. この図は実際に得られた19ノードのうち9ノードだけを示したものですが,日付を表すDateオブジェクトと 入力された時刻を表すTimeオブジェクト,予定内容の文字列を表すStringオブジェクトを用いて, 予定登録ダイアログを表すRegisterDialogオブジェクトが 追加した予定を表すScheduleオブジェクトを生成していることが分かります.

考察と今後の課題 要約結果の検証 要約によりサイズが十分に小さくなったか? 任意の実行履歴,区間に適用可能か? 重要な情報が省略されないか? 適用例におけるノード数(153→19) 任意の実行履歴,区間に適用可能か? 様々な実行履歴,区間に適用 重要な情報が省略されないか? 要約結果を開発者に見てもらう 指定区間の動作理解を支援可能か? ツールを用いて動作理解を行ってもらう 要約結果の検証について説明します. 要約により出力される生成関係が十分に小さくなったか? 先ほど説明したケーススタディの結果では要約前後のノード数が153から19となり, 十分小さくなったといえます. 次に任意の実行履歴,区間に適用可能か? これに関しては今後,様々な実行履歴,区間に適用することで検証したいと考えています. 次に重要な情報が省略されていないか? これに関しては要約結果を適用したプログラムの開発者に見てもらい検証したいと考えています. 最後に指定区間の動作理解を支援可能か? これに関しては作成したツールを実際に利用して動作理解を行ってもらい検証したいと考えています.

まとめ 実行履歴上の指定区間におけるオブジェクトの生成関係の要約を提示する手法を提案 Javaプログラムを対象としたツールを試作 オブジェクト(入力,出力,内部)の分類 生成関係(TRIGGER,BASE)の特定 生成関係の要約 省略 : 内部オブジェクトのうち条件を満たすもの 集約 : 同じパターンのオブジェクト群 Javaプログラムを対象としたツールを試作 ケーススタディを実施 まとめです. 本発表では実行履歴上の指定区間におけるオブジェクトの生成関係の要約を提示する手法を 提案しました. 提案手法は 区間内で利用されたオブジェクトを入力オブジェクト,出力オブジェクト,内部オブジェクトに分類し, 区間内で生成されたオブジェクトに対するTRIGGER,BASEを特定し, 生成関係の要約としてオブジェクトを省略,集約することで 指定区間の入出力オブジェクトと加工プロセスを提示します. また,Javaプログラムを対象としたツールを試作し,ケーススタディを実施しました.