Download presentation
Presentation is loading. Please wait.
1
オブジェクト生成の観測に基づく プログラム実行の要約の抽出
大阪大学大学院情報科学研究科 ○中野 佑紀,渡邊 結 石尾 隆,井上 克郎 オブジェクト生成の観測に基づくプログラム実行の要約の抽出というタイトルで 大阪大学の中野が発表させていただきます.
2
背景 デバッグ,保守作業ではプログラムの動作理解が重要 プログラムはデータを加工していくことで処理を実現
データを追跡すれば,動作の理解が可能 デバッガとブレイクポイントを用いてデータを追跡 すべての命令をステップ実行することは非現実的 一気に実行するとその間のデータの様子が分からない 予定データ ファイル 暦データ 表示用 データ 更新後の 表示用データ ある予定管理プログラムでの例 本研究の背景について説明します. ソフトウェアのデバック,保守作業ではプログラムの動作理解が重要となります. プログラムはデータを加工していくことで処理を実現するため, データの加工プロセスを理解することでプログラムの動作を理解できます. この図はある予定管理プログラムを実行した際のデータの加工プロセスの例です. このプログラムでは,予定データを保存しているファイルから予定データを取り出し, そこに暦データを反映することで,表示用のデータを作成しています. そして,予定データを更新し,表示用データに反映させて, 最後に予定データをファイルに保存しています. このようにプログラムはデータの加工を繰り返すことで処理を行っており, デバッガなどを用いることでそのプロセスを追跡していくことができます. しかし,すべての命令をステップ実行することは非現実的であり,かといって, ブレイクポイント間を一気に実行するとその間のデータの様子が わからないという問題があります. そのため,データの加工プロセスを可視化する手法が必要となります.
3
提案手法 プログラムの実行時情報からデータの加工 プロセスをオブジェクトの生成関係として抽出 区間における動作理解を支援
指定された実行区間を対象 多くのオブジェクトが生成 出力となるオブジェクトは少数 生成関係を要約 入出力に無関係なものを排除 生成関係を簡潔にする 区間における動作理解を支援 Register Dialog Time Date String Content Schedule 生成 利用 そこで本研究では,プログラムの実行時情報からデータの加工プロセスを オブジェクトの生成関係として抽出する手法を提案します. この図は予定管理プログラムでのオブジェクトの生成関係の例を示しています. まず日付を表すDateオブジェクト,時刻を表すTimeオブジェクト, 登録する予定内容の文字列を表す Stringオブジェクトを用いて,予定登録ダイアログを表すRegisterDialogオブジェクトが 予定をあらわすScheduleオブジェクトを生成しています. そして,このScheduleオブジェクトがStringオブジェクトを利用して 予定内容を表すContentオブジェクトを生成しています. 本手法ではユーザにより指定されたプログラムの実行区間を対象とし, その区間におけるオブジェクトの生成関係を示します. プログラムの実行中はオブジェクトが多数生成されますが, 一つの処理の出力となるオブジェクトは少数です. そこで本手法では区間の入出力となるオブジェクトと無関係なオブジェクトを排除し, 要約されたオブジェクトの生成関係を提示することで, 指定の実行区間における動作の理解を支援します.
4
詳細 入力 : 実行履歴,区間,省略するクラス集合 1. オブジェクトの分類 2. 生成関係の特定 3. 生成関係の要約
実行履歴 : プログラムの実行時情報を記録したもの メソッド呼び出し,フィールドアクセス等の情報を含む 1. オブジェクトの分類 2. 生成関係の特定 3. 生成関係の要約 3-1.オブジェクトの省略 3-2.オブジェクトの集約 出力 : 入出力オブジェクト一覧,要約した生成関係 提案手法の詳細について説明します. 本手法は入力としてプログラムの実行履歴,加工プロセスを抽出する区間,省略するクラス集合を取ります. 実行履歴とはプログラムの実行時情報を記録したもので,実行されたメソッド呼び出し, フィールドアクセス等の情報を含んでいます. 加工プロセスを抽出する区間はこの実行履歴上の区間となります. 本手法の手順としては,まず区間内で利用されたオブジェクトの分類を行い, 次に区間内で生成されたオブジェクトの生成関係の特定を行います. そして,この生成関係の要約を行います. 生成関係の要約ではオブジェクトの省略,集約を行います. 最終的に入出力オブジェクト一覧と要約した生成関係が出力され, 指定区間がどのオブジェクトを入力として,どのオブジェクトを出力したか, その間の加工プロセスを明らかにします. ここから,本手法の手順について詳しく説明します.
5
1. オブジェクトの分類 入力オブジェクト 出力オブジェクト 内部オブジェクト 指定区間より前で生成 区間内で利用 区間内で生成
区間終了後も利用 内部オブジェクト 区間終了後は利用されない 内部 時間 区間開始 区間終了 : 生成 : 利用 1 2 3 4 5 6 出力 入力 まず指定区間内で利用されるオブジェクトを 入力オブジェクト,出力オブジェクト,内部オブジェクトに分類します. この図は時間の流れに対するオブジェクトへのアクセスを示しており, 横軸に時間,縦軸にオブジェクトをとっています. 青の四角形はオブジェクトが生成されたことを表し, 黄色の四角形はオブジェクトがアクセスされたことを表します. 入力オブジェクトは区間より前で生成され,区間内で利用されるオブジェクトであり, 図における2,3のオブジェクトが該当します. 出力オブジェクトは区間内で生成され,区間終了後も利用されるオブジェクトであり, 図における4,5のオブジェクトが該当します. 内部オブジェクトは区間内で生成され,区間終了後で利用されないオブジェクトであり, 図における6のオブジェクトが該当します.
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オブジェクトとなります. 特定した生成関係は図に示すように有向グラフで表します. . .
7
3-1. オブジェクトの省略 内部オブジェクトのうち,いずれかの条件を満たすものを省略 入出力オブジェクトと無関係
生成関係をたどり,入出力オブジェクトに到達不可能 コンストラクタ内のみで利用 コールスタックの深い部分のみで利用 内部クラス ユーザが指定したクラス 中間データ 自身の生成にBASEを持つ 他のオブジェクトの生成において,BASEにしかならない 最後に他のオブジェクトの生成に利用された後,利用されない 続いて,オブジェクトの省略を行います. オブジェクトの生成関係は巨大な有向グラフになるため, 重要でないと思われるオブジェクトを出力から除外します. 入力オブジェクトと出力オブジェクトは区間外の処理に対するデータの受け渡しが行われるため, 区間の加工プロセスの起点と終点として残す必要があります. そこで,区間内でしか利用されない内部オブジェクトのうち, 入出力オブジェクトと無関係,すなわち生成関係をたどり,入出力オブジェクトに 到達不可能なもの,コンストラクタ内のみでしか利用されないもの,コールスタックの 深い部分のみでしか利用されないもの,内部クラス,入力においてユーザが指定したクラス, 中間データとなるものを出力から除外します. 中間データとはオブジェクト間でのデータの受け渡しのみに利用されているオブジェクトのことで, データをBASEとして受け取っており,かつ他のオブジェクトの生成に対してBASEとしてデータを渡し, その後は利用されないようなオブジェクトのことです.
8
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)はそれぞれ集約されます.
9
ケーススタディ 対象 : 予定管理プログラム 実行履歴のシナリオ 指定区間 : 日付の選択前から予定の登録後 省略クラス : 指定なし
起動,日付の選択,予定の入力,予定の登録,終了 指定区間 : 日付の選択前から予定の登録後 省略クラス : 指定なし 提案手法を実装したツールを試作し,ケーススタディを実施しました. ケーススタディはJavaで記述された予定管理プログラムを対象として行いました. 用いた実行履歴のシナリオについて説明します. 予定管理プログラムを起動すると,このようなカレンダーが表示されるので, 予定を追加する日付を選択します.今回は予定のない3/4を選択しました. すると,このような予定入力ダイアログが表示されるので,予定の入力を行います. 今回は16:30 meetingと入力しました. 入力後,予定の登録を行うとカレンダーに戻ります.予定のある日付は黄色で表示されます. カレンダーに戻ったあと,予定管理プログラムを終了しました. 本手法で加工プロセスを抽出する区間として,日付の選択前から予定の登録後までを指定しました. memo : イベント数 区間イベント数 実行時間 約4秒 入力 20(5) 出力 4(4) 内部 124(12) STATIC 4(1) UNKNOWN 1(1)
10
入出力オブジェクトの一覧 入出力オブジェクトの情報を出力 I/O ID Name Value I 6
scheduler.domain.Scheduler 399 java.sql.Date 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オブジェクトが出力されていることが分かります.
11
生成関係の出力例 scheduler.util DateTimeUtils(STATIC) java.sql Time(2358)
“16:30:00” Date(399) “ ” 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オブジェクトを生成していることが分かります.
12
考察と今後の課題 要約結果の検証 要約によりサイズが十分に小さくなったか? 任意の実行履歴,区間に適用可能か? 重要な情報が省略されないか?
適用例におけるノード数(153→19) 任意の実行履歴,区間に適用可能か? 様々な実行履歴,区間に適用 重要な情報が省略されないか? 要約結果を開発者に見てもらう 指定区間の動作理解を支援可能か? ツールを用いて動作理解を行ってもらう 要約結果の検証について説明します. 要約により出力される生成関係が十分に小さくなったか? 先ほど説明したケーススタディの結果では要約前後のノード数が153から19となり, 十分小さくなったといえます. 次に任意の実行履歴,区間に適用可能か? これに関しては今後,様々な実行履歴,区間に適用することで検証したいと考えています. 次に重要な情報が省略されていないか? これに関しては要約結果を適用したプログラムの開発者に見てもらい検証したいと考えています. 最後に指定区間の動作理解を支援可能か? これに関しては作成したツールを実際に利用して動作理解を行ってもらい検証したいと考えています.
13
まとめ 実行履歴上の指定区間におけるオブジェクトの生成関係の要約を提示する手法を提案 Javaプログラムを対象としたツールを試作
オブジェクト(入力,出力,内部)の分類 生成関係(TRIGGER,BASE)の特定 生成関係の要約 省略 : 内部オブジェクトのうち条件を満たすもの 集約 : 同じパターンのオブジェクト群 Javaプログラムを対象としたツールを試作 ケーススタディを実施 まとめです. 本発表では実行履歴上の指定区間におけるオブジェクトの生成関係の要約を提示する手法を 提案しました. 提案手法は 区間内で利用されたオブジェクトを入力オブジェクト,出力オブジェクト,内部オブジェクトに分類し, 区間内で生成されたオブジェクトに対するTRIGGER,BASEを特定し, 生成関係の要約としてオブジェクトを省略,集約することで 指定区間の入出力オブジェクトと加工プロセスを提示します. また,Javaプログラムを対象としたツールを試作し,ケーススタディを実施しました.
Similar presentations
© 2024 slidesplayer.net Inc.
All rights reserved.