Wie kann ich pdb beenden und zulassen, dass das Programm fortgesetzt wird?

111

Ich benutze das pdb-Modul, um ein Programm zu debuggen. Ich möchte verstehen, wie ich pdb beenden und zulassen kann, dass das Programm bis zum Abschluss fortgesetzt wird. Die Ausführung des Programms ist rechenintensiv, daher möchte ich es nicht beenden, ohne dass das Skript versucht, es zu vervollständigen. continuescheint nicht zu funktionieren. Wie kann ich pdb beenden und mit meinem Programm fortfahren?

Schildkröte
quelle
2
continuebeendet Schleifen, beendet returnMethoden / Funktionen
Stephan
7
@Stephan: Er spricht über continueden Befehl pdb. Nicht die Python-Anweisung.
Voithos
1
@turtle: continuesollte laut Dokumentation "Ausführung fortsetzen, nur stoppen, wenn ein Haltepunkt gefunden wird". Haben Sie einen Haltepunkt gesetzt, der getroffen wird?
Voithos
1
Ah. OK, ich verstehe. Ja, ich habe einen Haltepunkt in einer Schleife gesetzt. trotzdem, um das zu umgehen? Die Schleife wird tausende Male aufgerufen, daher kann ich nicht weiter manuell auf Weiter klicken.
Schildkröte
1
@turtle: Haben Sie einen Haltepunkt in Pdb festgelegt oder haben Sie einen pdb.set_trace()in Ihrem Quellcode?
Voithos

Antworten:

189

continuesollte "Ausführung fortsetzen, nur anhalten, wenn ein Haltepunkt gefunden wird", damit irgendwo ein Haltepunkt festgelegt ist. So entfernen Sie den Haltepunkt (wenn Sie ihn manuell eingefügt haben):

(Pdb) break
Num Type         Disp Enb   Where
1   breakpoint   keep yes   at /path/to/test.py:5
(Pdb) clear 1
Deleted breakpoint 1
(Pdb) continue

Oder wenn Sie verwenden pdb.set_trace(), können Sie dies versuchen (obwohl, wenn Sie pdb auf ausgefallenere Weise verwenden, dies Dinge kaputt machen kann ...)

(Pdb) pdb.set_trace = lambda: None  # This replaces the set_trace() function!
(Pdb) continue
# No more breaks!
voithos
quelle
10
Die oben nicht verlassen pdb.
Steve Barnes
7
Über das 15. Wort der Frage!
Steve Barnes
13
@SteveBarnes: Ich denke, du nimmst es zu wörtlich. Das OP erreicht immer wieder einen Haltepunkt. Alles, was sie brauchen, ist, ihren langjährigen Prozess fortzusetzen, ohne Haltepunkte zu erreichen. Ob Pdb tatsächlich ausgeführt wird oder nicht, spielt keine Rolle.
Voithos
35
Netter Tipp zum Einstellen set_trace = lambda: None:)
Randlet
2
Im Extremfall geht nichts set_trace = lambda: None. Python org sollte einen Befehl hinzufügen, mit dem Sie pdb verlassen können.
ErezO
26

Ein einfaches Ctrl- Dwird aus pdb ausbrechen. Wenn Sie fortfahren möchten, anstatt zu brechen, drücken Sie einfach cund nicht den gesamten continueBefehl

Minh Triet
quelle
6
Was ist, wenn Sie sich in einer Funktion, in einer Schleife befinden? Es scheint für mich nur zur nächsten Schleife zu gehen, und ich kann pdb oder sogar Python nicht schließen, ohne das gesamte Terminal zu schließen?
Marses
@ LimokPalantaemon Weird, haben Sie versucht zu tippenexit
Minh Triet
Dies funktioniert nicht, wenn Sie eine Ablaufverfolgung festlegen oder wenn Sie Haltepunkte haben, es sei denn, Sie drücken weiterhin c.
Alex
peinlich, aber das rettete mich davor, zu lange festzusitzen -_-
jmcg
7

Die Antwort von @voithos ist richtig, daher füge ich nur eine Alternative hinzu, falls Sie sie verwenden set_trace. Ja, der pdb.set_trace = lambda: NoneHack funktioniert einwandfrei, aber nicht, wenn Sie andere Haltepunkte festgelegt haben und diese später wieder aktivieren möchten. Für mich weist dies auf die Tatsache hin, dass leider pdbeine Reihe von Funktionen fehlen (sogar grundlegende Dinge wie Anzeigelisten), und dies ist ein weiterer Fall.

Die gute Nachricht ist, dass dies pdb++ein großartiger Ersatz für Drop-In ist pdb, und eines der Dinge, die es löst, ist genau das Problem der Deaktivierung set_trace. Sie können also einfach Folgendes tun:

pip install pdbpp

und geben Sie an der (Pdb++)Eingabeaufforderung Folgendes ein:

pdb.disable()

Wenn Sie später wieder aktivieren möchten, funktioniert dies nicht überraschend:

pdb.enable()

Einfach! Darüber hinaus erhalten Sie viele weitere nützliche Extras.

Adam Spires
quelle
4

Wenn Sie den Debugger wirklich beenden möchten, müssen Sie etwas wie WinPdb ausführen , mit dem Sie sich vom Prozess trennen und dann den Debugger beenden können (Hinweis: Es ist plattformübergreifend).

Wenn Sie das Debuggen fortsetzen möchten, aber nicht mehr an einem bestimmten Haltepunkt anhalten möchten, müssen Sie:

  1. Notieren Sie sich die Haltepunktnummer (oder die Datei- und Zeilennummer).
  2. Entweder cl bp_number oder clear file:line um den Haltepunkt dauerhaft zu entfernen oder disable pb_number um ihn auszuschalten, aber in der Lage zu sein, ihn zurückzuschalten.
  3. Dann continueund Ihr Programm läuft bis dahin der nächste andere Haltepunkt wird getroffen.

Weitere Einzelheiten hierzu finden Sie im Handbuch .

Steve Barnes
quelle
0

Finden Sie einen neuen Weg, um die PDF-Datei zu beenden, ohne etwas zu installieren: - Wenn das Programm gestartet wird, drücken Sie Strg + C und wechseln Sie dann in ein anderes Fenster (ein beliebiges Fenster). Die ursprüngliche Shell mit laufender PDF-Datei sollte Folgendes anzeigen: (PDF) ..... - Wechseln Sie zurück zu pdb und drücken Sie die Eingabetaste. Jetzt sind Sie fertig. Die pdb-Befehlsshell wird wieder angezeigt

BrainAtom
quelle