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 | function]
	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.

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
