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