オープンソースリポジトリのバグ修正履歴 を再利用したデバッグ推薦の評価実験 九州工業大学 塩塚 大 ※ 九州大学 鵜林 尚靖 九州大学 亀井 靖高 ※ 現在,メルコ・パワー・システムズ株式会社 概要 デバッグ関心事 このAPIの使い方は? この例外は。。。 本発表のポイント public class Property { public String readFile (String pathname) throws IOException { String val = null; File file = new File(pathname); Reader(fileReader); val = br.readLine(); return val; } } File file = new File(pathname); Reader(fileReader); val = br.readLine(); return val; dcNavi (Debug Concern Navigator) コード dcNaviの適用実験(オープンソースプロジェクトで実験) オープンソースリポジトリからDCGへの変換 public class Property { public String readFile (String pathname) throws IOException public class Property { { public String readFile (String String val = null; pathname) throws IOException File public class Property { { file = new File(pathname); String readFile (String Stringpublic val = null; Filepathname) file = new throws IOException { File(pathname); BufferedReaderString br = new val = null; BufferedReader(fileReader); File file = new val = br.readLine(); File(pathname); BufferedReader br = new return val; BufferedReader(fileReader); }} val = br.readLine(); BufferedReader br = new return val; BufferedReader(fileReader); }} val = br.readLine(); return val; }} 分析&検索 推薦 (類似のコード修正例) 過去の バグ修正履歴 DCG(Debug Concern Graph) 2 発表の流れ 1.はじめに 〜 デバッグと修正履歴の活用 〜 2.dcNavi ・DCG(Debug Concern Graph) ・推薦アルゴリズム 3.実験 4.関連研究 5.まとめと今後の課題 3 1.はじめに 〜 デバッグと修正履歴の活用 〜 • 背景:類似したバグ修正が行われることがある – 例:subclipseプロジェクトでの修正 • 目的:バグ修正の際に役立ちそうな過去の修正情報を見つけたい! 4 dcNaviをオープンソースに適用する際に 考慮すべき点 – 1.バグ修正に関する変更情報の選別 • どの時点のリビジョンをバグ修正の開始、終了とするか DCG自動生成 – 2.類似したバグの検索 • できるだけ類似しているバグを発見したい 推薦アルゴリズム & 適用実験 (評価基準) 5 2.dcNavi [DCG生成機能] ・DCGはバージョン管理システム から生成 [推薦機能] 修正後 rev920 バグ修正パターン の修正 (1) ライブラリの誤り易い例と、 そのときの修正方法(後述) (2) 過去にある例外に関連した ソースコードとそのときの修正方法 修正前 プログラム要素 ~dcNaviのスナップショット~ ・moveメソッドの修正前から修正後までに 作られたDCG ・Eclipseのプラグインとして実装 6 DCG(Debug Concern Graph) • 下の図が、moveメソッドの修正前から修正後までに作られるDCG – DCG = プログラム解析情報 + バグ修正情報 から成るデバッグ履歴の表現 :メソッド宣言 :メソッド内のプログラム要素 :バグ修正パターン move のデバッグ diff-1 calls move バグ修正パターン(全27種) diff-2 move calls move getBaseDir catches calls calls MC-DM:同一オブジェクトに対する呼 び出すメソッドの変更 move wrapException MC-DAP: メソッド呼出しのパラメータ toString の変更 デバッグ開始(修正前) SQ-AROB: メソッド呼出しの追加/削除 バグ修正パターン*: MC-DM デバッグ終了(修正後) キーワード「bug, fix, patch」 *Pan, K., et al.: Toward an understanding of bug fix patterns. Empirical Software Engineering, pp.286-315, 2009. 7 推薦アルゴリズム ライブラリの誤り易い例とそのときの修正方法 修正対象:rev984のremoveメソッド remove のデバッグ diff-1 ①関連したメソッドが修正されて いる履歴を検索 ②類似度(共通要素数の割合)を計算 し類似しているものを優先 ③バグ修正パターンや修正差分を推薦 remove delete toString move のデバッグ wrapException diff-1 diff-2 SvnCommandLineクラスのメソッド move 類似度 : 共通要素数 ÷ {(G1の要素数 + G2の要素数) / 2} = 2 / {(3 + 4) / 2} = 0.57 getBaseDir move wrapException toString バグ修正パターン*: MC-DM move move 推薦対象:rev920のmoveメソッド 8 3.実験 • 目的 – 推薦量/推薦時間/推薦の質の確認 • 対象プロジェクト – EclipseプラグインでMylynに関連した9つのオープンソース • 手順 – リポジトリからライブラリに関連したバグを含んでいたメ ソッド(修正対象)を選択し、 修正方法(修正例)を推薦 推薦元データ 生成 DCG 推薦 修正対象 + 自プロジェクトの リビジョンの80%内 のバグ修正情報 他の8プロジェクト バグ修正情報 自プロジェクトの残りの20% のリビジョン内のバグ 9 正解の定義 • 実際の修正方法と修正例のバグ修正パターンを比較 • 条件1.バグ修正パターンの種類が一致 • 条件2.修正されたメソッドが一致 条件1 バグ修正パターン*: MC-DM 条件2 修正されたメソッド delete 一致! 不一致! 条件1は満たす 条件2は満たさない (同一クラス内のメソッドまで正解にすれば一致) 条件1 バグ修正パターン*: MC-DM 条件2 修正されたメソッド move 10 質の表現 • 適合率(推薦の精度の指標) – 推薦結果内にどれだけ正解が含まれるか、ノイズが少ないか • 推薦結果内に含まれる正解の割合 • 再現率(正解の網羅率の指標) – 推薦候補内に含まれる正解をどれだけ網羅できたか、漏れが 少ないか • 全推薦候補内(自プロジェクト80%+他の8プロジェクト)に含まれる 正解に対する,推薦結果内の正解の割合 • F値 – 適合率と再現率の調和平均 11 結果1 Note.条件1および2を満たした場合を正解とした場合の結果 プロジェクト NOM ANR ATR(msec) 適合率(%) 再現率(%) F値(%) 12 結果2 ※ 9プロジェクトで平均した値 13 結果3 推薦候補内に存在する正解からなる集合 推薦結果のうち正解だった要素からなる集合 14 4.関連研究 修正履歴を活用した研究 • BugMem [Kim, S. FSE2006] – ソースコード差分の検索を支援 – クラスライブラリやstatic呼出しを排除して差分を検索可能 • DebugAdvisor [Ashok, B. FSE2009] – バージョン管理システム,バグデータベース,デバッガログなど統 合して類似バグが検索できるクエリ(fat query)を提案 • FixWizard [Nquyen, T. T. ICSE2010] – メソッド呼出しなどの順序を考慮して類似バグの検索を支援 15 5.まとめと今後の課題 • まとめ – オープンソースを用いた評価実験によりdcNaviの推薦 機能(ライブラリ利用例)の性能を確認 • 今後の課題 – グループ推薦 • 1つの推薦よりは関連する複数の事例を推薦する方式の方 が有効な場合も多いと考えられる • バグの要因は1つだけでなく複合している場合が多い • 類似した複数の事例を提示して貰った方がプログラマも修正 の確信が持てやすくなる • ただし,どのようなポートフォリオにするかは今後の課 題 16
© Copyright 2024 ExpyDoc