蓄積されたオブジェクトの動作履歴を用いた 実行履歴削減手法の提案

Slides:



Advertisements
Similar presentations
シーケンス図の生成のための実行履歴圧縮手法
Advertisements

プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
プログラムの変更前後での 実行履歴の差分検出手法
Javaプログラムの開発履歴における アクセス修飾子過剰性の分析
SSR 論文調査 Safety and Cyber-Physical Systems
情報伝播によるオブジェクト指向プログラム理解支援の提案
アクセス修飾子過剰性の変遷に着目したJavaプログラム部品の分析
Object Group ANalizer Graduate School of Information Science and Technology, Osaka University OGAN visualizes representative interactions between a pair.
プログラムの動作を理解するための技術として
アルゴリズムとデータ構造 2011年6月13日
プログラミング論 II 電卓,逆ポーランド記法電卓
第20章 Flyweight ~同じものを共有して無駄をなくす~
メソッド名とその周辺の識別子の 相関ルールに基づくメソッド名変更支援手法
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
クラス動作シナリオ可視化手法の プログラム理解作業に対する有効性評価
ソースコードに対する適用可能な修正手順を 可視化するリファクタリング支援手法の提案
プログラム実行履歴を用いたトランザクションファンクション抽出手法
ソースコードの変更履歴における メトリクス値の変化を用いた ソフトウェアの特性分析
静的情報と動的情報を用いた プログラムスライス計算法
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
オブジェクト指向プログラムのための 動的結合メトリクスの評価
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
Javaプログラムの コールスタック状態に着目した 実行履歴の対話的な分析ツール
識別子の命名支援を目的とした動詞-目的語関係の辞書構築
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
動的スライスを用いた バグ修正前後の実行系列の比較
ソフトウェア障害分析のための 低侵襲な実行モニタリングツールの試作
動的依存グラフの3-gramを用いた 実行トレースの比較手法
シーケンス図を用いて実行履歴を可視化するデバッグ環境の試作
動的スライスを用いたバグ修正前後の実行系列の差分検出手法
ユーザ毎にカスタマイズ可能な Webアプリケーションの 効率の良い実装方法
アルゴリズムとプログラミング (Algorithms and Programming)
ライブラリのバージョン更新支援のための実行トレースからのテストケース生成
限られた保存領域を使用する Javaプログラムの実行トレース記録手法の 提案と評価
Javaプログラムの変更を支援する 影響波及解析システム
プログラム動作理解支援を目的とした オブジェクトの振舞いの同値分割手法
ソースコードの特徴量を用いた機械学習による メソッド抽出リファクタリング推薦手法
プログラム実行に対するフェイズ検出を用いた ログ取得量の動的変更手法の提案
プログラム理解におけるThin sliceの 統計的調査による有用性評価
アルゴリズムとデータ構造 2010年7月26日
計算機プログラミングI 第5回 配列 文字列(Stringクラス) mainの引数 配列の利用例
オブジェクト・プログラミング 第8回.
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
JAVAバイトコードにおける データ依存解析手法の提案と実装
アルゴリズムとプログラミング (Algorithms and Programming)
オブジェクトの協調動作を用いた オブジェクト指向プログラム実行履歴分割手法
同期処理のモジュール化を 可能にする アスペクト指向言語
C#プログラミング実習 第3回.
プログラムスライスを用いた凝集度メトリクスに基づく 類似メソッド集約候補の順位付け手法
設計情報の再利用を目的とした UML図の自動推薦ツール
アルゴリズムとデータ構造 2012年6月11日
保守請負時を対象とした 労力見積のためのメトリクスの提案
アルゴリズムとプログラミング (Algorithms and Programming)
dcNavi:デバッグ支援のための グラフベース推薦システム
アルゴリズムとデータ構造1 2008年7月24日
オープンソースソフトウェアに対する コーディングパターン分析の適用
メソッドの同時更新履歴を用いたクラスの機能別分類法
複雑度メトリクスを用いた JAVAプログラム品質特性の実験的評価
プログラムの一時停止時に 将来の実行情報を提供するデバッガ
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
回帰テストにおける実行系列の差分の効率的な検出手法
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
オブジェクト指向メトリクスを用いた 開発支援に関する研究 --- VC++とMFCを用いた開発を対象として ---
情報処理Ⅱ 小テスト 2005年2月1日(火).
オブジェクト生成の観測に基づく プログラム実行の要約の抽出
Presentation transcript:

蓄積されたオブジェクトの動作履歴を用いた 実行履歴削減手法の提案 博士前期課程 2年 コンピュータサイエンス専攻 井上研究室 脇阪 大輝

