Bugdel:アスペクト指向を利用してデバッグコードを挿

アスペクト指向を利用して
デバッグコードを挿入できる
ソフトウェア開発環境
東京工業大学 情報理工学研究科
薄井 義行 千葉 滋
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