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