Suggestions for Python debugging tools?
Don't forget about post-mortem debugging! After an exception is thrown, the stack frame with all of the locals is contained within sys.last_traceback
. You can do pdb.pm()
to go to the stack frame where the exception was thrown then p(retty)p(rint) the locals()
.
Here is a function that uses this information to extract the local variables from the stack.
def findlocals(search, startframe=None, trace=False):
from pprint import pprint
import inspect, pdb
startframe = startframe or sys.last_traceback
frames = inspect.getinnerframes(startframe)
frame = [tb for (tb, _, lineno, fname, _, _) in frames
if search in (lineno, fname)][0]
if trace:
pprint(frame.f_locals)
pdb.set_trace(frame)
return frame.f_locals
Usage:
>>> def screwyFunc():
a = 0
return 2/a
>>> screwyFunc()
Traceback (most recent call last):
File "<pyshell#62>", line 1, in <module>
screwyFunc()
File "<pyshell#55>", line 3, in screwyFunc
return 2/a
ZeroDivisionError: integer division or modulo by zero
>>> findlocals('screwyFunc')
{'a': 0}
Winpdb is a platform independent graphical GPL Python debugger with support for remote debugging over a network, multiple threads, namespace modification, embedded debugging, encrypted communication and is up to 20 times faster than pdb.
Features:
- GPL license. Winpdb is Free Software.
- Compatible with CPython 2.3 through 2.6 and Python 3000
- Compatible with wxPython 2.6 through 2.8
- Platform independent, and tested on Ubuntu Gutsy and Windows XP.
- User Interfaces: rpdb2 is console based, while winpdb requires wxPython 2.6 or later.
(source: winpdb.org)
pudb is a visual debugger for python.