Welcher Python-Programmierer hat sich nicht schon einmal über die kleinen Macken des builtin-debuggers (im folgenden der “Normale”) geärgert oder schmerzlich Syntax-highlightning und TAB-Vervollständigung vermisst? Nun, ich bin so einer und möchte euch deshalb heute pdb++ vorstellen. Einmal installiert ersetzt dieser Debugger den normalen aus der stdlib und wartet mit einigen sehr nützlichen Features auf.
Nehmen wir zum Beispiel eine dieser “Macken” des normalen Debuggers: Hat man sich mal “ausversehen” nicht an die PEP8 gehalten und möchte den Inhalt einer seiner Variablen sehen, indem einfach s, c oder q eingegeben wird, führt man wider Erwarten die jeweiligen Kommandos des debuggers aus. Dieses Verhalten hat pdb++ verändert: Hier haben Variablen des Programms Priorität vor den Debug-Kommandos und somit würde nicht das Programm beendet werden wenn man q eingibt. Selbstverständlich kann man dennoch das eigentliche Kommando ausführen: !!q (Dieses Verhalten ist nur aktiv wenn es auch notwendig ist, d.h. wenn auch wirklich ein Konflikt vorliegt!)
Die zusätzlichen Features sind aber gerade das besondere an pdb++: (Weshalb ich nur noch in Notfällen den normalen verwenden werde!)
Der Sticky-Mode:

Step-by-Step execution mit dem normalen Debugger ist m.E. eine absolute Geduldsprobe. Entweder man versucht anhand der einzelnen Zeile, die einem angezeigt wird, nachzuvollziehen was gerade passiert ist bzw. passieren wird oder man lässt sich die aktuelle Position im Code mit ein bisschen mehr Quelltext drumherum anzeigen indem man l eingibt. Falls man sich nicht mehr so genau sicher ist was denn 10 Zeilen zuvor passiert ist lässt man sich einen kleinen Ausschnitt aus einem vorherigen/kommemden Bereich anzeigen, mehrmals, da schließlich auch nicht alles angezeigt wird…

Bei pdb++ gibt man einfach sticky ein. Jetzt wird fortwährend der Quelltext der aktuellen Funktion/Methode mitsamt Ausführungsposition angezeigt. Hat man sich ausversehen mal wieder nicht an PEP8 gehalten kann man auch eine Start- und Endposition angeben: sticky 20 200 (Wenn der Quelltext nicht fortwährend angezeigt werden soll, kann man einfach ll eingeben, womit er einmalig angezeigt wird.) Ausgeschaltet wird dieser Modus indem man einfach erneut sticky eingibt.

Das “source”-Kommando:

Stellt euch vor ihr seid gerade beim debuggen und seht eine Funktion, Klasse oder Methode die euch unbekannt ist. Ihr wollt aber auch nicht einfach blind mit s rein, sofern das überhaupt möglich ist. Die einzige Möglichkeit ist nun, nachzusehen aus welcher Datei dieses Element kommt und jene in einem Editor eurer Wahl zu öffnen.

In pdb++ gibt man einfach source FoobarXYZ ein. Nun wird der Quelltext genau jenes Elements angezeigt. Grandios simpel, oder? (Für tiefere Analysen selbstverständlich ungeeignet, aber dafür ist es auch wieder nicht gedacht.)

Das “display”-Kommando:

Der Fehler ist also einer der fiesen Sorte? Euch ist noch nicht ganz klar wieso/weshalb/warum etwas ist so ist wie es ist bzw. aus irgendwelchen Gründen sein wird? Also schaut ihr immer mal wieder nach was welche Variablen/Eigenschaften für Werte haben und ärgert euch darüber dass eine Variable/Eigenschaft in einer Funktion davor interessant gewesen wäre aber nun nicht mehr im aktuellen Namensraum ist. Tja, blöd gelaufen.

Mit pdb++ gibt man einfach display FoobarXYZ ein. Sobald sich dann etwas an diesem Objekt ändert wird diese Änderung angezeigt, egal wo man sich befindet. Ausgeschaltet wird es wieder mit undisplay FoobarXYZ.

Das “edit”-Kommando:

Ihr habt also den Fehler gefunden, schön. Also auf in den Editor, die Datei öffnen und zur entsprechenden Zeile scrollen/springen und die nötige Änderung vornehmen. Danach speichern und den Debugger stoppen (sofern noch nicht getan) und das Programm erneut starten, sofern gewünscht. Komfortfunktionen? Fehlanzeige.

Nun, in pdb++ gibt man einfach edit FoobarXYZ ein. Dann poppt der Editor (welcher? config option ftw!) auf, es wird automatisch zur passenden Zeile gesprungen und nach dem schließen des Editors ist man wieder dort wo man vorher war im Debugger. Programm stoppen, neustarten, sich freuen. (oder auch nicht)

Darüber hinaus gibt es noch weitere Features, die ich allerdings bis jetzt noch nicht genutzt habe. Mehr Informationen darüber gibts hier: pdb++@pypi
Dort wird auch beschrieben wie man bereits erwähntes Config-file benutzt.
Nun, allen ein fröhliches debugging! 🙂

Johannes Meyer
Johannes Meyer
Developer

Johannes ist seit 2011 bei uns und hilft bei der Entwicklung zukünftiger Knüller (Icinga2, Icinga Web 2, ...) aus dem Hause NETWAYS.