JP2008090557A - デバッガ制御装置及びデバッガ制御方法 - Google Patents
デバッガ制御装置及びデバッガ制御方法 Download PDFInfo
- Publication number
- JP2008090557A JP2008090557A JP2006270002A JP2006270002A JP2008090557A JP 2008090557 A JP2008090557 A JP 2008090557A JP 2006270002 A JP2006270002 A JP 2006270002A JP 2006270002 A JP2006270002 A JP 2006270002A JP 2008090557 A JP2008090557 A JP 2008090557A
- Authority
- JP
- Japan
- Prior art keywords
- pointcut
- join
- point
- breakpoint
- program
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Debugging And Monitoring (AREA)
Abstract
【課題】シンボリックデバッガに対してはブレークポイントの指定方式とコマンド言語仕様を拡張して利便性を向上する一方、アスペクト指向プログラミング言語に対してはコンパイル不要で、プログラムのロジック変更等が可能なデバッグ装置及びデバッガ制御方法を実現すること。
【解決手段】アスペクト指向プログラムの書式で記述したアスペクト記述ファイルを入力とし、ターゲットプログラム上の複数のジョインポイントを指定するための複数のポイントカット論理式を有するポイントカット表を記憶する記憶手段と、前記複数のジョインポイントのうち、ポイントカット論理式が真となり得るジョインポイントからなるジョインポイント部分集合を計算するジョインポイント計算手段と、前記ジョインポイント部分集合の各ジョインポイント上のポイントカット論理式を簡略化するポイントカット簡略化手段と、前記簡略化されたポイントカット論理式をコード化することにより命令コード表を生成するコード化手段と、を具備する。
【選択図】図1
【解決手段】アスペクト指向プログラムの書式で記述したアスペクト記述ファイルを入力とし、ターゲットプログラム上の複数のジョインポイントを指定するための複数のポイントカット論理式を有するポイントカット表を記憶する記憶手段と、前記複数のジョインポイントのうち、ポイントカット論理式が真となり得るジョインポイントからなるジョインポイント部分集合を計算するジョインポイント計算手段と、前記ジョインポイント部分集合の各ジョインポイント上のポイントカット論理式を簡略化するポイントカット簡略化手段と、前記簡略化されたポイントカット論理式をコード化することにより命令コード表を生成するコード化手段と、を具備する。
【選択図】図1
Description
本発明は、アスペクト指向プログラムの処理機能を備えたデバッガ制御装置及びデバッガ制御方法に関する。
シンボリックデバッガ(Symbolic Debugger)は、マシン語プログラムに付属するシンボル情報を利用して、命令番地にブレークポイント(Break Point)を設定してプログラムを実行し、ブレークポイントで中断したプログラム変数の参照及び更新する機能を有する。公知のシンボリックデバッガ(例えば下記非特許文献1を参照)は、シンボル情報とブレークポイントの関係は基本的に1対1の関係にあり、ブレークポイントの指定は対象シンボルを列挙する単純な形式を基本としている。また、プログラム変数の参照や更新に利用するコマンド言語は、利用者の対話的な入力を想定しており極めて簡易な言語仕様である。
アスペクト指向プログラミング(Aspect Oriented Programming)は、オブジェクト指向プログラミング(Object Oriented Programming)言語のモジュール化機能の不足を補う新しいプログラミングの機構である。アスペクト指向言語は複数のクラスに対して一括したロジックの追加等が可能であり、例えばプログラムのテストやデバッグ用途のロジックを対象プログラムから分離して開発し、合成できる利便性を有する。公知のアスペクト指向プログラミング言語(例えば下記非特許文献2を参照)は、プログラム言語処理系(コンパイラ)レベルの実装であり、プログラムへロジックの追加等を行うにはプログラム全体のコンパイルが必要である。
Richard M.Stallman et.al.,"Debugging With GDB:The GNU Source−Level Debugger",ISBN:1882114884,Free Software Foundation,2002. Gregor Kiczales et.al,"An Overview of AspectJ","Lecture Notes in Computer Science (LNSC)",vol.2072,pp.327−355,Springer,2001.
Richard M.Stallman et.al.,"Debugging With GDB:The GNU Source−Level Debugger",ISBN:1882114884,Free Software Foundation,2002. Gregor Kiczales et.al,"An Overview of AspectJ","Lecture Notes in Computer Science (LNSC)",vol.2072,pp.327−355,Springer,2001.
本発明は、シンボリックデバッガに対してはブレークポイントの指定方式とコマンド言語仕様を拡張して利便性を向上する一方、アスペクト指向プログラミング言語に対してはコンパイル不要で、プログラムのロジック変更等が可能なデバッグ装置及びデバッガ制御方法を実現することを目的とする。
本発明の一観点に係るデバッガ制御装置は、アスペクト指向プログラムの書式で記述したアスペクト記述ファイルを入力とし、ターゲットプログラム上のジョインポイントの集合を指定するための複数のポイントカット論理式を有するポイントカット表を記憶する記憶手段と、前記複数のブレークポイントのうち、ポイントカット論理式が真となり得るジョインポイントからなるジョインポイントの部分集合を計算するジョインポイント計算手段と、前記ジョインポイント部分集合の各ジョインポイントにおいてポイントカット論理式を簡略化するポイントカット論理式の簡略化手段と、前記簡略化されたポイントカット論理式をコード化することにより命令コード表を生成するエンコード手段と、を具備する。
本発明によれば、シンボリックデバッガに対してはブレークポイントの指定方式とコマンド言語仕様を拡張して利便性を向上する一方、アスペクト指向プログラミング言語に対してはコンパイル不要で、プログラムのロジック変更等が可能なプログラム実行環境を実現することができる。
以下、図面を参照しながら本発明の実施形態を説明する。
図1に示すように、本発明の一実施形態に係るプログラム実行システムは、CPU等のハードウェア資源及びオペレーティングシステム(OS)等の基本ソフトウェアを有する計算機プラットフォーム1と、シンボリックデバッガのカーネル(DBG:Debugger)2及びシンボリックデバッガのインターフェース20と、アスペクト指向ベリファイア(AOV:Aspect Oriented Verifier)カーネル(以下、「AOVカーネル」)3と、スクリプト評価装置(EVAL:Evaluator)4とから構成されている。スクリプト言語で記述されたアスペクト記述ファイル5はAOVカーネル3に入力される。マシン語で記述された実行形式ファイル6は、計算機プラットフォーム1に入力されて実行されるが、同実行形式ファイル(プログラム)6を対象としてデバッグ作業を行う際には、同プログラム6(ターゲットプログラム)は、デバッガカーネル2からの制御を受ける。
図2に示すように、AOVカーネル3は、アスペクト指向言語の構文解析装置(PARSE)7と、構文解析装置(PARSE)7により得られる構文解析結果(PCTAB8とADTAB9)に基づいて実行前の最適化を行う最適化装置(OPTIM)10とを有する。これらは、ターゲットプログラム6の実行前に、アスペクト記述ファイルに記述されたアスペクト指向プログラム5を解析して最適化する部分に相当する。
また、AOVカーネル3は、ターゲットプログラム6の実行前に、エンコード結果(JPTAB)11に基づきブレークポイントを初期化設定してターゲットプログラム6を開始する初期化装置(INIT)14と、デバッガカーネル2からブレークポイント発生の通知を受け取ってブレークポイント発生イベントを処理するイベント処理装置(HANDLE)12を有する。さらに、AOVカーネル3は、ブレークポイント発生イベントに応じてアスペクト指向プログラム5のスクリプト命令を評価するスクリプト評価装置4(EVAL)を有する。
本実施形態は、シンボリックデバッガとアスペクト指向プログラミングの処理装置を連動させることで、コンパイル不要でターゲットプログラム6にインタープリタ言語のプログラムを合成することができる。ブレークポイントは、アスペクト指向プログラミング言語のポイントカット構文の形式によって指定可能とし、ブレークポイントにおいてアスペクト指向プログラミング言語のコマンドが実行され、プログラム変数を参照し又は更新できるようにする。また、ターゲットプログラム6の実行中に必要となるブレークポイントの数を最小化し、及びブレークポイント発生時の計算量を最小化するための最適化の仕組みを備える。
ここで、アスペクト指向プログラミング言語について説明する。
「アスペクト指向(aspect-oriented)」とは、オブジェクト指向(object-oriented)の枠組みではモジュール化が困難な横断的関心事(cross cutting concerns)をモジュール化する新たなモジュール化の枠組み(パラダイム=paradigm)のことをいう。この枠組みを具体化するプログラミング言語として、アスペクト指向の考え方を取り入れてJava(登録商標)言語を拡張したAspectJ言語などが有名である。
「ジョインポイント(join point)」とは、アスペクト指向プログラミング言語において、対象プログラム上のアスペクト(後述)の織り込み可能な箇所の全体であり、「結合点」と表記されることもある。本明細書中の「ジョインポイント部分集合」とは、ポイントカット式を固定した場合に、ポイントカット式が真となり得るジョインポイントの全体を示すものと約束する。例えば図3に示すように、ロジック追加が可能なターゲットプログラム6上の場所の集合がジョインポイント(join−point)である。以下の具体的では、ジョインポイントは、ターゲットプログラム6のサブルーチンコールの直前又は直後、クラスのメンバ変数のアクセス(参照又は更新)の直前又は直後の全体と定義する。
「アスペクト(aspect)」とは、アスペクト指向言語の基本的なモジュール化の構文要素のことであり、オブジェクト指向言語のクラス(class)に相当する。アスペクトは、どのジョインポイントへ如何なる処理を織り込む(weave)かの情報を含む。前者はポイントカット(後述)と呼ばれる論理式の形で記述する、後者はアドバイス(後述)と呼ばれる手続きの形で記述する。アスペクトの意味としては、対象プログラムの各ジョインポイントにおいてポイントカットの論理式を評価して、評価結果が真となる場合に限り、対応するアドバイスを実行する。
「ポイントカット(pointcut)」とは、原始ポイントカット(primitive pointcut)と呼ばれる原子項を論理演算子(論理和「∧」又は「||」、「論理積∨」又は「&&」、論理否定「¬」又は「!」)で任意に結合した論理式である。原始ポイントカットは、プログラム実行前に値の定まる静的ポイントカットと、プログラム実行時に値の定める動的ポイントカットに大別できる。どのような原始ポイントカットを利用可能かは、各アスペクト指向言語の詳細に依存する。
アスペクト指向プログラム5の記述において、ロジック追加対象となるターゲットプログラム6上の場所を指定するために、図4に示すような「ポイントカット(point−cut)論理式」を使用する。図5にポイントカット構文を示す。ターゲットプログラム6に追加するロジックの指定は、あらかじめ定義したポイントカット論理式への参照とロジック内容を指定するアドバイス(advice)文を使用する。図6にアドバス構文を示す。
「アドバイス(advice)」とは、オブジェクト指向言語におけるメソッドに対応する構文要素であり、アドバイスの織り込み位置を指定するポイントカットまたはポイントカットへの参照と、具体的な処理の内容を宣言する。
上述したように、ポイントカット論理式は原始ポイントカット(primitive point−cut)を論理和、論理積、論理否定で任意に結合した論理式である。また、原始ポイントカットは、プログラム実行前に真偽値の定まる静的ポイントカットと、プログラム実行時に真偽値の定まる動的ポイントカットに分類できる。原始ポイントカットの分類例を図7に示す。動的ポイントカットはターゲットプログラムのシンボルを引数とする1階ポイントカットと、ポイントカット自体を引数とする2階ポイントカットなどが存在する。例えば図7の原始ポイントカット「call(<sign>)」は、プログラムの記号パタン<sign>にマッチするシンボル(サブルーチン識別子)のジョインポイントを選択し、「if(<cond>)」はプログラム実行中にジョインポイント上で式<cond>を評価して真なら当該ジョインポイントを選択し、「cflow(<expr>)」はポイントカット<expr>の選択するジョインポイントの間に追加するジョインポイントを選択する。
図8にポイントカットの応用例を示す。ポイントカット論理式「call(M3)」がモジュールM3呼び出し(サブルーチンコール)全体を選択し、ポイントカット論理式「call(M4)∧!cflow(call(M5))」はモジュールM4呼び出しの中でモジュールM5以外が呼ぶケースを選択する。
図6に示したアドバイス構文は「参照するポイントカット論理式をプログラム実行時に各ジョインポイントで評価した結果が真ならば対応するロジックを実行する。」という意味を有する。なお、アドバイスはジョインポイントの前又は後(「before」又は「after」)の修飾子が付き、サブルーチンコールの場合は、追加ロジックを実行する場所が呼び出しの直前又は直後の意味と解釈する。
<静的(事前)最適化及び動的最適化>
アスペクト指向プログラム5の処理系をシンボリックデバッガのブレークポイント機能を利用して実現する際に、各ブレークポイント上で評価するポイントカット論理式の計算において、実行前に値の決まらない部分のみを評価することが望ましい。また、ジョインポイントの全体に対応する全てのサブルーチンコールの直前又は直後にブレークポイントを挿入するのは効率が悪い。したがって、ターゲットプログラム6に挿入するブレークポイントの数を最小限に抑えることが望ましい。
アスペクト指向プログラム5の処理系をシンボリックデバッガのブレークポイント機能を利用して実現する際に、各ブレークポイント上で評価するポイントカット論理式の計算において、実行前に値の決まらない部分のみを評価することが望ましい。また、ジョインポイントの全体に対応する全てのサブルーチンコールの直前又は直後にブレークポイントを挿入するのは効率が悪い。したがって、ターゲットプログラム6に挿入するブレークポイントの数を最小限に抑えることが望ましい。
本実施形態のデバッガ制御装置は、ブレークポイントに関わる最適化処理のための最適化装置を備える。この最適化装置は、ポイントカット論理式から最小限のジョインポイント部分集合を計算するジョインポイント計算装置、計算した各ジョインポイント上でポイントカット論理式を簡略化するポイントカット簡略化装置、及び実行中に、ブレークポイントを必要に応じて追加するブレークポイント追加装置から成る。図2に示した構成において、最適化装置10が、ジョインポイント計算装置及びポイントカット簡略化装置を備えていてもよい。また、イベント処理装置12がブレークポイント追加装置を備えていてもよい。
なお、以下の説明では、ターゲットプログラム6の具体例として図9に示す入力プログラム例を用い、アスペクト指向プログラム5の具体例として図10に示す入力アスペクト例を用いる。また、最適化装置の動作に先立って、以下の情報があらかじめ生成されるものとする。すなわち、AOVカーネル3は、アスペクト記述(図10:入力アスペクト例)を構文解析することによりポイントカット表(図11:PCTAB)8とアドバイス表(図12:ADTAB)9を生成する。デバッガカーネル(DBG)2は、ターゲットプログラム6のシンボル情報を解析してシンボル表(図13:SMTAB)を生成する。
<ジョインポイント計算装置>
ジョインポイント計算装置は、ポイントカット表(PCTAB)8とターゲットプログラム6の静的なシンボル表(SMTAB)を入力として、ポイントカット論理式が真となり得るジョインポイントからなるジョインポイント部分集合を計算する。ポイントカット表8は図14に示すポイントカット構文木と等価な内容である。
ジョインポイント計算装置は、ポイントカット表(PCTAB)8とターゲットプログラム6の静的なシンボル表(SMTAB)を入力として、ポイントカット論理式が真となり得るジョインポイントからなるジョインポイント部分集合を計算する。ポイントカット表8は図14に示すポイントカット構文木と等価な内容である。
最初に、アドバイス表(ADTAB)9が参照するポイントカット構文木に現れる高階の原始ポイントカット「cflow(<expr>)」に対して、ポイントカット論理式「<expr>」が選択する区間の開始と終了を記録する二個のアドバイス文を、システムが生成してアドバイス表(ADTAB)9に追加する。図15は、図12に示したアドバイス表(ADTAB)9に、システムがアドバイス文を追加した後の様子を示している。
次に、ポイントカット論理式を評価する前処理として、ポイントカット論理式にドモルガンの法則を適用して等価変形を行い、否定演算子「!」が原始ポイントカットに直接作用する形に変形する。この様子を図16に示す。また、図17は、処理後のポイントカット表を示している。
次に、ポイントカット構文木のノードを後行順(post−order)で辿りながら、各ノードに対応するジョインポイント部分集合を計算する。この様子を図18に示す。図19は、処理後のポイントカット表を示している。なお、構文木の末端となる原始ポイントカット(図7、図20:原始ポイントカット)に関しては、静的な原始ポイントカットの場合は記号パタンに合致するジョインポイントの部分集合、動的な原始ポイントカットの場合はジョインポイントの全集合とする。
最後に、アドバイスから参照されるポイントカット構文木の根ノードに対応するジョインポイントの集合を最小なジョインポイント部分集合とする。この過程を宣言的に記述したものが図21に示すジョインポイント演算子である。図21に現れるポイントカット論理式はドモルガンの法則による変形後の論理式とする。また、図22乃至図24に、最小ジョインポイントを求めるための具体的な手続き等を示す。図22はノード構造体を示しており、図23はドモルガン演算、図24はジョインポイント計算の手続を示している。図23に示す手続は、構文解析木の根ノード以下をドモルガンの法則を適用して等価変形するものである。図24及び図25に示す手続は、ドモルガン演算後の構文解析木の根ノードを入力して事前評価シンボルを計算するものである。
上記のように、ポイントカット論理式が真となり得るジョインポイント集合を計算する際に、ポイントカット論理式にドモルガンの法則を適用して否定演算子が原始ポイントカットへ作用する形へ書き換える必要がある。このような事前処理が必要な理由について説明する。
たとえば、ジョインポイントの全体がJP=Ω={fun1,fun2,fact}であり、ポイントカット論理式pcが真となり得るジョインポイント集合をS[pc]と表記すると、静的な原始ポイントカットに対する作用はS[call(fun*)]={fun1,fun2}、動的な原始ポイントカットに対する作用はS[if(x)]=S[¬if(x)]=Ω等と定義から定まる。原始ポイントカットを論理演算子で結合した一般のポイントカット式に対する作用は、S[call(fun*)∧¬call(fun1)]=S[call(fun*)]∩S[call(fun1)]^c={fun1,fun2}∩(Ω−{fun1})={fun2}の様に計算できる。つまり、原始ポイントカットの各々にS[ ]を作用して集合へ置き換え、論理演算の和積を集合演算の和積へ置き換え(∧→∩、∨→∪)、ポイントカット式の否定を補集合に置き換える(S[¬pc]=S[pc]^c)。ただし、この置き換え規則は動的な原始ポイントカットと否定演算子が共存すると上手く働かない。たとえば、ポイントカット式pc=¬(call(fun*)∧if(x))の場合に単純に、S[pc]=(S[call(fun*)]∩S[if(x)])^c=({fun1,fun2}∩Ω)^c={fact}となるが、本来の定義よりポイントカット式pcが真になり得る場合を考えると、call(fun*)=falseまたはif(x)=falseの場合となるが、後者は実行前に不定なのでS[pc]=Ωとすべきである。これを解決するには、ポイントカットの論理式をドモルガンの法則を適用して等価な論理式に変形pc=¬(call(fun1)∧if(x))=¬call(fun1)∨¬if(x)した後、前記の置き換え規則を適用することでS[pc]=S[fun1]^c∪Ω=(Ω−{fun1})∪Ω=Ωと正しく評価できる。なお、ここで用いた論理記号(∧、∨、¬)は、それぞれプログラム上の記号(&&、||、!)と同じ意味の記号と約束する。
<ポイントカット簡略化装置>
ジョインポイント計算装置の出力としてジョインポイント部分集合が決まると、各ジョインポイント上で評価すべきポイントカット論理式を簡略化できる。静的な原始ポイントカットに、ジョインポイントを指定した場合の論理定数を割り付け、論理演算子の論理定数に対する性質を利用して論理式を簡略化する。これを図26乃至図28に示す。図26はある一点のジョインポイントの評価例を示し、図27はコード生成の例を示している。図28は簡略化処理後のポイントカット表を示している。
ジョインポイント計算装置の出力としてジョインポイント部分集合が決まると、各ジョインポイント上で評価すべきポイントカット論理式を簡略化できる。静的な原始ポイントカットに、ジョインポイントを指定した場合の論理定数を割り付け、論理演算子の論理定数に対する性質を利用して論理式を簡略化する。これを図26乃至図28に示す。図26はある一点のジョインポイントの評価例を示し、図27はコード生成の例を示している。図28は簡略化処理後のポイントカット表を示している。
簡略化済みのポイントカット論理式は、スタックマシンの命令コード列の形にエンコードしてジョインポイント毎に保存する。この例を図29に示す。スタックマシンは例えば図30に示すような仕様内容とする。なお、入力するポイントカット構文木はドモルガンの法則を適用して中間ノードに否定演算子が存在しない形に変形済みとする。
最初に、ジョインポイントを固定してポイントカット構文木のノードを後行順(post−order)で辿りながら、各ノードに対応する評価ラベルを計算する。この様子を図26に示す。また、評価ラベル計算後のポイントカット表を図28に示す。
なお、構文木の末端となる、図20に示した原始ポイントカットに関しては、静的な原始ポイントカットの場合は記号パタンの合致有無に応じた真偽値の評価ラベル(TRUE又はFALSE)、動的な原始ポイントカットの場合は不定値の評価ラベル(LEAF)を割り当てる。評価ラベルの論理演算について、論理積演算は図31に示すような演算規則に従い、論理和演算は図32に示すような演算規則に従うものとする。
評価ラベル「LEAF」は、一方の子ノードが不定値、ラベル「NODE」は双方の子ノードが不定値の意味とし、最適化後段の命令コード生成に利用する。
次に、ポイントカット構文木のノードを後行順(post−order)に辿りながら、ノードの評価ラベルが定数値(TRUE又はFALSE)の場合は定数値に対応する命令コードを生成する。評価ラベルが未定値の「LEAF」の場合は値が未定の子ノードへ降り、未定値の「NODE」の場合は双方の子ノードへ降りる。中間ノードに対しては二項演算子(AND又はOR)に対応する命令コードを出力し、末端ノードの「LEAF」に対しては規則(図20:原始ポイントカット)の項目「evalat(pc)」の命令コードを生成する。末端ノードに否定演算子が付く場合は末端ノードの命令コードを出力後に否定演算子NOTに対応する命令コードを出力する(図29:命令コード表)。最後に、当該ポイントカットで実行すべきアドバイスの命令を条件付評価の命令コード(IFDO)を出力する。
図33は、以上で説明したポイントカット簡略化の過程を宣言的に記述したものである。また、図34乃至図37にポイントカット簡略化の具体的な手続き等を示す。図34及び図35はポイントカット評価の手続を示し、図36及び図37は命令コード生成の手続を示している。図34及び図35に示すポイントカット評価の手続は、ジョインポイントを指定して構文木ノードに実行前評価ラベルを付与する。図36及び図37に示す命令コード生成の手続は、ラベル付与後の構文解析木の根ノードをコンパイルし、命令コードを生成する。
ここで、上記評価ラベル付与の処理を行う技術的意義について説明する。
ポイントカット式が真となり得るジョインポイント部分集合の計算が済むと、各ジョインポイントにおいてポイントカット式の構造を簡略化することが可能となる。例えば、先に紹介したジョインポイントの全体がJP=Ω={fun1,fun2,fact}、ポイントカット式がpc=¬(call(fun*)∧if(x))の場合を考えると、ジョインポイントの集合はS[pc]=Ωとなる。ジョインポイントをfun1またはfun2に固定して、静的な原始ポイントカットに論理定数を割り付けるとpc=¬(true∧if(x))=¬if(x)となる。ジョインポイントをfactに固定して同様に論理定数を割り付けるとpc=¬(false∧if(x))=trueとなる。この様なジョインポイントを固定したポイントカット式の簡略化を二段階に分けて行う。一段目の処理は、ポイントカットの構文木を探索して、真偽値が確定するノードにラベル(L_TRUEまたはL_FALSE)を割り付け、真偽値が不定のノードにラベル(L_LEAFまたはL_NODE)を割り付ける。二段目の処理は、ラベルの値を参考にポイントカット構文木を探索し簡略化の結果をスタックマシン用の命令コードへエンコードして保存する。ターゲットプログラムの実行中には、簡略結果となるスタックマシン用の命令コードを評価することで、実行時の計算量を節約できる。
以上説明したアスペクト記述の(事前)最適化処理の結果、各ジョインポイントで評価すべき命令列を記載した命令コード表(JPTAB)11が出力される。
<ブレークポイント追加装置>
シンボリックデバッガ2の提供するブレークポイントの機能を用いて、アスペクト指向プログラミングにおけるジョインポイントの機能を実現する。ブレークポイント追加装置への入力は各ジョインポイントの命令コード表(JPTAB)11である。ブレークポイント追加装置は、ブレークポイントの初期化装置(INIT)14とイベント処理装置(HANDLE)12から構成される。なお、シンボリックデバッガ・インターフェース20は、図38に示すような、標準的なデバッガインタフェイスを提供するものと仮定する。
シンボリックデバッガ2の提供するブレークポイントの機能を用いて、アスペクト指向プログラミングにおけるジョインポイントの機能を実現する。ブレークポイント追加装置への入力は各ジョインポイントの命令コード表(JPTAB)11である。ブレークポイント追加装置は、ブレークポイントの初期化装置(INIT)14とイベント処理装置(HANDLE)12から構成される。なお、シンボリックデバッガ・インターフェース20は、図38に示すような、標準的なデバッガインタフェイスを提供するものと仮定する。
基本的なジョインポイント処理の流れを図39及び図40に示す。これらの図に示す本例の場合、関数「func」の前後にアドバイスが挿入される。
ブレークポイントの初期化装置14が、ターゲットプログラム6の開始前に関数「func」の先頭アドレスを調べてブレークポイント「bp#1」を挿入する。ターゲットプログラム6を開始してターゲットプログラム6の実行命令が「func」の先頭に達すると、ブレークポイント「bp#1」のイベントが発生する。イベント処理装置12が関数の戻り番地を調べて、ブレークポイント表(BPTAB)13に、新たにブレークポイント「bp#2」を追加し、入口の命令コードを評価し、ターゲットプログラム6を継続する。同様にブレークポイント「bp#2」のイベントが発生すると、イベント処理装置12が出口の命令コードを評価し、ターゲットプログラム6を継続する。再びブレークポイント「bp#1」でイベント処理装置12が関数の戻り番地を調べてブレークポイント「bp#3」を追加し、入口の命令コードを評価し、ターゲットプログラム6を継続する。ブレークポイント「#bp3」のイベント処理装置12が出口の命令コードを評価して、ターゲットプログラム6を継続する。以下同様に、必要に応じて戻り番地へブレークポイントをブレークポイント表(BPTAB)13に追加してゆく。
アスペクト指向言語のアドバイスは、ポイントカット式で選択したジョインポイントと対応するサブルーチンの入口または出口で実行する。実装上は、ブレークポイントを用いてサブルーチンの入口または出口でターゲットプログラムの実行を中断してアドバイスを実行する。入口はサブルーチン先頭の命令番地へブレークポイントを設定する。サブルーチン入口の命令番地は、通常はターゲットプログラムのシンボル表から調べることができる。サブルーチン出口に対応する命令番地は、複数ある戻り命令の箇所に対応して、シンボル表から調べることができない。そこで、当該関数のサブルーチンの戻り先の命令番地を入口で停止した際に調べて、戻り先の命令番地へ出口に対応するブレークポイントを設定することで代用する。本実施形態のような、サブルーチン出口におけるブレークポイントの利用方式は、ターゲットプログラム実行中に必要に応じてブレークポイントを追加するものであることから、利用するブレークポイントの総数を少なく抑える効果がある。
初期化装置14は、図41に示す手順に従ってブレークポイントの追加登録処理を行う。すなわち、ターゲットプログラム6の開始前にジョインポイント命令コード表(JPTAB)11の各エントリに対して次の処理を行う(図29:命令コード表、図42:命令コード表)。
先ずステップS1において、ジョインポイントの種類を決定する(ステップS1)。当該ジョインポイントの種類「type」は、入口又は出口の一方で命令コードの評価が必要な場合は「BEFORE」又は「AFTER」とし、双方で命令コードの評価が必要な場合は「BOTH=BEFORE|AFTER」とする。次に、ジョインポイントのシンボル名から関数先頭の命令番地「pc」を調べる(ステップS2)。次に、ジョインポイント識別子「jp」の種類を「type」、先頭番地「top」を「pc」に、戻り番地列「ret[]」を空に初期化する。最後に、命令番地「pc」にブレークポイント「bp」を追加し、ブレークポイントの到達時にジョインポイント識別子「jp」を参照可能なように参照関係を設定する。図43はブレークポイント追加前のブレークポイント表、図44はブレークポイント追加後のブレークポイント表を示している。
イベント処理装置12は、ブレークポイント発生のイベントで起動され、図45に示す手順に従ってイベント処理を実行する。初期化時に設定された参照関係によりジョインポイント識別子「jp」を取得する(ステップS1)。次にターゲットプログラム6の命令番地「pc」を調べる(ステップS2)。命令番地が関数の先頭アドレス(「pc=jp.top?」)であるか否かをステップS3において判定し、(「pc=jp.top?」)であるならば、ステップS5において入口の命令コード「enter[]」を評価する。先頭アドレス以外ならば、ステップS4において出口の命令コード「leave[]」を評価して終了する。ステップS5において入口の命令コードを評価した後、ステップS6においては出口の評価が必要であるか否かを判定する。出口の評価が必要である場合にはターゲットプログラム6の戻り番地「pc'」を調べる(ステップS7)。次に、戻り番地が戻り命令番地列「ret[]」に含まれるか否かを判定する(ステップS8)。戻り番地が戻り命令番地列「ret[]」に含まれない場合は新たにブレークポイントを番地「pc'」に追加する(ステップS9)。その他の場合はイベント処理装置12を終了する(図46:命令コード表、図44:ブレークポイント表)。
以上説明した本発明の実施形態によれば、次のような作用効果を得ることができる。
(1)シンボリックデバッガのブレークポイント機能において、ブレークポイントの集合を定義して補集合、和集合や積集合による指定、ターゲットプログラムの制御フローに依存した指定等の高度なブレークポイントの指定が利用できる。
(2)シンボリックデバッガとアスペクト指向プログラム処理系との間にデバッガインタフェイス層(INIT、HANDLE)を設けた結果、上位のアスペクト指向プログラム処理系が下位のデバッガの詳細に依存せず、移植性が向上する。
(3)シンボリックデバッガのプログラム変数を参照又は更新する機能において、汎用プログラミング言語の機能を有するコマンド言語を利用することで、プログラム変数の参照作業や更新作業における人手を減らせる。
(4)マシン語プログラムへのロジック追加等にアスペクト指向プログラミング言語の構文を利用できる。
(5)マシン語プログラムへアスペクト指向プログラムを合成して実行した結果をコンパイル不要の短時間で確認できる。
(6)実行中のマシン語プログラムを中断して、アスペクト指向プログラムの合成後に再開すると、プログラムを終了することなくロジックの追加等が可能となり、プログラムのメンテナンスに利用できる。
(7)プログラムの構成モジュールに対して呼び出しプロトコル(規約)などをアスペクト指向プログラミング言語で記述し、アスペクト指向プログラムと合成してプログラムを実行することでモジュール間のプロトコルを動的に検証できる(図8:応用例)。
(8)テスト用のロジックをプログラムとは別に作成して、実行環境上で速やかに合成できる。
(9)デバッグ用のロジックをプログラムとは別に作成して、実行環境上で速やかに合成できる。
(10)テスト用のロジックでプログラムの変数(関数のリターン値など)を変更することで、プログラムの例外処理テストを簡単に実施できる。
本発明は、計算機プログラム開発時に用いられるデバッガ装置、テスト装置、検証装置、及び障害発生装置、ならびに計算機プログラム運用時に用いられるメンテナンス装置等に対して適用可能である。プログラムの構成モジュール間のプロトコル(呼び出しなど規約)をアスペクト指向言語で記述して、プログラムに合成して実行することで、対象プログラムの修正不要でモジュール間のプロトコルを検証する装置、プログラムの一部又は全ての構成モジュール間の呼び出し履歴をファイル又は主メモリに記録する処理をアスペクト指向言語で記述してプログラムに合成して実行することで、対象プログラムの修正不要で実行履歴を記録する装置、プログラムの一部又は全ての構成モジュール間の呼び出し時刻をファイル又は主メモリに記録する処理をアスペクト指向言語で記述してプログラムに合成して実行することで、対象プログラムの修正不要で実行時間を記録する装置等として実施することもできる。
また、本発明は上記実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、上記実施形態に開示されている複数の構成要素の適宜な組み合わせにより、種々の発明を形成できる。例えば、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。さらに、異なる実施形態にわたる構成要素を適宜組み合わせてもよい。
1…計算機プラットフォーム;
2…デバッガカーネル;
3…AOVカーネル;
4…スクリプト評価装置;
5…アスペクト記述ファイル;
6…ターゲットプログラム(実行形式ファイル);
20…シンボリックデバッガインターフェイス
2…デバッガカーネル;
3…AOVカーネル;
4…スクリプト評価装置;
5…アスペクト記述ファイル;
6…ターゲットプログラム(実行形式ファイル);
20…シンボリックデバッガインターフェイス
Claims (5)
- アスペクト指向プログラムの書式で記述したアスペクト記述ファイルを入力とし、ターゲットプログラム上の複数のジョインポイントを指定するための複数のポイントカット論理式を有するポイントカット表を記憶する記憶手段と、
前記複数のジョインポイントのうち、ポイントカット論理式が真となり得るジョインポイントからなるジョインポイント部分集合を計算するジョインポイント計算手段と、
前記ジョインポイント部分集合の各ジョインポイント上のポイントカット論理式を簡略化するポイントカット簡略化手段と、
前記簡略化されたポイントカット論理式をコード化することにより命令コード表を生成するコード化手段と、を具備するデバッガ制御装置。 - 前記ターゲットプログラムの実行中にブレークポイントイベントを発生するデバッガカーネルと、
前記命令コード表に基づいて前記ターゲットプログラムにブレークポイントを追加するよう前記デバッガカーネルを制御するブレークポイント追加手段と、をさらに具備することを特徴とする請求項1に記載のデバッガ制御装置。 - 前記ブレークポイント追加手段は、
前記デバッガカーネルにおけるブレークポイントイベントの発生に応じて前記命令コード表を参照し、該命令コード表に基づいて追加すべきブレークポイントを求め、ブレークポイント表に追加するイベント処理手段と、
前記ブレークポイント表に記載されたブレークポイントを前記ターゲットプログラムに追加するよう前記デバッガカーネルを制御する手段と、を具備する請求項1記載のデバッガ制御装置。 - 前記イベント処理手段は、
前記ターゲットプログラムにおけるサブルーチンコールの入口のみをジョインポイントとする場合は関数先頭のブレークポイントを用い、
前記サブルーチンコールの出口のみをジョインポイントとする場合は関数先頭のブレークポイントにおいて戻り番地を随時追加して戻り番地のブレークポイントを用い、
サブルーチンコールの入口と出口の双方をジョインポイントとする場合は関数先頭のブレークポイントにおいて戻り番地を随時追加することにより先頭と戻り番地のブレークポイントの双方を用いる請求項3記載のデバッガ制御装置。 - アスペクト指向プログラムの書式で記述したアスペクト記述ファイルを入力とし、ターゲットプログラム上の複数のジョインポイントを指定するための複数のポイントカット論理式を有するポイントカット表を記憶する記憶ステップと、
前記複数のジョインポイントのうち、ポイントカット論理式が真となり得るジョインポイントからなるジョインポイント部分集合を計算するジョインポイント計算ステップと、
前記ジョインポイント部分集合の各ジョインポイント上のポイントカット論理式を簡略化するポイントカット簡略化ステップと、
前記簡略化されたポイントカット論理式をコード化することにより命令コード表を生成するコード化ステップと、を有するデバッガ制御方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2006270002A JP2008090557A (ja) | 2006-09-29 | 2006-09-29 | デバッガ制御装置及びデバッガ制御方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2006270002A JP2008090557A (ja) | 2006-09-29 | 2006-09-29 | デバッガ制御装置及びデバッガ制御方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2008090557A true JP2008090557A (ja) | 2008-04-17 |
Family
ID=39374637
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2006270002A Pending JP2008090557A (ja) | 2006-09-29 | 2006-09-29 | デバッガ制御装置及びデバッガ制御方法 |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2008090557A (ja) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2012038029A (ja) * | 2010-08-05 | 2012-02-23 | Toshiba Corp | 自動書き換えプログラムおよび自動書き換え装置 |
-
2006
- 2006-09-29 JP JP2006270002A patent/JP2008090557A/ja active Pending
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2012038029A (ja) * | 2010-08-05 | 2012-02-23 | Toshiba Corp | 自動書き換えプログラムおよび自動書き換え装置 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Alonso et al. | V3cmm: A 3-view component meta-model for model-driven robotic software development | |
US7478366B2 (en) | Debugger and method for debugging computer programs across multiple programming languages | |
Mernik | An object-oriented approach to language compositions for software language engineering | |
Voelter | Language and IDE Modularization and Composition with MPS | |
JP4057938B2 (ja) | コンパイラ、コンパイル方法、及びプログラム開発ツール | |
CN110149800B (zh) | 一种用于处理与源程序的源代码相关联的抽象语法树的装置 | |
Lindeman et al. | Declaratively defining domain-specific language debuggers | |
US20060075305A1 (en) | Method and system for source-code model-based testing | |
US20050283758A1 (en) | Bi-directional programming system/method for program development | |
Sadilek et al. | Prototyping visual interpreters and debuggers for domain-specific modelling languages | |
JP2005141380A (ja) | テンプレートコンパイル方法 | |
Lourenço et al. | OSTRICH-a type-safe template language for low-code development | |
Kats et al. | Integrated language definition testing: enabling test-driven language development | |
Karsai et al. | Graph transformations in OMG’s model-driven architecture | |
Birken | Building code generators for DSLs using a partial evaluator for the Xtend language | |
Gotti et al. | UML executable: A comparative study of UML compilers and interpreters | |
Seco et al. | Nested OSTRICH: hatching compositions of low-code templates | |
JP2008090557A (ja) | デバッガ制御装置及びデバッガ制御方法 | |
Deantoni et al. | Debugging and verification tools for LINGUA FRANCA in GEMOC studio | |
Crégut et al. | Generative technologies for model animation in the TopCased platform | |
JP2007122187A (ja) | プログラム・コード生成装置 | |
Constantinides et al. | A framework to address a two-dimensional composition of concerns | |
Lugato et al. | Model-Driven Engineering for High Performance Computing Applications | |
Benz | AspectT: aspect-oriented test case instantiation | |
Gurov et al. | Unimod: Method and tool for development of reactive object-oriented programs with explicit states emphasis |