Bugdel: An Aspect-Oriented Debugging System

統合開発環境のための
アスペクト指向システム
千葉研究室
薄井 義行
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