I used Python's PDB extensively. I develop a couple of JSONRPC/XMLRPC services with no GUI on web2py and logging helps, but sometimes you just need to step through the code. Anywhere I need the Python code to break execution, I just put in this line:
import pdb; pdb.set_trace() Then you are given a Python console where you can print out variables. Then enter 'n' to execute the next line, 's' to step in to the next line, and 'c' to continue execution. PDB has saved me quite a lot of time tracking down bugs.