アスペクト指向を利用して デバッグコードを挿入できる ソフトウェア開発環境 東京工業大学 情報理工学研究科 薄井 義行 千葉 滋 JSSST2004 1 アスペクト指向とは • クラス間にまたがる処理をモジュール化 – 主に Pointcut、Advice で処理を記述 • Pointcut – いつコードを実行するのか • 例: Serverクラスのserviceメソッドが実行されたとき – プリミティブな pointcut • set: フィールドへの代入、 execution: メソッドの実行、 call: メソッド呼び出し、 handler: 例外ハンドラ実行など • Advice – 何のコードを実行するのか • 例:ログ出力命令を実行 JSSST2004 2 汎用アスペクト指向言語によるデバッグ • AspectJ – Javaを言語拡張した汎用的なアスペクト指向言語 アスペクト serviceメソッドの実行前に class ServerA{ Logger.logを実行 void service(){ public aspect LogAspect { pointcut p() : execution(void ServerA.service()) || execution(void ServerB.service()); } before() : p(){ Logger.log("service"); } JSSST2004 Advice メイン処理 }} class ServerB{ void service(){ メイン処理 }} 3 アスペクト指向をデバッグに 利用する利点 • Pointcut でコード挿入位置をまとめて指定 – 例:Point クラスの変数 x に代入する位置全て • デバッグコードの on,off が容易 – アスペクトの on, off • ソースコードを変更 しない – 可読性が低下しない – 誤って変更してしまう ことがない JSSST2004 デバッグ対象 プログラム アスペクト (デバッグコード) pointcut 挿入位置の条件 advice デバッグコード 4 Bugdel:デバッグ専用AOシステム • 汎用AOシステム (AspectJ) で十分なのか? – モジュール性、整合性を重視 – デバッグ時にはモジュール性 (カプセル化) を壊さなければ いけない • ローカル変数へのアクセスなど • デバッグ専用AOシステム (Bugdel) – モジュール性を犠牲にしても、デバッグに有用なものは取り 入れる • Bugdel – GUI を利用した pointcut の指定 – Java用の開発環境 • Eclipse (統合開発環境)のプラグイン JSSST2004 5 Bugdelのデモ http://www.csg.is.titech.ac.jp/~usui/bugdel/demo/ JSSST2004 6 Bugdelの特徴 Line pointcut • 任意の行でデバッグ出力を行える • 汎用 AOP (AspectJ) では採用できない – カプセル化を阻害 • Line pointcut はメソッドの実装に依存するので、メ ソッドの実装を安易に変更できなくなる • デバッガでは問題ないが、汎用 AOP (AspectJ)は採 用できない – ソースコードの編集により位置がずれる • 統合開発環境が、編集にあわせて位置を自動調整 JSSST2004 7 Bugdelの特徴 Advice 内からローカル変数へのアクセス public aspect LogAspect { class ServerA{ pointcut p() : void service(){ execution(void ServerA.service()); int n = 10; after() : p(){ メイン処理 System.out.println(“service"); }} } } ローカル変数nへアクセス をBugdelは可能。 AspectJでは不可能。 • 汎用 AOP 言語では採用できない – カプセル化を阻害 • ローカル変数はメソッドの実装内部でだけ参照できるべき JSSST2004 8 Bugdelの特徴 Pointcutの指定方法 • Bugdel – 選択的に指定 – ダイアログを利用 • AspectJ/AJDT – 宣言的プログラミング言語で指定 • 複雑な指定が可能 JSSST2004 pointcut p() : execution(void ServerA.service()) 9 || execution(void ServerB.service()); Bugdelの特徴 ダイアログの利用 JSSST2004 10 Bugdelが提供するpointcut fieldSet フィールド代入 fieldGet フィールド参照 methodExecution メソッド実行 methodCall メソッド呼び出し constructorExection コンストラクタ実行 constructorCall コンストラクタ呼び出し hadler 例外ハンドラ実行 instanceof Instanceof演算子の実行 cast キャストの実行 line pointcut ソースコードの行番号を指定 JSSST2004 11 thisJoinPointの利用 1public class A{ 2 int n; 3 void run1(){ 4 n = 10; 5 … 6 n = 20; 7 } 8 void run2(){ 9 n = 30; 10 … 11 } 12} JSSST2004 3つの違いは? Pointcut: フィールドnに代入している位置 Advice: System.out. println( thisJoinPoint.location ); thisJoinPoint.location ↓ 挿入時に展開 ”A.<> (A.java line:9)” 12 Advice内の特殊変数 • thisJoinPoint.kind – Pointcut の種類 • thisJoinPoint.location – コード挿入位置のファイル名と行番号 • $0, $1, … – ターゲットオブジェクト、メソッドの引数など – 例:handlerの場合$1は取得する例外オブジェクト • $break() – Eclipseに含まれているデバッガのブレイクポイント を設定 JSSST2004 13 デバッグコードの埋め込み (weave) 実装 • Pointcut の対象となる位置の特定 – バイトコード(クラスファイル)を見て判断 – Javassist ライブラリを利用 • AspectJ は不使用 • 埋め込み – クラスファイルにコードを埋め込み上書き保存 – プログラムの実行に Eclipse、Bugdel は不要 • サーバーサイド、Tomcatでも実行可能 JSSST2004 14 Pointcutの候補の表示 実装 • ソースコード上で選択されているものがフィールド 名、メソッド名、クラス名のどれかシステムが判断 – Eclipse プラグイン JDT の機能を利用 • JDT: Java Development Tools • ソースコードを操作するAPIを提供 JSSST2004 15 実装 行番号の情報の監視 • 問題 – ソースコードの変更時に Line pointcut の行番 号がずれる • 解決方法 – Eclipseのリソースマーカ機能を利用 • 行番号にマークを付けて監視 – ソースコードをセーブした際、リソースマーカを確 認、行番号を更新 JSSST2004 16 まとめ • デバッグ専用 AO システム Bugdel を提案 • 専用AOシステム vs 汎用AOシステム – デバッグ専用 (Bugdel) • モジュール性を阻害しても、デバッグに有用なものは取 り入れる – Line pointcut – Pointcut 位置のローカル変数へのアクセス – 汎用 (AspectJ) • プログラムのモジュール性、整合性を重視 JSSST2004 17 終わり JSSST2004 Bugdel Home Page http://www.csg.is.titech.ac.jp/~usui/bugdel 18
© Copyright 2024 ExpyDoc