pdb — Der Python-Debugger

Quellcode: Lib/pdb.py


Das Modul pdb definiert einen interaktiven Quellcode-Debugger für Python-Programme. Er unterstützt das Setzen (bedingter) Breakpoints und Single-Stepping auf Quellcodezeilenebene, die Inspektion von Stack-Frames, die Auflistung des Quellcodes und die Auswertung beliebigen Python-Codes im Kontext jedes Stack-Frames. Er unterstützt auch Post-Mortem-Debugging und kann programmgesteuert aufgerufen werden.

Der Debugger ist erweiterbar – er ist tatsächlich als Klasse Pdb definiert. Dies ist derzeit undokumentiert, aber durch Lesen des Quellcodes leicht verständlich. Die Erweiterungsschnittstelle verwendet die Module bdb und cmd.

Siehe auch

Modul faulthandler

Wird verwendet, um Python-Tracebacks explizit auf einen Fehler, nach einem Timeout oder bei einem Benutzersignal auszugeben.

Modul traceback

Standard-Schnittstelle zum Extrahieren, Formatieren und Ausgeben von Stack-Traces von Python-Programmen.

Die typische Verwendung, um in den Debugger einzubrechen, besteht darin, Folgendes einzufügen:

import pdb; pdb.set_trace()

Oder

breakpoint()

an der Stelle, an der Sie in den Debugger einbrechen möchten, und dann das Programm auszuführen. Sie können dann den Code nach dieser Anweisung durchlaufen und die Ausführung ohne den Debugger mit dem Befehl continue fortsetzen.

Geändert in Version 3.7: Die eingebaute Funktion breakpoint() kann, wenn sie mit Standardwerten aufgerufen wird, anstelle von import pdb; pdb.set_trace() verwendet werden.

def double(x):
   breakpoint()
   return x * 2
val = 3
print(f"{val} * 2 is {double(val)}")

Der Prompt des Debuggers ist (Pdb), was die Anzeige ist, dass Sie sich im Debug-Modus befinden

> ...(2)double()
-> breakpoint()
(Pdb) p x
3
(Pdb) continue
3 * 2 is 6

Geändert in Version 3.3: Tab-Vervollständigung über das Modul readline ist für Befehle und Befehlsargumente verfügbar, z. B. werden die aktuellen globalen und lokalen Namen als Argumente für den Befehl p angeboten.

Sie können pdb auch von der Kommandozeile aus aufrufen, um andere Skripte zu debuggen. Zum Beispiel

python -m pdb [-c command] (-m module | -p pid | pyfile) [args ...]

Wenn pdb als Modul aufgerufen wird, tritt es automatisch in den Post-Mortem-Debugging-Modus ein, wenn das zu debuggende Programm abnormal beendet wird. Nach dem Post-Mortem-Debugging (oder nach normaler Beendigung des Programms) startet pdb das Programm neu. Automatisches Neustarten bewahrt den Zustand von pdb (wie Breakpoints) und ist in den meisten Fällen nützlicher als das Beenden des Debuggers bei Programmbeendigung.

-c, --command <command>

Um Befehle so auszuführen, als wären sie in einer .pdbrc-Datei angegeben; siehe Debuggerbefehle.

Geändert in Version 3.2: Die Option -c wurde hinzugefügt.

-m <modul>

Um Module ähnlich wie python -m auszuführen. Wie bei einem Skript pausiert der Debugger die Ausführung kurz vor der ersten Zeile des Moduls.

Geändert in Version 3.7: Die Option -m wurde hinzugefügt.

-p, --pid <pid>

An den Prozess mit der angegebenen PID anhängen.

Hinzugefügt in Version 3.14.

Um sich für Remote-Debugging an einen laufenden Python-Prozess anzuhängen, verwenden Sie die Option -p oder --pid mit der PID des Zielprozesses

python -m pdb -p 1234

Hinweis

Das Anhängen an einen Prozess, der in einem Systemaufruf blockiert ist oder auf I/O wartet, funktioniert nur, wenn die nächste Bytecode-Anweisung ausgeführt wird oder wenn der Prozess ein Signal empfängt.

Typische Verwendung zur Ausführung einer Anweisung unter Kontrolle des Debuggers ist

>>> import pdb
>>> def f(x):
...     print(1 / x)
>>> pdb.run("f(2)")
> <string>(1)<module>()
(Pdb) continue
0.5
>>>

