If you need a more detail view of runtime behavior, you might want to BREAK some functions you care about.
(trace (foo :break-all t)) This will invoke the debugger each time foo is called, and upon each exit from foo. |
Once you arrive in the debugger, the following commands are most useful:
:down <n> Move to a deeper frame <n> is optional
:up <n> Move to a higher frame <n> is optional
:zoom <n> Display n frames <n> is optional
:pri Enter a dialog that lets you set printer
control variables. For example, setting depth
to 5 and length to 10 will let you see the
top level structure of expressions, while
suppressing deep expressions and the tails of
long expressions. Note that you'll need to
specify values for many contexts, but just
hitting return leaves a value unchanged. You
will likely want to modify the trace, debugger,
and current values.
(pprint *) Pretty print the expression for the current
frame. Note that this only works immediately
after arriving at a frame, e.g. via :down 0
if necessary.
:cont Continue as if nothing happened.
:restart Resume execution at this frame.
:reset Return to Lisp top level. (E.g., bail out
to try again.)
:exit Exit from Lisp to operating system -- ends
session.
:help Online documentation.
(misc ...) The debugger is is a read/eval/print loop, so
arbitrary Lisp forms will be evaluated (in the
current dynamic context).
(untrace foo) Stop entering debugger when foo is called.
Note that you may still enter the debugger
for each exit from calls to foo already
recursively in progress. |