Veit Schiele Communications

Veit Schiele Communications

Debugging

erstellt von Veit Schielezuletzt verändert: 01.12.2007 21:00 Uhr © Veit Schiele 2006–2007
Artikelaktionen

Python Debugger (pdb)

Der Python-Debugger (pdb) wird mit jeder Python-Distribution mitgeliefert.

Um einen breakpoint einzufügen, muss die folgende Zeile in den zu untersuchenden Code eingegeben werden:

import pdb; pdb.set_trace()

Zudem muss Zope im Vordergrund laufen (Neustart mit zopectl fg). Wenn nun der entsprechende Code ausgeführt wird, wechselt das Terminal in eine Debug-Session mit folgender Eingabeaufforderung:

-> Pdb().set_trace()
(Pdb)
h (elp)
zeigt die verfügbaren Kommandos an.
ppexpression
gibt das Ergebnis eines Ausdrucks aus.
w (here)
zeigt an, woher der Aufruf kam.
n (ext)
geht zur nächsten Zeile.
s (tep)
führt zum nächsten Funktionsaufruf.
l (ist)
zeigt eine Liste des umgebenden Quelltextes an.
r (eturn)
führt zum set_trace()-Aufruf zurück und der weitere Code kann schrittweise untersucht werden.
c (lear)
beendet die Debugging-Session und fährt mit der Ausführung des Codes fort.

Eine vollständige Aufzählung aller Befehle erhalten Sie in der Python Dokumentation.

Um nicht jedesmal beim Ausführen des Codes wieder in einer Debug-Session zu landen, empfiehlt sich das pdb post-mortem idiom:

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

Nun wird die Debug-Session nur gestartet, wenn ein Fehler in [IHR CODE] auftritt.

Vergessen Sie nicht, die Debugging-Anweisungen zu entfernen bevor der Code ausgeliefert wird.

Gelegentlich beendet ctrl-c Zope nicht, wenn pdb verwendet wird. In diesem Fall können Sie in einer anderen Shell kill -9 \`cat $INSTANCE_HOME/var/Z2.pid\` verwenden.

zopectl debug

Seit Zope 2.7 gibt es das debug-Argument für zopectl. Damit kann eine interkative Python-Session gestartet werden sofern Ihre Zope-Instanz nicht läuft oder Sie ZEO verwenden.

Die Shell stellt das Applikationsobjekt app zur Verfügung, das den Zugriff auf alle Objekte und die Zope-APIs erlaubt.

  • Dammit andere Ihre Änderungen sehen können, geben Sie Folgendes ein:

    get_transaction().commit()
    
  • Um Ihre Änderungen mit den Änderungen anderer zu synchronisieren, verwenden Sie:

    app._p_jar.sync()
    

Script Debugging

ScriptDebugging erlaubt pdb an breakpoints anzuhalten und schrittweise durch das Skript zu gehen.

Deadlock Debugger

DeadlockDebugger erlaubt, einen stehengebliebenen Zope-Prozess zu debuggen indem ein traceback aller laufenden Python-Prozesse in das event log (im DEBUG-Level) ausgegeben wird.

Der Deadlock Debugger kann auch verwendet werden, wenn Zope-Prozesse lange Zeit benötigen und Sie wissen wollen, welcher Code gerade ausgeführt wird.

PDB Debug Mode

PDBDebugMode erlaubt post-mortem-Debugging für exceptions im Debug-Mode. Bei einem Fehler wird der Debugger aufgerufen, der den Traceback ausgibt.

strace

strace zeigt Systemaufrufe und Signale von Prozessen an und ist damit ein nützliches Diagnose- und Debugging-Werkzeug.

Um z.B. heruaszufinden, warum ein import_ldap-Aufruf von Python mit einem Fehler abbricht, können Sie sinnvoll folgendes eingeben:

strace -f -o out python -c "import_ldap"

Anschließend kann die out.txt-Datei durchsucht werden.

Siehe auch:

Zope Debugging
Autor: Ken Manheimer
Debugging with pdb (the python debugger)
A brief overview of how to use the python interactive debugger within the Zope/Plone environment.
Debugging in Python
Autor: Stephen Ferg
Artikelaktionen