Die typische Verwendung zur Inspektion eines abgestürzten Programms ist

>>> import pdb
>>> def f(x):
...     print(1 / x)
...
>>> f(0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in f
ZeroDivisionError: division by zero
>>> pdb.pm()
> <stdin>(2)f()
(Pdb) p x
0
(Pdb)

Geändert in Version 3.13: Die Implementierung von PEP 667 bedeutet, dass durch pdb vorgenommene Namenszuweisungen sofort den aktiven Geltungsbereich beeinflussen, auch wenn sie innerhalb eines optimierten Geltungsbereichs ausgeführt werden.

Das Modul definiert die folgenden Funktionen; jede startet den Debugger auf eine etwas andere Weise

pdb.run(Anweisung, globals=None, locals=None)

Führt die Anweisung (als String oder Code-Objekt gegeben) unter der Kontrolle des Debuggers aus. Der Debugger-Prompt erscheint, bevor Code ausgeführt wird; Sie können Breakpoints setzen und continue eingeben, oder Sie können die Anweisung mit step oder next durchlaufen (alle diese Befehle werden unten erklärt). Die optionalen Argumente globals und locals geben die Umgebung an, in der der Code ausgeführt wird; standardmäßig wird das Dictionary des Moduls __main__ verwendet. (Siehe die Erklärung der eingebauten Funktionen exec() oder eval().)

pdb.runeval(Ausdruck, globals=None, locals=None)

Wertet den Ausdruck (als String oder Code-Objekt gegeben) unter der Kontrolle des Debuggers aus. Wenn runeval() zurückkehrt, gibt es den Wert des Ausdrucks zurück. Ansonsten ist diese Funktion ähnlich wie run().

pdb.runcall(funktion, *args, **kwds)

Ruft die Funktion (ein Funktions- oder Methodenobjekt, kein String) mit den gegebenen Argumenten auf. Wenn runcall() zurückkehrt, gibt sie zurück, was der Funktionsaufruf zurückgegeben hat. Der Debugger-Prompt erscheint, sobald die Funktion betreten wird.

pdb.set_trace(*, header=None, commands=None)

Gibt den Debugger im aufrufenden Stack-Frame ein. Dies ist nützlich, um einen Breakpoint an einer bestimmten Stelle in einem Programm fest einzustellen, auch wenn der Code nicht anderweitig debuggt wird (z. B. wenn eine Assertion fehlschlägt). Wenn angegeben, wird header kurz vor Beginn des Debugging auf der Konsole ausgegeben. Das Argument commands, falls vorhanden, ist eine Liste von Befehlen, die beim Start des Debuggers ausgeführt werden sollen.

Geändert in Version 3.7: Das Keyword-only-Argument header.

Geändert in Version 3.13: set_trace() wird den Debugger sofort starten, anstatt in der nächsten auszuführenden Codezeile zu stoppen.

Hinzugefügt in Version 3.14: Das Argument commands.

awaitable pdb.set_trace_async(*, header=None, commands=None)

Async-Version von set_trace(). Diese Funktion sollte innerhalb einer Async-Funktion mit await verwendet werden.

async def f():
    await pdb.set_trace_async()

await-Anweisungen werden unterstützt, wenn der Debugger über diese Funktion aufgerufen wird.

Hinzugefügt in Version 3.14.

pdb.post_mortem(t=None)

Gibt den Post-Mortem-Debugging-Modus für die angegebene Ausnahme oder das Traceback-Objekt ein. Wenn kein Wert angegeben wird, wird die aktuell behandelte Ausnahme verwendet, oder es wird ein ValueError ausgelöst, wenn keine vorhanden ist.

Geändert in Version 3.13: Die Unterstützung für Ausnahmeobjekte wurde hinzugefügt.

pdb.pm()

Gibt den Post-Mortem-Debugging-Modus für die in sys.last_exc gefundene Ausnahme ein.

pdb.set_default_backend(backend)

Es gibt zwei unterstützte Backends für pdb: 'settrace' und 'monitoring'. Siehe bdb.Bdb für Details. Der Benutzer kann das Standard-Backend festlegen, das verwendet werden soll, wenn beim Instanziieren von Pdb kein Backend angegeben wird. Wenn kein Backend angegeben wird, ist das Standard-Backend 'settrace'.

Hinweis

breakpoint() und set_trace() werden von dieser Funktion nicht beeinflusst. Sie verwenden immer das 'monitoring'-Backend.

Hinzugefügt in Version 3.14.

pdb.get_default_backend()

Gibt das Standard-Backend für pdb zurück.

Hinzugefügt in Version 3.14.

Die Funktionen run* und set_trace() sind Aliase für das Instanziieren der Klasse Pdb und das Aufrufen der Methode mit demselben Namen. Wenn Sie auf weitere Funktionen zugreifen möchten, müssen Sie dies selbst tun

class pdb.Pdb(completekey='tab', stdin=None, stdout=None, skip=None, nosigint=False, readrc=True, mode=None, backend=None, colorize=False)

Pdb ist die Debugger-Klasse.

Die Argumente completekey, stdin und stdout werden an die zugrunde liegende Klasse cmd.Cmd übergeben; siehe dort die Beschreibung.

Das Argument skip muss, falls vorhanden, ein Iterable von glob-ähnlichen Mustern für Modulnamen sein. Der Debugger tritt nicht in Frames ein, die aus einem Modul stammen, das einem dieser Muster entspricht. [1]

Standardmäßig setzt pdb einen Handler für das SIGINT-Signal (das gesendet wird, wenn der Benutzer Strg-C auf der Konsole drückt), wenn Sie einen Befehl continue geben. Dies ermöglicht es Ihnen, durch erneutes Drücken von Strg-C erneut in den Debugger einzubrechen. Wenn Sie möchten, dass pdb den SIGINT-Handler nicht berührt, setzen Sie nosigint auf true.

Das Argument readrc hat standardmäßig den Wert true und steuert, ob pdb .pdbrc-Dateien vom Dateisystem lädt.

Das Argument mode gibt an, wie der Debugger aufgerufen wurde. Es beeinflusst die Funktionsweise einiger Debuggerbefehle. Gültige Werte sind 'inline' (verwendet vom eingebauten breakpoint()-Aufruf), 'cli' (verwendet beim Aufruf über die Kommandozeile) oder None (für abwärtskompatibles Verhalten, wie vor der Hinzufügung des mode-Arguments).

Das Argument backend gibt das zu verwendende Backend für den Debugger an. Wenn None übergeben wird, wird das Standard-Backend verwendet. Siehe set_default_backend(). Andernfalls sind die unterstützten Backends 'settrace' und 'monitoring'.

Das Argument colorize, wenn auf True gesetzt, aktiviert farbige Ausgabe im Debugger, wenn Farbe unterstützt wird. Dies hebt den im pdb angezeigten Quellcode hervor.

Beispielaufruf zur Aktivierung des Tracings mit skip

import pdb; pdb.Pdb(skip=['django.*']).set_trace()

Löst ein Audit-Ereignis pdb.Pdb ohne Argumente aus.

Geändert in Version 3.1: Der Parameter skip wurde hinzugefügt.

Geändert in Version 3.2: Der Parameter nosigint wurde hinzugefügt. Zuvor wurde nie ein SIGINT-Handler von Pdb gesetzt.

Geändert in Version 3.6: Das Argument readrc.

Hinzugefügt in Version 3.14: Das Argument mode wurde hinzugefügt.

Hinzugefügt in Version 3.14: Das Argument backend wurde hinzugefügt.

Hinzugefügt in Version 3.14: Das Argument colorize wurde hinzugefügt.

Geändert in Version 3.14: Inline-Breakpoints wie breakpoint() oder pdb.set_trace() stoppen das Programm immer am aufrufenden Frame und ignorieren das skip-Muster (falls vorhanden).

run(Anweisung, globals=None, locals=None)
runeval(Ausdruck, globals=None, locals=None)
runcall(funktion, *args, **kwds)
set_trace()

Siehe die Dokumentation der oben erklärten Funktionen.

Debuggerbefehle

Die vom Debugger erkannten Befehle sind unten aufgelistet. Die meisten Befehle können auf ein oder zwei Buchstaben abgekürzt werden, wie angegeben; z.B. bedeutet h(elp), dass entweder h oder help verwendet werden kann, um den Hilfebefehl einzugeben (aber nicht he oder hel, noch H oder Help oder HELP). Argumente für Befehle müssen durch Leerzeichen (Leerzeichen oder Tabs) getrennt sein. Optionale Argumente sind in eckigen Klammern ([]) in der Befehlssyntax angegeben; die eckigen Klammern müssen nicht eingegeben werden. Alternativen in der Befehlssyntax sind durch einen senkrechten Strich (|) getrennt.

Das Eingeben einer leeren Zeile wiederholt den zuletzt eingegebenen Befehl. Ausnahme: Wenn der letzte Befehl ein list-Befehl war, werden die nächsten 11 Zeilen aufgelistet.

Befehle, die der Debugger nicht erkennt, werden als Python-Anweisungen angenommen und im Kontext des debuggten Programms ausgeführt. Python-Anweisungen können auch mit einem Ausrufezeichen (!) vorangestellt werden. Dies ist eine leistungsstarke Möglichkeit, das debuggte Programm zu inspizieren; es ist sogar möglich, eine Variable zu ändern oder eine Funktion aufzurufen. Wenn bei einer solchen Anweisung ein Fehler auftritt, wird der Name des Fehlers ausgegeben, aber der Zustand des Debuggers wird nicht geändert.

Geändert in Version 3.13: Ausdrücke/Anweisungen, deren Präfix ein pdb-Befehl ist, werden nun korrekt identifiziert und ausgeführt.

Der Debugger unterstützt Aliase. Aliase können Parameter haben, was eine gewisse Anpassungsfähigkeit an den zu untersuchenden Kontext ermöglicht.

Mehrere Befehle können in einer einzigen Zeile eingegeben werden, getrennt durch ;;. (Ein einzelnes ; wird nicht verwendet, da es der Trennzeichen für mehrere Befehle in einer Zeile ist, die an den Python-Parser übergeben wird.) Es wird keine Intelligenz angewendet, um die Befehle zu trennen; die Eingabe wird am ersten ;;-Paar aufgeteilt, auch wenn es sich mitten in einem Anführungszeichen befindet. Eine Umgehung für Zeichenketten mit doppelten Semikolons ist die Verwendung von impliziter Zeichenkettenverkettung ';'';' oder ";"";".

Um eine temporäre globale Variable zu setzen, verwenden Sie eine Komfortvariable. Eine Komfortvariable ist eine Variable, deren Name mit einem $ beginnt. Zum Beispiel setzt $foo = 1 eine globale Variable $foo, die Sie in der Debugging-Sitzung verwenden können. Die Komfortvariablen werden gelöscht, wenn das Programm die Ausführung fortsetzt, sodass es Ihr Programm weniger wahrscheinlich beeinträchtigt als die Verwendung normaler Variablen wie foo = 1.

Es gibt vier vordefinierte Komfortvariablen

  • $_frame: der aktuelle Frame, den Sie debuggen

  • $_retval: der Rückgabewert, wenn der Frame zurückkehrt

  • $_exception: die Ausnahme, wenn der Frame eine Ausnahme auslöst

  • $_asynctask: die asyncio-Aufgabe, wenn pdb in einer async-Funktion stoppt

Hinzugefügt in Version 3.12: Die Funktion Komfortvariable wurde hinzugefügt.

Hinzugefügt in Version 3.14: Die Komfortvariable $_asynctask wurde hinzugefügt.

Wenn eine Datei .pdbrc im Home-Verzeichnis des Benutzers oder im aktuellen Verzeichnis existiert, wird sie mit 'utf-8'-Kodierung gelesen und so ausgeführt, als wäre sie auf dem Debugger-Prompt eingegeben worden, mit der Ausnahme, dass leere Zeilen und Zeilen, die mit # beginnen, ignoriert werden. Dies ist besonders nützlich für Aliase. Wenn beide Dateien existieren, wird die im Home-Verzeichnis zuerst gelesen und dort definierte Aliase können von der lokalen Datei überschrieben werden.

Geändert in Version 3.2: .pdbrc kann nun Befehle enthalten, die das Debugging fortsetzen, wie continue oder next. Zuvor hatten diese Befehle keine Auswirkung.

Geändert in Version 3.11: .pdbrc wird nun mit 'utf-8'-Kodierung gelesen. Zuvor wurde es mit der System-Locale-Kodierung gelesen.

h(elp) [command]

Ohne Argument wird die Liste der verfügbaren Befehle ausgegeben. Mit einem command als Argument wird Hilfe zu diesem Befehl ausgegeben. help pdb zeigt die vollständige Dokumentation (den Docstring des Moduls pdb) an. Da das Argument command ein Bezeichner sein muss, muss help exec eingegeben werden, um Hilfe zum Befehl ! zu erhalten.

w(here) [count]

Gibt einen Stack-Trace aus, wobei der neueste Frame unten ist. Wenn count 0 ist, wird der aktuelle Frame-Eintrag ausgegeben. Wenn count negativ ist, werden die am wenigsten aktuellen - count Frames ausgegeben. Wenn count positiv ist, werden die neuesten count Frames ausgegeben. Ein Pfeil (>) zeigt den aktuellen Frame an, der den Kontext der meisten Befehle bestimmt.

Geändert in Version 3.14: Das Argument count wurde hinzugefügt.

d(own) [count]

Bewegt den aktuellen Frame um count (standardmäßig eins) Ebenen nach unten im Stack-Trace (zu einem neueren Frame).

u(p) [count]

Bewegt den aktuellen Frame um count (standardmäßig eins) Ebenen nach oben im Stack-Trace (zu einem älteren Frame).

b(reak) [([filename:]lineno | function) [, condition]]

Mit einem lineno-Argument wird ein Breakpoint in Zeile lineno in der aktuellen Datei gesetzt. Die Zeilennummer kann mit einem Dateinamen und einem Doppelpunkt vorangestellt werden, um einen Breakpoint in einer anderen Datei zu spezifizieren (möglicherweise einer, die noch nicht geladen wurde). Die Datei wird auf sys.path gesucht. Akzeptable Formen von Dateiname sind /abspath/to/file.py, relpath/file.py, module und package.module.

Mit einem function-Argument wird ein Breakpoint bei der ersten ausführbaren Anweisung in dieser Funktion gesetzt. function kann jeder Ausdruck sein, der zu einer Funktion im aktuellen Namensraum ausgewertet wird.

Wenn ein zweites Argument vorhanden ist, handelt es sich um einen Ausdruck, der wahr ausgewertet werden muss, bevor der Breakpoint beachtet wird.

Ohne Argument werden alle Breaks aufgelistet, einschließlich für jeden Breakpoint die Anzahl der Male, die der Breakpoint getroffen wurde, der aktuelle Ignorier-Zähler und die zugehörige Bedingung, falls vorhanden.

Jeder Breakpoint erhält eine Nummer, auf die sich alle anderen Breakpoint-Befehle beziehen.

tbreak [([filename:]lineno | function) [, condition]]

Temporärer Breakpoint, der automatisch entfernt wird, wenn er zum ersten Mal getroffen wird. Die Argumente sind dieselben wie für break.

cl(ear) [filename:lineno | bpnumber ...]

Mit einem filename:lineno-Argument werden alle Breakpoints an dieser Zeile gelöscht. Mit einer durch Leerzeichen getrennten Liste von Breakpoint-Nummern werden diese Breakpoints gelöscht. Ohne Argument werden alle Breaks gelöscht (aber es wird zuerst eine Bestätigung verlangt).

disable bpnumber [bpnumber ...]

Deaktiviert die als durch Leerzeichen getrennte Liste von Breakpoint-Nummern angegebenen Breakpoints. Das Deaktivieren eines Breakpoints bedeutet, dass er die Ausführung des Programms nicht stoppen kann, aber im Gegensatz zum Löschen eines Breakpoints bleibt er in der Liste der Breakpoints und kann (wieder-)aktiviert werden.

enable bpnumber [bpnumber ...]

Aktiviert die angegebenen Breakpoints.

ignore bpnumber [count]

Setzt die Ignorier-Anzahl für die gegebene Breakpoint-Nummer. Wenn count weggelassen wird, wird die Ignorier-Anzahl auf 0 gesetzt. Ein Breakpoint wird aktiv, wenn die Ignorier-Anzahl Null ist. Wenn sie ungleich Null ist, wird count jedes Mal dekrementiert, wenn der Breakpoint erreicht wird, der Breakpoint nicht deaktiviert ist und eine zugehörige Bedingung zu true ausgewertet wird.

condition bpnumber [condition]

Setzt eine neue condition für den Breakpoint, ein Ausdruck, der zu true ausgewertet werden muss, bevor der Breakpoint berücksichtigt wird. Wenn condition fehlt, wird jede vorhandene Bedingung entfernt; d.h., der Breakpoint wird bedingungslos.

commands [bpnumber]

Gibt eine Liste von Befehlen für die Breakpoint-Nummer bpnumber an. Die Befehle selbst erscheinen in den folgenden Zeilen. Geben Sie eine Zeile ein, die nur end enthält, um die Befehle zu beenden. Ein Beispiel

(Pdb) commands 1
(com) p some_variable
(com) end
(Pdb)

Um alle Befehle aus einem Breakpoint zu entfernen, geben Sie commands ein und folgen Sie ihm sofort mit end; d.h., geben Sie keine Befehle.

Ohne das Argument bpnumber bezieht sich commands auf den zuletzt gesetzten Breakpoint.

Sie können Breakpoint-Befehle verwenden, um Ihr Programm wieder zu starten. Verwenden Sie einfach den Befehl continue, oder step, oder einen anderen Befehl, der die Ausführung fortsetzt.

Das Angeben eines Befehls, der die Ausführung fortsetzt (derzeit continue, step, next, return, until, jump, quit und deren Abkürzungen) beendet die Befehlsliste (als ob dieser Befehl sofort von end gefolgt worden wäre). Dies liegt daran, dass jedes Mal, wenn Sie die Ausführung fortsetzen (auch mit einem einfachen next oder step), Sie möglicherweise einen anderen Breakpoint antreffen – der seine eigene Befehlsliste haben könnte, was zu Mehrdeutigkeiten darüber führt, welche Liste ausgeführt werden soll.

Wenn die Liste der Befehle den Befehl silent enthält oder einen Befehl, der die Ausführung fortsetzt, wird die Breakpoint-Nachricht mit Informationen über den Frame nicht angezeigt.

Geändert in Version 3.14: Die Frame-Informationen werden nicht angezeigt, wenn ein Befehl, der die Ausführung fortsetzt, in der Befehlsliste vorhanden ist.

s(tep)

Führt die aktuelle Zeile aus und stoppt bei der ersten möglichen Gelegenheit (entweder in einer aufgerufenen Funktion oder in der nächsten Zeile in der aktuellen Funktion).

n(ext)

Setzt die Ausführung bis zur nächsten Zeile in der aktuellen Funktion fort oder bis sie zurückkehrt. (Der Unterschied zwischen next und step besteht darin, dass step innerhalb einer aufgerufenen Funktion stoppt, während next aufgerufene Funktionen mit (fast) voller Geschwindigkeit ausführt und nur bei der nächsten Zeile in der aktuellen Funktion stoppt.)

unt(il) [lineno]

Ohne Argument wird die Ausführung fortgesetzt, bis die Zeile mit einer Nummer größer als die aktuelle erreicht ist.

Mit lineno wird die Ausführung fortgesetzt, bis eine Zeile mit einer Nummer größer oder gleich lineno erreicht ist. In beiden Fällen wird auch gestoppt, wenn der aktuelle Frame zurückkehrt.

Geändert in Version 3.2: Das Angeben einer expliziten Zeilennummer ist erlaubt.

r(eturn)

Setzt die Ausführung fort, bis die aktuelle Funktion zurückkehrt.

c(ont(inue))

Setzt die Ausführung fort, stoppt nur, wenn ein Breakpoint angetroffen wird.

j(ump) lineno

Setzt die nächste auszuführende Zeile. Nur im untersten Frame verfügbar. Dies ermöglicht es Ihnen, zurückzuspringen und Code erneut auszuführen, oder nach vorne zu springen, um Code zu überspringen, den Sie nicht ausführen möchten.

Es sollte beachtet werden, dass nicht alle Sprünge erlaubt sind – zum Beispiel ist es nicht möglich, in die Mitte einer for-Schleife zu springen oder aus einer finally-Klausel herauszuspringen.

l(ist) [first[, last]]

Listet Quellcode für die aktuelle Datei auf. Ohne Argumente werden 11 Zeilen um die aktuelle Zeile herum aufgelistet oder die vorherige Auflistung fortgesetzt. Mit . als Argument werden 11 Zeilen um die aktuelle Zeile herum aufgelistet. Mit einem Argument werden 11 Zeilen um diese Zeile herum aufgelistet. Mit zwei Argumenten wird der angegebene Bereich aufgelistet; wenn das zweite Argument kleiner als das erste ist, wird es als Anzahl interpretiert.

Die aktuelle Zeile im aktuellen Frame wird mit -> gekennzeichnet. Wenn eine Ausnahme gerade abgehandelt wird, wird die Zeile, in der die Ausnahme ursprünglich ausgelöst oder weitergegeben wurde, mit >> gekennzeichnet, wenn sie sich von der aktuellen Zeile unterscheidet.

Geändert in Version 3.2: Der Marker >> wurde hinzugefügt.

ll | longlist

Listet den gesamten Quellcode für die aktuelle Funktion oder den aktuellen Frame auf. Interessante Zeilen sind wie bei list gekennzeichnet.

Hinzugefügt in Version 3.2.

a(rgs)

Gibt die Argumente der aktuellen Funktion und ihre aktuellen Werte aus.

p expression

Evaluiert den expression im aktuellen Kontext und gibt seinen Wert aus.

Hinweis

print() kann ebenfalls verwendet werden, ist aber kein Debugger-Befehl – dies führt die Python-Funktion print() aus.

pp expression

Wie der Befehl p, nur dass der Wert von expression mit dem pprint-Modul schön formatiert ausgegeben wird.

whatis expression

Gibt den Typ von expression aus.

source expression

Versucht, den Quellcode von expression abzurufen und anzuzeigen.

Hinzugefügt in Version 3.2.

display [expression]

Zeigt den Wert von expression an, wenn er sich geändert hat, jedes Mal, wenn die Ausführung im aktuellen Frame stoppt.

Ohne expression werden alle Anzeigeausdrücke für den aktuellen Frame aufgelistet.

Hinweis

Display evaluiert expression und vergleicht es mit dem Ergebnis der vorherigen Auswertung von expression. Wenn das Ergebnis veränderlich ist, kann display die Änderungen möglicherweise nicht erkennen.

Beispiel

lst = []
breakpoint()
pass
lst.append(1)
print(lst)

Display erkennt nicht, dass lst geändert wurde, da das Ergebnis der Auswertung in-place durch lst.append(1) modifiziert wird, bevor es verglichen wird.

> example.py(3)<module>()
-> pass
(Pdb) display lst
display lst: []
(Pdb) n
> example.py(4)<module>()
-> lst.append(1)
(Pdb) n
> example.py(5)<module>()
-> print(lst)
(Pdb)

Sie können einige Tricks mit dem Kopiermechanismus anwenden, damit dies funktioniert.

> example.py(3)<module>()
-> pass
(Pdb) display lst[:]
display lst[:]: []
(Pdb) n
> example.py(4)<module>()
-> lst.append(1)
(Pdb) n
> example.py(5)<module>()
-> print(lst)
display lst[:]: [1]  [old: []]
(Pdb)

Hinzugefügt in Version 3.2.

undisplay [expression]

Zeigt expression im aktuellen Frame nicht mehr an. Ohne expression werden alle Anzeigeausdrücke für den aktuellen Frame gelöscht.

Hinzugefügt in Version 3.2.

interact

Startet einen interaktiven Interpreter (unter Verwendung des Moduls code) in einem neuen globalen Namensraum, der aus den lokalen und globalen Namensräumen des aktuellen Geltungsbereichs initialisiert wurde. Verwenden Sie exit() oder quit(), um den Interpreter zu verlassen und zum Debugger zurückzukehren.

Hinweis

Da interact einen neuen dedizierten Namensraum für die Codeausführung erstellt, wirken sich Zuweisungen an Variablen nicht auf die ursprünglichen Namensräume aus. Modifikationen an referenzierten veränderlichen Objekten werden jedoch wie üblich in den ursprünglichen Namensräumen reflektiert.

Hinzugefügt in Version 3.2.

Geändert in Version 3.13: exit() und quit() können verwendet werden, um den interact-Befehl zu beenden.

Geändert in Version 3.13: interact leitet seine Ausgabe an den Ausgabekanal des Debuggers und nicht an sys.stderr.

alias [name [command]]

Erstellt einen Alias namens name, der command ausführt. Der command darf nicht in Anführungszeichen eingeschlossen sein. Ersetzbare Parameter können durch %1, %2, … und %9 gekennzeichnet werden, während %* durch alle Parameter ersetzt wird. Wenn command weggelassen wird, wird der aktuelle Alias für name angezeigt. Wenn keine Argumente angegeben werden, werden alle Aliase aufgelistet.

Aliase können verschachtelt sein und alles enthalten, was legal an der pdb-Eingabeaufforderung eingegeben werden kann. Beachten Sie, dass interne pdb-Befehle durch Aliase überschrieben werden können. Ein solcher Befehl wird dann versteckt, bis der Alias entfernt wird. Das Aliasing wird rekursiv auf das erste Wort der Befehlszeile angewendet; alle anderen Wörter in der Zeile bleiben unverändert.

Als Beispiel hier zwei nützliche Aliase (besonders wenn sie in der Datei .pdbrc platziert werden)

# Print instance variables (usage "pi classInst")
alias pi for k in %1.__dict__.keys(): print(f"%1.{k} = {%1.__dict__[k]}")
# Print instance variables in self
alias ps pi self
unalias name

Löscht den angegebenen Alias name.

! statement

Führt die (einzeilige) statement im Kontext des aktuellen Stack-Frames aus. Das Ausrufezeichen kann weggelassen werden, es sei denn, das erste Wort der Anweisung ähnelt einem Debugger-Befehl, z.B.

(Pdb) ! n=42
(Pdb)

Um eine globale Variable zu setzen, können Sie dem Zuweisungsbefehl eine global-Anweisung in derselben Zeile voranstellen, z.B.

(Pdb) global list_options; list_options = ['-l']
(Pdb)
run [args ...]
restart [args ...]

Startet das debuggte Python-Programm neu. Wenn args angegeben wird, wird es mit shlex aufgeteilt und das Ergebnis als neues sys.argv verwendet. Verlauf, Breakpoints, Aktionen und Debugger-Optionen bleiben erhalten. restart ist ein Alias für run.

Geändert in Version 3.14: Die Befehle run und restart sind deaktiviert, wenn der Debugger im 'inline'-Modus aufgerufen wird.

q(uit)

Beendet den Debugger. Das ausgeführte Programm wird abgebrochen. Eine Eingabe des Dateiendzeichens (End-of-file) ist gleichbedeutend mit quit.

Eine Bestätigungsaufforderung wird angezeigt, wenn der Debugger im 'inline'-Modus aufgerufen wird. y, Y, <Enter> oder EOF bestätigen den Abbruch.

Geändert in Version 3.14: Eine Bestätigungsaufforderung wird angezeigt, wenn der Debugger im 'inline'-Modus aufgerufen wird. Nach der Bestätigung ruft der Debugger sys.exit() sofort auf, anstatt bdb.BdbQuit beim nächsten Trace-Ereignis auszulösen.

debug code

Gibt einen rekursiven Debugger ein, der durch code (einen beliebigen Ausdruck oder eine Anweisung, die in der aktuellen Umgebung ausgeführt werden soll) schreitet.

retval

Gibt den Rückgabewert des letzten Rückrufs der aktuellen Funktion aus.

exceptions [excnumber]

Listet verkettete Ausnahmen auf oder springt zwischen ihnen.

Bei der Verwendung von pdb.pm() oder Pdb.post_mortem(...) mit einer verketteten Ausnahme anstelle eines Tracebacks ermöglicht dies dem Benutzer, mit dem Befehl exceptions Ausnahmen aufzulisten und mit exceptions <number> zu der jeweiligen Ausnahme zu wechseln.

Beispiel

def out():
    try:
        middle()
    except Exception as e:
        raise ValueError("reraise middle() error") from e

def middle():
    try:
        return inner(0)
    except Exception as e:
        raise ValueError("Middle fail")

def inner(x):
    1 / x

 out()

Das Aufrufen von pdb.pm() ermöglicht den Wechsel zwischen Ausnahmen.

> example.py(5)out()
-> raise ValueError("reraise middle() error") from e

(Pdb) exceptions
  0 ZeroDivisionError('division by zero')
  1 ValueError('Middle fail')
> 2 ValueError('reraise middle() error')

(Pdb) exceptions 0
> example.py(16)inner()
-> 1 / x

(Pdb) up
> example.py(10)middle()
-> return inner(0)

Hinzugefügt in Version 3.13.

Fußnoten