\chapter{The Python Debugger}
\label{module-pdb}
\stmodindex{pdb}
\index{debugging}

\setindexsubitem{(in module pdb)}

The module \code{pdb} defines an interactive source code debugger for
Python programs.  It supports setting
(conditional) breakpoints and single stepping
at the source line level, inspection of stack frames, source code
listing, and evaluation of arbitrary Python code in the context of any
stack frame.  It also supports post-mortem debugging and can be called
under program control.

The debugger is extensible --- it is actually defined as a class
\code{Pdb}.  This is currently undocumented but easily understood by
reading the source.  The extension interface uses the (also
undocumented) modules \code{bdb} and \code{cmd}.
\ttindex{Pdb}
\ttindex{bdb}
\ttindex{cmd}

A primitive windowing version of the debugger also exists --- this is
module \code{wdb}, which requires STDWIN (see the chapter on STDWIN
specific modules).
\index{stdwin}
\ttindex{wdb}

The debugger's prompt is ``\code{(Pdb) }''.
Typical usage to run a program under control of the debugger is:

\begin{verbatim}
>>> import pdb
>>> import mymodule
>>> pdb.run('mymodule.test()')
> <string>(0)?()
(Pdb) continue
> <string>(1)?()
(Pdb) continue
NameError: 'spam'
> <string>(1)?()
(Pdb) 
\end{verbatim}
%
\code{pdb.py} can also be invoked as
a script to debug other scripts.  For example:
\code{python /usr/local/lib/python1.4/pdb.py myscript.py}

Typical usage to inspect a crashed program is:

\begin{verbatim}
>>> import pdb
>>> import mymodule
>>> mymodule.test()
Traceback (innermost last):
  File "<stdin>", line 1, in ?
  File "./mymodule.py", line 4, in test
    test2()
  File "./mymodule.py", line 3, in test2
    print spam
NameError: spam
>>> pdb.pm()
> ./mymodule.py(3)test2()
-> print spam
(Pdb) 
\end{verbatim}
%
The module defines the following functions; each enters the debugger
in a slightly different way:

\begin{funcdesc}{run}{statement\optional{\, globals\optional{\, locals}}}
Execute the \var{statement} (given as a string) under debugger
control.  The debugger prompt appears before any code is executed; you
can set breakpoints and type \code{continue}, or you can step through
the statement using \code{step} or \code{next} (all these commands are
explained below).  The optional \var{globals} and \var{locals}
arguments specify the environment in which the code is executed; by
default the dictionary of the module \code{__main__} is used.  (See
the explanation of the \code{exec} statement or the \code{eval()}
built-in function.)
\end{funcdesc}

\begin{funcdesc}{runeval}{expression\optional{\, globals\optional{\, locals}}}
Evaluate the \var{expression} (given as a a string) under debugger
control.  When \code{runeval()} returns, it returns the value of the
expression.  Otherwise this function is similar to
\code{run()}.
\end{funcdesc}

\begin{funcdesc}{runcall}{function\optional{\, argument\, ...}}
Call the \var{function} (a function or method object, not a string)
with the given arguments.  When \code{runcall()} returns, it returns
whatever the function call returned.  The debugger prompt appears as
soon as the function is entered.
\end{funcdesc}

\begin{funcdesc}{set_trace}{}
Enter the debugger at the calling stack frame.  This is useful to
hard-code a breakpoint at a given point in a program, even if the code
is not otherwise being debugged (e.g. when an assertion fails).
\end{funcdesc}

\begin{funcdesc}{post_mortem}{traceback}
Enter post-mortem debugging of the given \var{traceback} object.
\end{funcdesc}

\begin{funcdesc}{pm}{}
Enter post-mortem debugging of the traceback found in
\code{sys.last_traceback}.
\end{funcdesc}

\section{Debugger Commands}

The debugger recognizes the following commands.  Most commands can be
abbreviated to one or two letters; e.g. ``\code{h(elp)}'' means that
either ``\code{h}'' or ``\code{help}'' can be used to enter the help
command (but not ``\code{he}'' or ``\code{hel}'', nor ``\code{H}'' or
``\code{Help} or ``\code{HELP}'').  Arguments to commands must be
separated by whitespace (spaces or tabs).  Optional arguments are
enclosed in square brackets (``\code{[]}'') in the command syntax; the
square brackets must not be typed.  Alternatives in the command syntax
are separated by a vertical bar (``\code{|}'').

Entering a blank line repeats the last command entered.  Exception: if
the last command was a ``\code{list}'' command, the next 11 lines are
listed.

Commands that the debugger doesn't recognize are assumed to be Python
statements and are executed in the context of the program being
debugged.  Python statements can also be prefixed with an exclamation
point (``\code{!}'').  This is a powerful way to inspect the program
being debugged; it is even possible to change a variable or call a
function.  When an
exception occurs in such a statement, the exception name is printed
but the debugger's state is not changed.

\begin{description}

\item[h(elp) \optional{\var{command}}]

