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
	(this is currently not implemented).

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) [lineno]
	With a line number argument, set a break there in the current file.
	Without argument, list all breaks.

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

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.


How it works
============

Some changes were made to the interpreter:
- sys.settrace(func) sets the global trace function
- there can also a local trace function (see later)

Trace functions have three arguments: (frame, event, arg)
  - frame is the current stack frame
  - event is a string: 'call', 'line', 'return' or 'exception'
  - arg is dependent on the event type
A trace function should return a new trace function or None.
Class methods are accepted (and most useful!) as trace methods.

The events have the following meaning:

  '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.

  '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.

  '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.

  '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

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

Stack frame objects have the following read-only attributes:
  f_code:      the code object being executed
  f_lineno:    the current line number (-1 for 'call' events)
  f_back:      the stack frame of the caller, or None
  f_locals:    dictionary containing local name bindings
  f_globals:   dictionary containing global name bindings

Code objects have the following read-only attributes:
  co_code:     the code string
  co_names:    the list of names used by the code
  co_consts:   the list of (literal) constants used by the code
  co_filename: the filename from which the code was compiled
