ここでは、デバッガをより良くモニターするためのスパイポイントの使い方について説明します。
今までに説明した通り、デバッガはどのポートのサブセットでの実行でも止めることができ、サブゴールに対して、going intoあるいはleaping overを選択することができます。スパイポイントを使用すると、より正確に制御を行なうことができます。つまり、デバッギングの実行中にデバッガがストップすべき場所を正確に示すことができます。
スパイポイントは、ヘッドという述語、ポ−ト、それ以外の条件によって指定することができます。簡単なスパイポイントは次のような形式でアサートされます。
asserta( spy( name( arg1, arg2, ... ), port ) ).
スパイポイントは、プログラム中のバグのある場所が大体わかっている場合に設定することができます。たとえば成功すべき所で述語word_listが失敗している場合には、スパイポイントを以下のように設定して下さい。
asserta( spy( word_list(A,L), fail ) ).
スパイポイントに関する任意の条件については、spy/2節のサブゴールとして表現することができます。(レファレンスマニュアルを参照して下さい。)
スパイポイントは、プログラムの中にスパイポイントがあるあるいはありそうな位置を知っている時に設定されます。例えば、もしword_listの述語が失敗するのではないかと思うのであれば、スパイポイントを次のように設定して下さい。
asserta( spy( word_list(A,L) , fail ) ).
デバッガを起動させ、デバッガのプロンプト"debug ?-"が表示されたらプログラムをスタ−トして下さい。デバッガの画面が表示されたら、"debug command ?"の行で以下のコマンドを使って下さい。
s <改行> スパイポイントのチェックを始める N <改行> NOSTOPモ−ドで実行を 始める S <改行> SWEEPINGモードで実行を始める <,改行> スパイポイントでの実行を続ける
これでプログラムは、述語word_listが失敗するまでは"だまって"実行をします。デバッガは述語が失敗した所でプログラムを停止させ、その状況を表示します。コマンド "C"を使ってCREEPINGモ−ドに変更して下さい。 デバッガを再び起動してペアレントボックスなどをチェックして実行過程を調べて下さい。
スパイポイントがエラーポイントで止まらなかった場合、次のスパイポイントに進みます。CREEPINGモードを変更しないで下さい。改行をして、実行を続けて下さい。次にストップするところで、word_listは失敗します。
スパイポイントは、デバッガセッションの間でも簡単に設定することができます。 コマンド "B"を使って新しいインタプリタ・ル−プを起動して下さい。 述語assert、あるいは[user]を使ってスパイポイントのテスト、変更、追加を行って下さい。新しいル−プを脱け出してデバッガに戻るには、EOF文字(ファイル終了文字)を入力するか、あるいは"end_of_file"を使って下さい。
NOSTOPモードはスパイポイントでのみ止まります。SWEEPINGモードは、現在レベルあるいはそれ以上のレベルでのゴールの最後のポートで止まります。SWEEPモードの利点は、実行がSWEEPが始まったスコープを越えないことにあります。
デバッギングの間に、より多くの情報を保存しているため、実行速度は遅くなり、NOSTOPモードでさえもスタックがが使用されることに注意して下さい。
スパイポイントの代わりに、debug_goal/1の呼び出しをソースプログラム中にインクルードすることができます。この場合、デバッガがある特定のゴールに向かってスタートするまで、プログラムはフルスピードで作動します。
| 冒頭へ |
|