Without argument, print the list of available commands.  With a
\var{command} as argument, print help about that command.  \samp{help
pdb} displays the full documentation file; if the environment variable
\code{PAGER} is defined, the file is piped through that command
instead.  Since the \var{command} argument must be an identifier,
\samp{help exec} must be entered to get help on the \samp{!} command.

\item[w(here)]

Print a stack trace, with the most recent frame at the bottom.  An
arrow indicates the current frame, which determines the context of
most commands.

\item[d(own)]

Move the current frame one level down in the stack trace
(to an older frame).

\item[u(p)]

Move the current frame one level up in the stack trace
(to a newer frame).

\item[b(reak) \optional{\var{lineno}\code{\Large|}\var{function}%
              \optional{, \code{'}\var{condition}\code{'}}}]

With a \var{lineno} argument, set a break there in the current
file.  With a \var{function} argument, set a break at the entry of
that function.  Without argument, list all breaks.
If a second argument is present, it is a string (included in string
quotes!) specifying an expression which must evaluate to true before
the breakpoint is honored.

\item[cl(ear) \optional{\var{lineno}}]

With a \var{lineno} argument, clear that break in the current file.
Without argument, clear all breaks (but first ask confirmation).

\item[s(tep)]

Execute the current line, stop at the first possible occasion
(either in a function that is called or on the next line in the
current function).

\item[n(ext)]

Continue execution until the next line in the current function
is reached or it returns.  (The difference between \code{next} and
\code{step} is that \code{step} stops inside a called function, while
\code{next} executes called functions at (nearly) full speed, only
stopping at the next line in the current function.)

\item[r(eturn)]

Continue execution until the current function returns.

\item[c(ont(inue))]

Continue execution, only stop when a breakpoint is encountered.

\item[l(ist) \optional{\var{first\optional{, last}}}]

List source code for the current file.  Without arguments, list 11
lines around the current line or continue the previous listing.  With
one argument, list 11 lines around at that line.  With two arguments,
list the given range; if the second argument is less than the first,
it is interpreted as a count.

\item[a(rgs)]

Print the argument list of the current function.

\item[p \var{expression}]

Evaluate the \var{expression} in the current context and print its
value.  (Note: \code{print} can also be used, but is not a debugger
command --- this executes the Python \code{print} statement.)

\item[\optional{!}\var{statement}]

Execute the (one-line) \var{statement} in the context of
the current stack frame.
The exclamation point can be omitted unless the first word
of the statement resembles a debugger command.
To set a global variable, you can prefix the assignment
command with a ``\code{global}'' command on the same line, e.g.:
\begin{verbatim}
(Pdb) global list_options; list_options = ['-l']
(Pdb)
\end{verbatim}
%
\item[q(uit)]

Quit from the debugger.
The program being executed is aborted.

\end{description}

\section{How It Works}

Some changes were made to the interpreter:

\begin{itemize}
\item \code{sys.settrace(\var{func})} sets the global trace function
\item there can also a local trace function (see later)
\end{itemize}

Trace functions have three arguments: (\var{frame}, \var{event}, \var{arg})

\begin{description}

\item[\var{frame}] is the current stack frame

\item[\var{event}] is a string: \code{'call'}, \code{'line'}, \code{'return'}
or \code{'exception'}

\item[\var{arg}] is dependent on the event type

\end{description}

The global trace function is invoked (with \var{event} set to
\code{'call'}) whenever a new local scope is entered; it should return
a reference to the local trace function to be used that scope, or
\code{None} if the scope shouldn't be traced.

The local trace function should return a reference to itself (or to
another function for further tracing in that scope), or \code{None} to
turn off tracing in that scope.

Instance methods are accepted (and very useful!) as trace functions.

The events have the following meaning:

\begin{description}

\item[\code{'call'}]
A function is called (or some other code block entered).  The global
trace function is called; arg is the argument list to the function;
the return value specifies the local trace function.

\item[\code{'line'}]
The interpreter is about to execute a new line of code (sometimes
multiple line events on one line exist).  The local trace function is
called; arg in None; the return value specifies the new local trace
function.

\item[\code{'return'}]
A function (or other code block) is about to return.  The local trace
function is called; arg is the value that will be returned.  The trace
function's return value is ignored.

\item[\code{'exception'}]
An exception has occurred.  The local trace function is called; arg is
a triple (exception, value, traceback); the return value specifies the
new local trace function

\end{description}

Note that as an exception is propagated down the chain of callers, an
\code{'exception'} event is generated at each level.

Stack frame objects have the following read-only attributes:

\begin{description}
\item[f_code]      the code object being executed
\item[f_lineno]    the current line number (\code{-1} for \code{'call'} events)
\item[f_back]      the stack frame of the caller, or None
\item[f_locals]    dictionary containing local name bindings
\item[f_globals]   dictionary containing global name bindings
\end{description}

Code objects have the following read-only attributes:

\begin{description}
\item[co_code]     the code string
\item[co_names]    the list of names used by the code
\item[co_consts]   the list of (literal) constants used by the code
\item[co_filename] the filename from which the code was compiled
\end{description}
