18
JSSST2004 1 アアアアアアアアアアアア アアアアアアアアアアアア アアアアアアアアアアアアア アアアアアアアアアアアアア アアアアアアアアアア アアアアアアアアアア 東東東東東東 東東東東東東東東 東東東東東東 東東東東東東東東 東東 東東 東東 東東 東東 東東

アスペクト指向を利用して デバッグコードを挿入できる ソフトウェア開発環境

  • 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

Page 1: アスペクト指向を利用して デバッグコードを挿入できる ソフトウェア開発環境

JSSST2004 1

アスペクト指向を利用しアスペクト指向を利用してて

デバッグコードを挿入でデバッグコードを挿入できるきる

ソフトウェア開発環境ソフトウェア開発環境東京工業大学 情報理工学研究科東京工業大学 情報理工学研究科

薄井 義行  千葉 滋薄井 義行  千葉 滋

Page 2: アスペクト指向を利用して デバッグコードを挿入できる ソフトウェア開発環境

JSSST2004 2

アスペクト指向とはアスペクト指向とは• クラス間にまたがる処理をモジュール化

– 主に Pointcut 、 Advice で処理を記述

• Pointcut– いつコードを実行するのか

• 例 : Server クラスの service メソッドが実行されたとき

– プリミティブな pointcut• set: フィールドへの代入、 execution: メソッドの実行、

call: メソッド呼び出し、 handler: 例外ハンドラ実行など

• Advice– 何のコードを実行するのか

• 例:ログ出力命令を実行

Page 3: アスペクト指向を利用して デバッグコードを挿入できる ソフトウェア開発環境

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

アスペクト

Page 4: アスペクト指向を利用して デバッグコードを挿入できる ソフトウェア開発環境

JSSST2004 4

アスペクト指向をデバッグにアスペクト指向をデバッグに利用する利点利用する利点

• Pointcut でコード挿入位置をまとめて指定– 例 :Point クラスの変数 x に代入する位置全て

• デバッグコードの on,off が容易– アスペクトの on, off

• ソースコードを変更しない– 可読性が低下しない– 誤って変更してしまう

ことがない

デバッグ対象プログラム アスペクト

(デバッグコード )

挿入位置の条件

デバッグコードadvice

pointcut

Page 5: アスペクト指向を利用して デバッグコードを挿入できる ソフトウェア開発環境

JSSST2004 5

Bugdel:Bugdel: デバッグ専用デバッグ専用 AOAO システシステムム

• 汎用 AO システム (AspectJ) で十分なのか?– モジュール性、整合性を重視– デバッグ時にはモジュール性 ( カプセル化 ) を壊さな

ければいけない• ローカル変数へのアクセスなど

• デバッグ専用 AO システム (Bugdel)– モジュール性を犠牲にしても、デバッグに有用なもの

は取り入れる• Bugdel

– GUI を利用した pointcut の指定– Java 用の開発環境

• Eclipse ( 統合開発環境 ) のプラグイン

Page 6: アスペクト指向を利用して デバッグコードを挿入できる ソフトウェア開発環境

JSSST2004 6

BugdelBugdel のデモのデモ

http://www.csg.is.titech.ac.jp/~usui/bugdel/demo/

Page 7: アスペクト指向を利用して デバッグコードを挿入できる ソフトウェア開発環境

JSSST2004 7

Line pointcutLine pointcut• 任意の行でデバッグ出力を行える• 汎用 AOP (AspectJ) では採用できない

– カプセル化を阻害• Line pointcut はメソッドの実装に依存するので、

メソッドの実装を安易に変更できなくなる• デバッガでは問題ないが、汎用 AOP (AspectJ) は

採用できない

– ソースコードの編集により位置がずれる• 統合開発環境が、編集にあわせて位置を自動調整

BugdelBugdel の特徴の特徴

Page 8: アスペクト指向を利用して デバッグコードを挿入できる ソフトウェア開発環境

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 の特徴の特徴

