SWI-Prolog has a traditional commandline debugger. It also provides programmatic access to the debugger. This facility is used to provide a graphical debugger as well as remote debugging in the web interface provided by SWISH.
SWI-Prolog has a 6-port tracer, extending the standard 4-port tracer
Byrd, 1980, Clocksin &
Melish, 1987 with two additional ports. The standard ports
The additional unify port allows the user to inspect the
result after unification of the head. The additional exception
port shows exceptions raised by throw/1
or one of the built-in predicates. See
The tracer is started by the trace/0
command. If the system is in debug mode (see debug/0)
the trace is started, after reaching a spy point set using spy/1
or break point set using
The debugger is also started if an
error(Formal, Extended) exception is raised that is not
The interactive top-level 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 write_term/2.
The style is defined by the Prolog flag
and can be modified using this flag or using the
d commands of the tracer.
min_numlist([H|T], Min) :- min_numlist(T, H, Min). min_numlist(, Min, Min). min_numlist([H|T], Min0, Min) :- Min1 is min(H, Min0), min_numlist(T, Min1, Min).
1 ?- visible(+all), leash(-exit). true. 2 ?- trace, min_numlist([3, 2], X). Call: (7) min_numlist([3, 2], _G0) ? creep Unify: (7) min_numlist([3, 2], _G0) Call: (8) min_numlist(, 3, _G0) ? creep Unify: (8) min_numlist(, 3, _G0) ^ Call: (9) _G54 is min(2, 3) ? creep ^ Exit: (9) 2 is min(2, 3) Call: (9) min_numlist(, 2, _G0) ? creep Unify: (9) min_numlist(, 2, 2) Exit: (9) min_numlist(, 2, 2) Exit: (8) min_numlist(, 3, 2) Exit: (7) min_numlist([3, 2], 2) X = 2.
On leashed ports (set with the predicate leash/1,
the user is prompted for an action. All actions are single-character
commands which are executed without waiting for a return, unless
the command line option --no-tty is active. Tracer
|Search for any fail port|
|Search for a fail or exit port of
any goal with name |
|Search for a call to solve/2
whose first argument is a variable or the atom |
|Search for any port on member/2. This is equivalent to setting a spy point on member/2.|
on, the context module of the goal is displayed between square brackets (see section 6). Default is
max_depth(Depth)option of debugger_write_options, limiting the depth to which terms are printed. See also the
[quoted(true), portray(true), max_depth(10), priority(699)]. This is the default.
[quoted(true), attributes(write), priority(699)], bypassing portray/1, etc.
The ideal 4-port model Byrd, 1980 as described in many Prolog books Clocksin & Melish, 1987 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, last call optimisation is switched off.12This implies the system can run out of stack in debug mode, while no problems arise when running in non-debug mode.
Reference information to all predicates available for manipulating the debugger is in section 4.38.