Next: REDUCE/SUSPEND ポートのトレースのきっかけ
Up: トレースの制御と情報入手
Previous: 擬似ゴールの構造
先にも延べたように、トレースのきっかけは擬似ゴールで関数として
指定されているmodule関数
trace_trigger_routineが実行されることにより行なわれる。
この関数の起動は、通常のKL1がコンパイルされて生成された
module関数と同じ方法にて行なわれる。
よって、
この方式では、 トレース対象かどうかの条件判断が不要で、 通常の実行の効率
に影響を与えることなく、 必要な時にだけトレースできる。
トレース用の実行時ライブラリでは、トレース用のフラグ(-t)が指定された時には、
実行の開始
(runtime/kmain.c)にあたって初期ゴール
(main:main) を作る際に、 トレースを行うように加工している。 すべての
トレースはこれをきっかけに始まる。
このようにトレース化されたゴールがスケジュールされると、
trace_trigger_routine() が本来のモジュール関数と同様に
実行される。その結果:
- infoにそのゴールに指定されたトレース情報を持つ
(このトレース情報はtrace_trigger_routine() 終了時に
大域変数parent_info に退避され、trace_after()にて用いられる)。
- untrace_goal() により非トレース化する。
- 指定されているモジュール関数を調べ、ノード番号、優先度番号を
waitするような関数が指定されている場合には、本来の述語を
システムヒープ部に割りつけ、以下の処理を行う。
- 述語構造体より、get_pte()によりpteを得る。
- pteを参照し、述語スパイフラグをコピーする。trace_flagを立てる。
- qp_beforeに、リダクション前のゴールスタックの先頭
(qp->next)を記録しておく(図8.3での「記憶」に相当)。
- Leap中、Spy中であるか、などによりゴールを印字する
(print_goal())。
さらに、Leash中であればコマンドをユーザから読む(call_port_command())。
- トレース中(trace_flagがON)であれば(コマンドを実行した結果
トレース中ではなくなる可能性がある)、heaplimitを0にし、
真のモジュール関数を実行する。
その結果、次のリダクションが終了したときに、割り込みが検出され
(klic_interrupt() runtime/intrpt.c)、
trace_flagがONであることより、trace_after()が呼びだされる。
Sekita Daigo
1998-05-18