PDB

PDB ist ein interaktiver Debugger, mit dem schrittweise durch den Code gegangen werden kann um Probleme aufzufinden.

Um einen einfachen Breakpoint zusetzen, kann folgendes angegeben werden:

import pdb; pdb.set_trace()

Anschließend sollte Zope neu im Vordergrund gestartet werden mit:

$ ./bin/instance fg

Anschließend sollte der Code ausgeführt werden, für den der Breakpoint gesetzt wurde. Das Terminal, in dem die Instanz gestartet wurde, sollte dann eine Debug-Session öffnen mit folgender Angabe:

-> Pdb().set_trace()
(Pdb)

Sie können nun mit r (Return) den set_trace()-Aufruf verlassen und so schrittweise den Code untersuchen.

Wenn ein Fehler in einer Methode auftritt, die häufig ausgeführt wird, ist es jedoch nur lästig, sehr häufig Return angeben zu müssen. Daher empfiehlt sich, das sog. post-mortem-Idiom zu verwenden:

try:
    [YOUR CODE HERE]
except:
    import pdb, sys
    e, m, tb = sys.exc_info()
    pdb.post_mortem(tb)

Anschließend sollte die Zope-Instanz wieder im Vordergrund gestartet werden. Nun wird pdb nur noch aufgerufen, wenn ein Fehler im Abschnitt [YOUR CODE HERE] auftritt.

Um zu gewährleisten, dass derselbe pdb-Breakpoint in einer Deubug-Session nicht mehrfach eine Exception ausgibt, kann die Variable PDB_ACTIVE auf 1 gesetzt werden:

if not globals().get( 'PDB_ACTIVE', 0 ):
    globals()['PDB_ACTIVE'] = 1
    import pdb; pdb.set_trace()

Anmerkung: Entfernen Sie bitte wieder die debugging hooks bevor der Code in das Repository eingecheckt wird.

~/.pdbrc

Eine ~/.pdbrc-Konfigurationsdatei kann verwendet werden um sich einige Shortcuts zum Debuggen zu erstellen, z.B.:

# Print a sorted dictionary.
# %1 is the dict
# %2 is the prefix for the names.
alias p_ for k in sorted(%1.keys()): print "%s%-15s= %-80.80s" % ("%2",k,repr(%1[k]))

# Print the member variables of something
alias pi p_ %1.__dict__ %1.

# Print the member variables of self
alias ps pi self

# Print locals
alias pl p_ locals() local:

# Next list and step list
alias nl n;;l
alias sl s;;l

Um weitere Hilfsfunktionen in pdb nutzen zu können, lassen sich auch externe Python-Dateien in die ~/.pdbrc-Datei einbinden – siehe hierzu PdbRcIdea.

Zum Weiterlesen

Python Documentation: Debugger Commands
Verwendung von pdb
Ken Manheimer: Conversing With Zope
Ausführliche Anleitung für die Verwendung von pdb mit Zope
Stephen Ferg: Debugging in Python
Eine kurze praktische Einführung in pdb
Jeremy Jones: Interactive Debugging in Python
Eine ausführliche Anleitung mit fortgeschrittenen Beispielen