170 likes | 287 Views
オブジェクトの動作の比較による 実行履歴削減手法の提案. 大阪大学大学院情報科学研究科 博士前期課程 2 年 井上研究室 脇阪 大輝. 目次. バグ再現のための実行 履歴とその量の問題について 提案する実行履歴削減手法の詳細 評価実験の 計画 今後. 背景. プログラムに障害が発生したとき 障害の生じた実行についての情報を実行履歴から確認 障害を招いたバグをデバッグ環境で再現 し , バグを修正. 修正. 実行履歴. 実行履歴の収集. デバッグ の ため には詳細な情報 が ある 方 が望ましい 単純 なスタックトレースだけでは再現 が 難しいこともある
E N D
オブジェクトの動作の比較による実行履歴削減手法の提案オブジェクトの動作の比較による実行履歴削減手法の提案 大阪大学大学院情報科学研究科 博士前期課程2年 井上研究室 脇阪 大輝
目次 • バグ再現のための実行履歴とその量の問題について • 提案する実行履歴削減手法の詳細 • 評価実験の計画 • 今後
背景 • プログラムに障害が発生したとき • 障害の生じた実行についての情報を実行履歴から確認 • 障害を招いたバグをデバッグ環境で再現し,バグを修正 修正 実行履歴
実行履歴の収集 • デバッグのためには詳細な情報がある方が望ましい • 単純なスタックトレースだけでは再現が難しいこともある • プログラムの実行履歴はロガーツールによって収集 • プログラムの実行時に記録 • プログラムが動く間,記録し続けたい • いつ障害が生じても良いように 実行履歴
問題点 • プログラムの動作の詳細な情報の量は膨大 • 規模の小さな実行でも詳細な情報の量は多い • 実行が続く限り情報は増え続け,上限がない 長期間,動作を常に記録し続けることは困難 表:ベンチマークソフトのプログラムの実行履歴サイズの例 (メソッド呼出し・実行,変数読書きの発生を記録したもの) 実行履歴
アプローチ 障害に備えて常に動作を記録していると 実行履歴には障害に関係ない履歴が大量に含まれる 障害に関係しそうにない実行を 実行中に判定できれば, その部分の記録をやめることで 実行履歴のサイズを減らすことができる
プログラムの動作の種類 過去の研究により,オブジェクトの動作はいくつかの種類に分類することができ, その種類はあまり多くないことがわかっている クラスA プログラムの動作は,それに関わるオブジェクトの動作の種類に影響を受ける オブジェクトの動作が既知の種類に当てはまる限り プログラムも似た動作をすると考えることができる function(A a){ .... .... // } function(A a){ .... .... // } function(A a){ .... .... // }
提案手法 • 既知の実行と同じ動作すると考えられる箇所を記録の対象から除外 • 繰り返しによる同じ動作を表す履歴が多い • 過去と同じ動作なら障害は発生しない • 未知の動作のみを記録し実行履歴の量を削減する
手法概要 • 先にプログラムを実行し,オブジェクトの動作を蓄積 • 次のプログラムの実行ではメソッドの実行ごとに既知の動作をしそうかを蓄積した記録を用いて判定する • 先の実行にない動作をしているオブジェクトが入力となるメソッドの実行のみを詳細に記録する 先の実行 オブジェクトごとの動作 比較 後の実行 未知の動作と 考えられる 実行の履歴 プログラム
オブジェクトの動作 • オブジェクトの動作はオートマトンとして抽出する • 入力はオブジェクトに対するメソッドの呼出し位置 • 同じメソッド呼出し位置を入力した後は全て同じ状態 1:Stack s; 2:while(i = read()){ 3: s.push(i); 4:} 5: 6:while(!s.isEmpty()){ 7: sum += s.pop(); 8:} push#3 isEmpty#6 pop#7 push#3 isEmpty#6 始めのループで pushが2回呼出されたとき 同じメソッド呼出し位置の繰り返しは ループとして表現される
記録の対象 • メソッドの実行開始時に以下のオブジェクトの動作を比較する • そのうちの1つでも未知の動作があればそのメソッドの実行を記録対象とする 比較 先の実行でそのメソッドの入力となった オブジェクトの動作 後の実行でメソッドの入力となっている オブジェクトの動作 • メソッドの入力のオブジェクトとは • メソッドを実行されたオブジェクト • メソッドの引数となったオブジェクト obj1.method(obj2, obj3);
オブジェクトの動作の比較 • プログラム実行中に出現したオブジェクトへのメソッド呼出しを比較対象のオートマトンへ入力する • 状態遷移が可能な間はそのオブジェクトの動作を既知とみなす • 状態遷移ができなかった場合,その動作を未知とみなす push#3 isEmpty#6 pop#7 1. push#3 2. push#3 3. isEmpty#6 既知の動作 push#3 isEmpty#6 1. isEmpty#6 先の実行で得られたオブジェクトの動作を表すオートマトン 未知の動作
実行履歴の削減例(1/3) 14:static private void add(Stack stack){ 15: inta = stack.pop(); 16: int b = stack.pop(); 17: stack.push(b+a); 18:} 19: 1:String exp = argv[0]; 2:Stack stack = new Stack(); 3:for(inti=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); 逆ポーランド記法で与えられた数式を,スタックを用いて計算するプログラムを例に用いる
実行履歴の削減例(2/3) 14:static private void add(Stack stack){ 15: inta = stack.pop(); 16: int b = stack.pop(); 17: stack.push(b+a); 18:} 19: 1:String exp = argv[0]; 2:Stack stack = new Stack(); 3:for(inti=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); pop#15 push#8 pop#16 先の実行では数式として”12+”が与えられるとする そのときのStackの動作は次のオートマトンとなる push#17 push#8 pop#11
実行履歴の削減例(3/3) 14:static private void add(Stack stack){ 15: inta = stack.pop(); 16: int b = stack.pop(); 17: stack.push(b+a); 18:} 19: 1:String exp = argv[0]; 2:Stack stack = new Stack(); 3:for(inti=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); pop#15 push#8 pop#16 後の実行では数式に”12+3+”が与えられるとする “12+”までの部分の計算では, Stackについて先の実行と同じ動作が観測されるので, それまでのStackのメソッドやaddメソッドの実行は記録されない “3+”の計算から,状態遷移できず,2度目のaddが記録対象に push#17 push#8 pop#11
評価実験計画 • 目的 • 手法により実行履歴を削減できるかどうかを調査 • 対象 • DaCapoベンチマーク • 様々なアプリケーションを実行できるベンチマークソフト • オプションで実行の規模を選択でき,規模の違いとは,たとえば画像処理アプリケーションのbatikでは処理する画像の数の違い • 手段 • DaCapoベンチマークの小規模な実行でオブジェクトの動作を蓄積し,規模の大きい実行の履歴の量を,提案手法を用いた場合と用いない場合で比較する
研究の今後 • 評価実験を行いその結果を調査する • メソッドの入力となるオブジェクトの振舞いと,メソッド実行のパスの関係を調査