背景 プログラム利用者のもとで障害が発生したとき 障害の生じた実行についての情報を収集 障害をデバッグ環境で再現し,原因となる欠陥を修正 障害の再現のためには,実行履歴が用いられることもある 実行履歴 修正

実行履歴 実行履歴には様々な形式があるが,詳細なものには, 全てのメソッド呼出しやフィールドの読書きの発生が具体的な値とともに含まれる EventId=12,EventType=8,ThreadId=1,LocationId=240 EventId=13,EventType=9,ThreadId=1,LocationId=240,dataTypeId=12,paramIndex=0,value=2 EventId=14,EventType=1,ThreadId=1,LocationId=232 EventId=15,EventType=2,ThreadId=1,LocationId=232,dataTypeId=12,paramIndex=0,value=2 EventId=16,EventType=17,ThreadId=1,LocationId=233,dataTypeId=12,value=2 EventId=17,EventType=19,ThreadId=1,LocationId=233,dataType=int,value=0 EventId=18,EventType=3,ThreadId=1,LocationId=234,dataType=int,value=1 EventId=19,EventType=11,ThreadId=1,LocationId=240,dataType=boolean,value=true EventId=20,EventType=8,ThreadId=1,LocationId=241 EventId=21,EventType=9,ThreadId=1,LocationId=241,dataTypeId=12,paramIndex=0,value=2 EventId=22,EventType=9,ThreadId=1,LocationId=241,dataType=int,paramIndex=1,value=1 EventId=23,EventType=1,ThreadId=1,LocationId=216 EventId=24,EventType=2,ThreadId=1,LocationId=216,dataTypeId=12,paramIndex=0,value=2 EventId=25,EventType=2,ThreadId=1,LocationId=216,dataType=int,paramIndex=1,value=1 EventId=26,EventType=17,ThreadId=1,LocationId=217,dataTypeId=12,value=2 EventId=27,EventType=19,ThreadId=1,LocationId=217,dataTypeId=13,value=3 EventId=28,EventType=17,ThreadId=1,LocationId=218,dataTypeId=12,value=2 EventId=29,EventType=19,ThreadId=1,LocationId=218,dataType=int,value=0 EventId=30,EventType=25,ThreadId=1,LocationId=219,dataType=int,paramIndex=0,objectId=3,value=1 EventId=31,EventType=17,ThreadId=1,LocationId=220,dataTypeId=12,value=2 EventId=32,EventType=19,ThreadId=1,LocationId=220,dataType=int,value=0 EventId=33,EventType=20,ThreadId=1,LocationId=221,dataType=int,objectId=2,value=1 EventId=34,EventType=3,ThreadId=1,LocationId=222,dataType=void,value=void EventId=35,EventType=11,ThreadId=1,LocationId=241,dataType=null,value=null EventId=36,EventType=18,ThreadId=1,LocationId=242 EventId=37,EventType=19,ThreadId=1,LocationId=242,dataTypeId=14,value=4 EventId=38,EventType=8,ThreadId=1,LocationId=243 EventId=39,EventType=9,ThreadId=1,LocationId=243,dataTypeId=12,paramIndex=0,value=2 EventId=40,EventType=1,ThreadId=1,LocationId=224 EventId=41,EventType=2,ThreadId=1,LocationId=224,dataTypeId=12,paramIndex=0,value=2 EventId=42,EventType=17,ThreadId=1,LocationId=225,dataTypeId=12,value=2 EventId=43,EventType=19,ThreadId=1,LocationId=225,dataType=int,value=1 EventId=44,EventType=20,ThreadId=1,LocationId=226,dataType=int,objectId=2,value=0 EventId=45,EventType=17,ThreadId=1,LocationId=227,dataTypeId=12,value=2 EventId=46,EventType=19,ThreadId=1,LocationId=227,dataTypeId=13,value=3 EventId=47,EventType=17,ThreadId=1,LocationId=228,dataTypeId=12,value=2 EventId=48,EventType=19,ThreadId=1,LocationId=228,dataType=int,value=0 EventId=49,EventType=23,ThreadId=1,LocationId=229,paramIndex=0,objectId=3 EventId=50,EventType=24,ThreadId=1,LocationId=229,dataType=int,value=1 EventId=51,EventType=3,ThreadId=1,LocationId=230,dataType=int,value=1 EventId=52,EventType=11,ThreadId=1,LocationId=243,dataType=int,value=1 EventId=53,EventType=8,ThreadId=1,LocationId=244 EventId=54,EventType=9,ThreadId=1,LocationId=244,dataTypeId=14,paramIndex=0,value=4 EventId=55,EventType=9,ThreadId=1,LocationId=244,dataType=int,paramIndex=1,value=1 EventId=56,EventType=11,ThreadId=1,LocationId=244,dataType=null,value=null EventId=57,EventType=3,ThreadId=1,LocationId=245,dataType=void,value=void メソッドpushの実行開始 パラメータ情報 フィールドstackの読込み フィールドspの読込み stackへの書込み フィールドspへの書込み メソッドpushの実行終了 class Stack { public void push(int item){ stack[sp] = item; sp += 1; } public int pop(){ sp -= 1; return stack[sp]; メソッドpopの実行開始 パラメータ情報 フィールドspの読込み フィールドspへの書込み フィールドstackの読込み stack要素の読込み メソッドpopの実行終了

実行履歴を用いたデバッグ Omniscient Debugging[1] 詳細な実行履歴を用いて,プログラムの実行における,任意の時点での状態を再現する 開発者は実行履歴を用いてデバッグを行う 障害が生じたときのプログラムの実行を詳細に調査可能 障害の原因となった欠陥の特定を効率良く行える [1]Bil Lewis. Debugging backwards in time. In Proceedings of the 5th International Workshop on Automated Debugging(AADEBUG2003), pp.225-235 2003.

問題点 プログラムの詳細な実行履歴の量は膨大 プログラム実行環境のディスク容量を浪費する プログラム利用者のもとで, 膨大な量の実行履歴を保存することは好ましくない 実行履歴

アプローチ 障害に関係しそうにない処理の履歴を記録しないことで実行履歴の量を減らす テスト環境で事前に確認されている動作は障害に関係しない可能性が高い オブジェクトを入力として受け取る動作のテストでは,  オブジェクトの取り得る状態を網羅することは困難[2] 事前の実行で確認されていない動作をしたオブジェクトが 入力として使用されている動作の実行履歴を記録する [2]Hojun Jaygarl, Sunghun Kim, Tao Xie, and Carl K. Chang. Ocat: Object capturebased automated testing. In Proceedings of the 19th International Symposium on Software Testing and Analysis, ISSTA 2010, pp. 159–170, 2010.

提案手法 概要 事前にプログラムを実行しオブジェクトの動作を蓄積 提案手法 概要 事前にプログラムを実行しオブジェクトの動作を蓄積 後のプログラムの実行ではメソッドの実行ごとに観測されたことのない動作をしそうかを蓄積した記録を用いて判定 事前の実行とは一致しない動作をしているオブジェクトが入力となるメソッドの実行のみを詳細に記録 先の実行 オブジェクトごとの動作 比較 未知の振舞いと 考えられる 実行の履歴 プログラム 後の実行

オブジェクトの動作 オブジェクトの動作はオートマトンとして抽出する 入力はオブジェクトに対するメソッドの呼出し位置 同じメソッド呼出し位置を入力した後は全て同じ状態 1:Stack s; 2:while((i = read())!=null){ 3: s.push(i); 4:} 5: 6:while(!s.isEmpty()){ 7: sum += s.pop(); 8:} push#3 isEmpty#6 pop#7 始めのループで pushが2回以上呼出されたとき 同じメソッド呼出し位置の繰り返しは ループとして表現される

実行履歴を記録する対象 メソッドの実行開始時に以下のオブジェクトの動作を比較する 事前の動作と一致しない動作をするオブジェクトがあればそのメソッドの実行を記録対象とする 事前の実行でメソッドの入力となったオブジェクトの動作 後の実行でメソッドの入力となっているオブジェクトの動作 動作比較 ? method(parameter) method(parameter) 後の実行になって初めて 実行されたメソッドは無条件で記録対象とする

オブジェクトの動作の比較 プログラム実行中に出現したオブジェクトへのメソッド呼出しを比較対象のオートマトンへ入力する 状態遷移が可能な間はオートマトンと一致 状態遷移ができなかったあとは不一致 push#3 isEmpty#6 pop#7 1. push#3 2. push#3 3. isEmpty#6 一致している動作 1. isEmpty#6 事前の実行で得られたオブジェクトの動作を表すオートマトン 一致していない動作

実行履歴の削減例(1/3) 逆ポーランド記法で与えられた数式を スタックを用いて計算するプログラム 1:String exp = argv[0]; 2:Stack stack = new Stack(); 3:for(int i=0;i<exp.length();i++){ 4: char c = exp.charAt(i); 5: if(c==‘+’){ 6: add(stack); 7: }else{ 8: stack.push(Character.digit(c, 10)); 9: } 10:} 11:System.out.println(stack.pop()); 14:static private void add(Stack stack){ 15: int a = stack.pop(); 16: int b = stack.pop(); 17: stack.push(b+a); 18:} 19: 逆ポーランド記法で与えられた数式を スタックを用いて計算するプログラム

実行履歴の削減例(2/3) 事前の実行では数式として”1 2 + ”が与えられるとする 1:String exp = argv[0]; 2:Stack stack = new Stack(); 3:for(int i=0;i<exp.length();i++){ 4: char c = exp.charAt(i); 5: if(c==‘+’){ 6: add(stack); 7: }else{ 8: stack.push(Character.digit(c, 10)); 9: } 10:} 11:System.out.println(stack.pop()); 14:static private void add(Stack stack){ 15: int a = stack.pop(); 16: int b = stack.pop(); 17: stack.push(b+a); 18:} 19: push#8 pop#15 pop#16 push#17 push#8 pop#11 事前の実行では数式として”1 2 + ”が与えられるとする

実行履歴の削減例(3/3) 後の実行では数式に”1 2 + 3 +”が与えられるとする “3+”の計算のaddは実行履歴記録対象になる × 1:String exp = argv[0]; 2:Stack stack = new Stack(); 3:for(int i=0;i<exp.length();i++){ 4: char c = exp.charAt(i); 5: if(c==‘+’){ 6: add(stack); 7: }else{ 8: stack.push(Character.digit(c, 10)); 9: } 10:} 11:System.out.println(stack.pop()); 14:static private void add(Stack stack){ 15: int a = stack.pop(); 16: int b = stack.pop(); 17: stack.push(b+a); 18:} 19: push#8 pop#15 pop#16 push#17 × push#8 pop#11 後の実行では数式に”1 2 + 3 +”が与えられるとする “3+”の計算のaddは実行履歴記録対象になる

実験1 目的 対象 手段 手法により実行履歴を削減できるかどうかを調査する DaCapoベンチマークのbatik,fop,luindex,pmd 様々なアプリケーションを実行できるベンチマークソフト オプションで実行の規模をsmall,default,largeから選択できる defaultは,イベント数にしてsmallの約4~80倍 手段 smallを事前の実行として用いオブジェクトの動作を蓄積する defaultの実行履歴をどの程度削減できるかを調べる

実験2 目的 手段 事前の実行とは異なる動作をしている部分の実行を,実行履歴の記録対象とできているかを調べる smallでは観測されず,defaultでのみ観測される実行経路をたどっているメソッド実行を,記録すべきメソッド実行とみなし, それを実行履歴の記録対象にできているかを調査する

評価尺度 DEFAULT ・・・defaultの全メソッド実行 RECORDED・・・記録対象となったメソッド実行 DEAFULT RECORDED TARGET DEFAULT ・・・defaultの全メソッド実行 RECORDED・・・記録対象となったメソッド実行 TARGET ・・・記録すべきメソッド実行 評価尺度 意味 ①DEFAULTに含まれるRECORDEDの割合 値が小さいほど,実行履歴が少なくて済む ②RECORDEDに含まれるTARGETの割合 値が大きいほど,無駄な記録が少ない ③TARGETに含まれるRECORDEDの割合 値が大きいほど,取りこぼしが少ない

結果 (1/2) 約20~60%の記録量になる どのアプリでも必要のない記録対象が多い 記録すべきメソッド実行の多くを記録できるアプリもある batik fop luindex pmd ①DEFAULT中に含まれるRECORDEDの割合 26.3% 23.7% 58.6% 62.4% ②RECORDED中に含まれるTARGETの割合 約0% 0.5% 0.9% ③TARGET中に含まれるRECORDEDの割合 18.5% 5.1% 97.1% 92.2%

結果 (2/2) fopの取りこぼしたメソッド実行のほとんどが オブジェクトが入力とならないメソッドのもの オブジェクト以外の引数の値による振舞いの変化は, テストで事前に網羅することが容易 batik fop luindex pmd ①DEFAULT中に含まれるRECORDEDの割合 26.3% 23.7% 58.6% 62.4% ②RECORDED中に含まれるTARGETの割合 約0% 0.5% 0.9% ③TARGET中に含まれるRECORDEDの割合 18.5% 5.1% 97.1% 92.2%

まとめと今後の課題 まとめ 本研究では,事前に蓄積したオブジェクトの動作履歴を用いることによって,障害を再現するための実行履歴の量を削減する手法を提案し,評価実験を行った 実験では,実行履歴が2割~6割ほどの量になることを確認した 今後の課題 実行履歴が削減されないアプリケーションの特徴調査 手法によるオーバーヘッドの計測