The Python Debugger
===================

To use the debugger in its simplest form:

        >>> import pdb
        >>> pdb.run('<a statement>')

The debugger's prompt is '(Pdb) '.  This will stop in the first
function call in <a statement>.

Alternatively, if a statement terminated with an unhandled exception,
you can use pdb's post-mortem facility to inspect the contents of the
traceback:

        >>> <a statement>
        <exception traceback>
        >>> import pdb
        >>> pdb.pm()

The commands recognized by the debugger are listed in the next
section.  Most can be abbreviated as indicated; e.g., h(elp) means
that 'help' can be typed as 'h' or 'help' (but not as 'he' or 'hel',
nor as 'H' or 'Help' or 'HELP').  Optional arguments are enclosed in
square brackets.

A blank line repeats the previous command literally.  (Except for
'list', where it lists the next 11 lines.)

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 ('!').  This is a powerful way to inspect the program being
debugged; it is even possible to change variables.  When an exception
occurs in such a statement, the exception name is printed but the
debugger's state is not changed.

The debugger is not directly programmable; but it is implemented as a
class from which you can derive your own debugger class, so you can
make as fancy as you like.


Debugger commands
=================

h(elp)
        Without argument, print the list of available commands.
        With a command name as argument, print help about that command
        "help pdb" pipes the full documentation file to the $PAGER
        "help exec" gives help on the ! command

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.

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

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

b(reak) ([file:]lineno | function) [, "condition"]
        With a line number argument, set a break there in the current
        file.  With a function name, set a break at the entry of that
        function.  Without argument, list all breaks.  If a second
        argument is present, it is a string specifying an expression
        which must evaluate to true before the breakpoint is honored.

        The line number may be prefixed with a filename and a colon,
        to specify a breakpoint in another file (probably one that
        hasn't been loaded yet).  The file is searched on sys.path.

cl(ear) [lineno]
        With a line number argument, clear that break in the current file.
        Without argument, clear all breaks (but first ask confirmation).

        The line number may be prefixed with a filename and a colon,
        to specify a breakpoint in another file (probably one that
        hasn't been loaded yet).  The file is searched on sys.path.

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

n(ext)
        Continue execution until the next line in the current function
        is reached or it returns.

r(eturn)
        Continue execution until the current function returns.

c(ont(inue))
        Continue execution, only stop when a breakpoint is encountered.

l(ist) [first [,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 starting at that line.
        With two arguments, list the given range;
        if the second argument is less than the first, it is a count.

a(rgs)
        Print the argument list of the current function.

p expression
        Print the value of the expression.

(!) statement
        Execute the (one-line) 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 assign to a global variable you must always prefix the
        command with a 'global' command, e.g.:
        (Pdb) global list_options; list_options = ['-l']
        (Pdb)

q(uit)
        Quit from the debugger.
        The program being executed is aborted.