Page 9: アスペクト指向を利用して デバッグコードを挿入できる ソフトウェア開発環境

JSSST2004 9

PointcutPointcut の指定方法の指定方法• Bugdel

– 選択的に指定– ダイアログを利用

• AspectJ/AJDT– 宣言的プログラミング言語で指定

• 複雑な指定が可能pointcut p() : execution(void ServerA.service()) || execution(void ServerB.service());

BugdelBugdel の特徴の特徴

Page 10: アスペクト指向を利用して デバッグコードを挿入できる ソフトウェア開発環境

JSSST2004 10

ダイアログの利用ダイアログの利用BugdelBugdel の特徴の特徴

Page 11: アスペクト指向を利用して デバッグコードを挿入できる ソフトウェア開発環境

JSSST2004 11

BugdelBugdel が提供するが提供する pointcutpointcutfieldSet フィールド代入fieldGet フィールド参照methodExecution メソッド実行methodCall メソッド呼び出しconstructorExection コンストラクタ実行

constructorCall コンストラクタ呼び出しhadler 例外ハンドラ実行instanceof Instanceof 演算子の実行

cast キャストの実行line pointcut ソースコードの行番号を指定

Page 12: アスペクト指向を利用して デバッグコードを挿入できる ソフトウェア開発環境

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 );

Page 13: アスペクト指向を利用して デバッグコードを挿入できる ソフトウェア開発環境

JSSST2004 13

AdviceAdvice 内の特殊変数内の特殊変数• thisJoinPoint.kind

– Pointcut の種類• thisJoinPoint.location

– コード挿入位置のファイル名と行番号• $0, $1, …

– ターゲットオブジェクト、メソッドの引数など– 例: handler の場合 $1 は取得する例外オブジェク

ト• $break()

– Eclipse に含まれているデバッガのブレイクポイントを設定

Page 14: アスペクト指向を利用して デバッグコードを挿入できる ソフトウェア開発環境

JSSST2004 14

デバッグコードの埋め込みデバッグコードの埋め込み(weave)(weave)

• Pointcut の対象となる位置の特定– バイトコード ( クラスファイル ) を見て判断– Javassist ライブラリを利用

• AspectJ は不使用

•埋め込み– クラスファイルにコードを埋め込み上書き保存– プログラムの実行に Eclipse 、 Bugdel は不要

•サーバーサイド、 Tomcat でも実行可能

実装実装

Page 15: アスペクト指向を利用して デバッグコードを挿入できる ソフトウェア開発環境

JSSST2004 15

PointcutPointcut の候補の表示の候補の表示• ソースコード上で選択されているものがフィー

ルド名、メソッド名、クラス名のどれかシステムが判断– Eclipse プラグイン JDT の機能を利用

• JDT: Java Development Tools• ソースコードを操作する API を提供

実装実装

Page 16: アスペクト指向を利用して デバッグコードを挿入できる ソフトウェア開発環境

JSSST2004 16

行番号の情報の監視行番号の情報の監視• 問題

– ソースコードの変更時に Line pointcut の行番号がずれる

•解決方法– Eclipse のリソースマーカ機能を利用

• 行番号にマークを付けて監視

– ソースコードをセーブした際、リソースマーカを確認、行番号を更新

実装実装

Page 17: アスペクト指向を利用して デバッグコードを挿入できる ソフトウェア開発環境

JSSST2004 17

まとめまとめ• デバッグ専用 AO システム Bugdel を提案

• 専用 AO システム vs 汎用 AO システム– デバッグ専用 (Bugdel)

• モジュール性を阻害しても、デバッグに有用なものは取り入れる

– Line pointcut– Pointcut 位置のローカル変数へのアクセス

– 汎用 (AspectJ)• プログラムのモジュール性、整合性を重視

Page 18: アスペクト指向を利用して デバッグコードを挿入できる ソフトウェア開発環境

JSSST2004 18

終わり終わり

Bugdel Home Pagehttp://www.csg.is.titech.ac.jp/~usui/bugdel