統合開発環境のための アスペクト指向システム 千葉研究室 薄井 義行 2005年2月6日 修士論文発表会 1 ソフトウェア開発 変数の値を出力しバ グのおおよその位置 を特定 バグの詳細な位置 を特定し修正 テストコード の実行 トレース 開発 デバッグ テスト リリース 2005年2月6日 修士論文発表会 2 一時的なコードの追加 トレース、デバッグコード – 変数の値を出力 – さまざまな位置に追加 トレースコード テスト用コード テスト用コード – 例外発生時の動作をテスト プログラム 例外を投げるコード デバッグコード 2005年2月6日 修士論文発表会 3 テスト、デバッグコード記述の問題点 テスト、デバッグの度にソースコードを変更 – 誤って追加コードの周辺を変更する危険性 ソースコードの可読性が低下 – テスト、デバッグコードはプログラム本来の機能に無関係 コードの追加位置を一ヶ所ずつ指定するしかない – 例: 変数 x への代入位置全て – 手間がかかる – 入れ忘れの可能性 2005年2月6日 修士論文発表会 4 Bugdel の提案 アスペクト指向を利用してテスト、デバッグコードを追加 – アスペクト指向 Pointcut: コードの追加位置 Advice: 追加するコード class A{ int x; void run1(){ x = 10; … x = 20; } テスト、デバッグに特化 void run2(){ x = 30; したアスペクト指向 – AspectJ と異なるデザイン … } – クラスのモジュール性を } 緩める – テスト、デバッグコードの 分離 – 追加コードの実行位置を まとめて指定 – 統合開発環境 Eclipse のプラグイン 2005年2月6日 修士論文発表会 Bugdelにより指定 Pointcut: x へのアクセス位置 Advice: System.out.println(x) 5 AspectJ vs Bugdel AspectJ (汎用) テキストベース Bugdel (テスト、デバッグ用) GUI Pointcut 指定子 get, set, call, execution, handler… get, set, call, execution, handler… Line, AllLines Advice リフレクション (thisJoinPoint) リフレクション (thisJoinPoint) ローカル変数へのアクセス ビルトメソッド ユーザインター フェイス 2005年2月6日 修士論文発表会 6 AspectJ vs Bugdel AspectJ (汎用) テキストベース Bugdel (テスト、デバッグ用) GUI Pointcut 指定子 get, set, call, execution, handler… get, set, call, execution, handler… Line, AllLines Advice リフレクション (thisJoinPoint) リフレクション (thisJoinPoint) ローカル変数へのアクセス ビルトメソッド ユーザインター フェイス 2005年2月6日 修士論文発表会 7 Bugdel の GUI Bugdel エディタ ソースコード ブラウザ 2005年2月6日 Bugdel ビュー 修士論文発表会 8 GUI による pointcut の指定 (1/2) AspectJ – set(int Point.y) – execution(void Point.setX(int)) Bugdel – Advice ダイアログ – エディタ上に候補を表示 2005年2月6日 修士論文発表会 9 GUI による pointcut の指定 (2/2) ソースコードブラウザ – ソースコード (クラス、メソッド、フィールド) の構成をツリー表示 – 検索を行いながら pointcut を指定 検索クエリと メソッドの検索結果 pointcut の指定 サブタイプの 検索結果 2005年2月6日 修士論文発表会 10 AspectJ vs Bugdel AspectJ (汎用) テキストベース Bugdel (テスト、デバッグ用) GUI Pointcut 指定子 get, set, call, execution, handler… get, set, call, execution, handler… Line, AllLines Advice リフレクション (thisJoinPoint) リフレクション (thisJoinPoint) ローカル変数へのアクセス ビルトメソッド ユーザインター フェイス 2005年2月6日 修士論文発表会 11 Line, AllLines pointcut Line pointcut – ソースコードの行番号を指定 – エディタ上の行番号をクリック – クラスのモジュール性を壊すがデバッグには有用 行番号はメソッドの実装に依存 AllLines pointcut – メソッド内すべての行番号を指定 – ステップ実行のエミュレートのため 2005年2月6日 修士論文発表会 12 AspectJ vs Bugdel AspectJ (汎用) テキストベース Bugdel (テスト、デバッグ用) GUI Pointcut 指定子 get, set, call, execution, handler… get, set, call, execution, handler… Line, AllLines Advice リフレクション (thisJoinPoint) リフレクション (thisJoinPoint) ローカル変数へのアクセス ビルトメソッド ユーザインター フェイス 2005年2月6日 修士論文発表会 13 Bugdel の advice (1/2) (ローカル変数へのアクセス) Advice から joinpoint に存在するローカル変 数へのアクセスを許可 – クラスのモジュール性を壊すがデバッグには有用 ローカル変数はメソッドの実装に依存 Advice class Server{ Pointcut : void run(){ service() メソッドの呼び出し int counter = 10; Advice ボディ: service(); System.out.println(counter); … } AspectJ では counter へのアクセスを不許可 2005年2月6日 修士論文発表会 14 Bugdel の advice (2/2) リフレクション – コードの実行位置 (joinpoint) に応じて設定 – thisJoinPoint.line ソースコードの行番号 – thisJoinPoint.filePath ソースコードのファイルパス – thisJoinPoint.variables 変数の一覧 –… ビルトインメソッド – bugdel.Bugdel.jump(int line) 特定の行番号へジャンプ (C言語の goto 文) – bugdel.Bugdel.openEditor(..) –… 2005年2月6日 修士論文発表会 1class A{ 2 int x; 3 void run1(){ 4 x = 10; 5 … 6 x = 20; 7 } 8 void run2(){ 9 x = 30; 10 … 11 } 12} 15 応用例:ブレイクポイントのエミュレート デバッグモード (JPDA) の無い JVM 上で実現 – 例: サードパーティが作成した JVM 2005年2月6日 修士論文発表会 16 指定した pointcut Pointcut でブレイク位置を指定 メソッドの入口 メソッドの出口 AllLines pointcut を使ったステップ実行 MethodExecution (before) MethodExecution (after) フィールド参照 FieldGet フィールド代入 FieldSet ソースの行番号 Line ステップ実行 2005年2月6日 AllLines 修士論文発表会 17 指定した advice String file = thisJoinPoint.filePath; int line = thisJoinPoint.line; bugdel.Bugdel.openEditor("localhost",5555,file,line); System.err.println(thisJoinPoint.location); Object[][] vs = thisJoinPoint.variables; bugdel.Bugdel.printVariables(vs); javax.swing.JOptionPane.showMessageDialog(null,"OK?"); 2005年2月6日 修士論文発表会 18 指定した advice (1/4) String file = thisJoinPoint.filePath; int line = thisJoinPoint.line; bugdel.Bugdel.openEditor("localhost",5555,file,line); System.err.println(thisJoinPoint.location); ソースコードを Bugdel エディタ で開きハイライト表示 Object[][] vs = thisJoinPoint.variables; bugdel.Bugdel.printVariables(vs); javax.swing.JOptionPane.showMessageDialog(null,"OK?"); Eclipse&Bugdel 2. ファイル名、行番号 1. openEditor(..) を送信 メソッドの呼び出し 3.ソースファイルを開 きハイライト表示 JVM 2005年2月6日 修士論文発表会 19 指定した advice (2/4) String file = thisJoinPoint.filePath; int line = thisJoinPoint.line; bugdel.Bugdel.openEditor("localhost",5555,file,line); System.err.println(thisJoinPoint.location); Object[][] vs = thisJoinPoint.variables; bugdel.Bugdel.printVariables(vs); ソースコードの位置情報を コンソールに出力 javax.swing.JOptionPane.showMessageDialog(null,"OK?"); 2005年2月6日 修士論文発表会 20 指定した advice (3/4) String file = thisJoinPoint.filePath; int line = thisJoinPoint.line; bugdel.Bugdel.openEditor("localhost",5555,file,line); System.err.println(thisJoinPoint.location); Object[][] vs = thisJoinPoint.variables; bugdel.Bugdel.printVariables(vs); javax.swing.JOptionPane.showMessageDialog(null,"OK?"); コード実行位置に存在する 変数一覧をコンソールへ出力 2005年2月6日 修士論文発表会 21 変数一覧を表示 thisJoinPoint.variables – Object[][] 型 – Joinpoint に存在するローカ ル変数とクラスフィールドの 一覧 – 各変数の名前、値、型、アク セス修飾子 bugdel.Bugdel.printVariables メ ソッドの概要 Object[][] v = thisJoinPoint.variables; for(int i=0; i<v.length; i++){ System.err.print(v[i][0]+”=“+v[i][1]+”,”); } 2005年2月6日 修士論文発表会 22 指定した advice (4/4) String file = thisJoinPoint.filePath; int line = thisJoinPoint.line; bugdel.Bugdel.openEditor("localhost",5555,file,line); System.err.println(thisJoinPoint.location); Object[][] vs = thisJoinPoint.variables; bugdel.Bugdel.printVariables(vs); javax.swing.JOptionPane.showMessageDialog(null,"OK?"); OK ボタンが押されるまで スレッドを停止させる 2005年2月6日 修士論文発表会 23 関連研究 1 AspectJ/AJDT, JBoss AOP – 汎用的なアスペクト指向システム – クラスのモジュール性 Bugdel – テスト、デバッグ専用のアスペクト指向 – モジュール性よりもテスト、デバッグの有用性 Line pointcut, AllLines pointcut Joinpoint に存在するローカル変数へのアクセス bugdel.Bugdel.jump(..) 2005年2月6日 修士論文発表会 24 関連研究 2 従来のデバッガ Bugdel (JPDA) 主な用途 ブレイクポイント トレース (実行を止める) (実行を止めない) ブレイクポイントのエミュ レート JVM の デバッグモード 必要 (JVM の改良) 不必要 ブレイクポイントの指定 インタラクティブ コンパイル (Weave) 時 (動的) 2005年2月6日 修士論文発表会 25 発表リスト 発表論文 – Bugdel: An Aspect-Oriented Debugging System, First Asian Workshop on AOSD, In Proc. of APSEC2005, IEEE press, pp.790-795, 2005.12 – アスペクト指向を利用してデバッグコードを挿入できるソフトウェア開発環 境, コンピュータソフトウェア, vol.22, no.3, pp.229-234, ソフトウェア科学 会, 2005 – アスペクト指向を利用してデバッグコードを挿入できるソフトウェア開発環 境, 日本ソフトウェア科学会第21回大会, 2004.9 口答発表、ポスター発表 – 第17回 コンピュータシステム・シンポジウム 2005.11 – 第4回SPAサマーワークショップ, 2005.8 – Fourth International Conference on Aspect-Oriented Software Development, 2005.3 – 第8回SPAワークショップ, 2005.3 – AOPワークショップ, 第3回SPAサマーワークショップ, 2004.8 (口答発表) – 第299回, Programming Tools and Techniques, 2004.4 (口答発表) – 第7回SPAワークショップ, 2004.3 2005年2月6日 修士論文発表会 26 Bugdelの配布 オープンソース・ソフトウェア (CPL ライセンス) として公開 SuperJEngine® のデバッガミドルウェアとして採用 – 日立ソフトウェアエンジニアリング (株) が開発 – J2ME 実行環境 – DCT (クラス群) を利用したコードを Bugdel によりクラスファイルに追加 2000 ホームページへのアクセス (月平均1052) 1800 ダウンロード (月平均268) 1600 1400 ア 1200 ク セ 1000 ス 800 数 600 400 200 0 2004年11月 2005年1月 2005年2月6日 2005年3月 2005年5月 修士論文発表会 2005年7月 2005年9月 2005年11月 27 報道 「日立ソフト,東工大のアスペクト指向ツール を組み込み Java デバッグ製品に応用」, Tech-On!,日経BP, 2006年1月24日 「東工大が開発した AOP オープンソース・ソ フト,日立ソフトが Java 開発環境に採用」, IT Pro 日経BP, 2005年5月20日 2005年2月6日 修士論文発表会 28 まとめ Bugdel を提案 – 統合開発環境 Eclipse のプラグイン GUI を利用した pointcut の指定 – テスト、デバッグに特化したアスペクト指向システム Line pointcut, AllLines pointcut Joinpoint に存在するローカル変数へのアクセス thisJoinPoint.varables bugdel.Bugdel.openEditor(..) – ブレイクポイントのエミュレート デバッグモードの無い JVM 上で実現 2005年2月6日 修士論文発表会 29
© Copyright 2024 ExpyDoc