next up previous contents index
Next: CALL ポートのトレースのきっかけ Up: トレースの制御と情報入手 Previous: トレースの制御と情報入手

  
擬似ゴールの構造

 

KLIC の実装では、 実行する各ゴールは対応するプログラム・コードへのポイ ンタを保持している。

トレース対象のゴールについては、 本来実行すべきコードのかわりに、 トレー サのコードへのポインタを格納しておくことによって、 実行しようとした時に 自然にトレーサのコードが呼び出されてしまうようにする。 これによって上 述の CALL ポートに対応するトレースが可能になる。 本来実行すべきコード へのポインタはゴールの追加引数として保持する。 CALL ポートで実行を継続 する場合は、 このポインタを用いて本来のコードを呼び出せば良い (図8.2参照)。

具体的には、トレース対象ゴールに対して、トレースがなされるように処理される。 具体的にはこの処理はtrace_goal()で以下のように行われる。

1.
本来のゴールよりも3ワードサイズの大きなゴールを用意する。

2.
対応する引数の、trace_trigger_preds を述語として指定する。 この述語内では、関数trace_trigger_routineがあたかも module関数であるかのうように実行される。

3.
引数を本来のゴールからコピーする。

4.
追加されたゴールスロットに対して、以下のデータを格納する。


  
Figure 8.2: トレース用擬似的ゴールの構造
\begin{figure}\begin{center}
\epsfile{file=pseudo-goal.eps,width=.6\textwidth}
\end{center}\end{figure}

なお、untrace_goal()なる関数は上記の逆をおこなう。 ただし、ゴールレコードの再確保は行わず、単に述語構造体の付替のみを行い、 トレースゴールIDを戻り値として返す。



Sekita Daigo
1998-05-18