next up previous
Next: Compilation Up: Overview Previous: Reuse of toplevel

Overview of the Debugger

SWI-Prolog has a standard 4-port tracer [Clocksin & Mellish, 1981] with an optional fifth port. This fifth port, called unify allows the user to inspect the result after unification of the head. The ports are called call, exit, redo, fail and unify. The tracer is started by the trace/0 command, when a spy point is reached and the system is in debugging mode (see spy/1 and debug/1) or when an error is detected at run time. Note that in the interactive toplevel goal trace/0 means ``trace the next query''. The tracer shows the port, displaying the port name, the current depth of the recursion and the goal. The goal is printed using the Prolog predicate print/1 (default), write/1 or display/1. An example using all five ports is shown in figure gif.

  
Figure: Example trace

On leashed ports (set with the predicate leash/1, default are call, exit, redo and fail) the user is prompted for an action. All actions are single character commands which are executed WITHOUT waiting for a return (Unix `cbreak' mode), unless the command line option -tty is active. Tracer options:

+ ()

all Set a spy point (see spy/1) on the current predicate.
- ( spy)

all Remove the spy point (see nospy/1) from the current predicate.
/ ()

all Search for a port. After the `/', the user can enter a line to specify the port to search for. This line consists of a set of letters indicating the port type, followed by an optional term, that should unify with the goal run by the port. If no term is specified it is taken as a variable, searching for any port of the specified type. If an atom is given, any goal whose functor has a name equal to that atom matches. Examples:

. ( find)

all Repeat the last find command (see `/')
A ()

all Show all goals that have alternatives.
C ()

all Toggle `Show Context'. If on the context module of the goal is displayed between square brackets (see section gif). Default is off.
L ()

all List the current predicate with listing/1.
a ()

all Abort Prolog execution (see abort/0).
b ()

all Enter a Prolog break environment (see break/0).
c ()

all Continue execution, stop at next port. (Also return, space).
d ()

all Write goals using the Prolog predicate display/1.
e ()

all Terminate Prolog (see halt/0).
f ()

call, redo, exit Force failure of the current goal
g ()

all Show the list of parent goals (the execution stack). Note that due to tail recursion optimization a number of parent goals might not exist any more.
h ()

all Show available options (also `?').
i ()

call, redo, fail Ignore the current goal, pretending it succeeded.
l ()

all Continue execution, stop at next spy point.
n ( debug)

all Continue execution in `no debug' mode.
p ()

all Write goals using the Prolog predicate print/1 (default).
r ()

redo, exit, fail Undo all actions (except for database and i/o actions) back to the call port of the current goal and resume execution at the call port.
s ()

call, redo Continue execution, stop at the next port of this goal (thus skipping all calls to children of this goal).
u ()

all Continue execution, stop at the next port of the parent goal (thus skipping this goal and all calls to children of this goal). This option is useful to stop tracing a failure driven loop.
w ()

all Write goals using the Prolog predicate write/1.

The ideal 4 port model as described in many Prolog books [Clocksin & Mellish, 1981] is not visible in many Prolog implementations because code optimisation removes part of the choice- and exit points. Backtrack points are not shown if either the goal succeeded deterministically or its alternatives were removed using the cut. When running in debug mode ( debug/0) choice points are only destroyed when removed by the cut. In debug mode tail recursion optimisation is switched off. gif



next up previous
Next: Compilation Up: Overview Previous: Reuse of toplevel



Passani Luca
Tue Nov 14 08:58:33 MET 1995