2016-01-21 8 views
11

Kürzlich wenn der Debugger meines Python 2.7.10 Code hinzufügen, erhalte ich diese Meldung:Bdbquit ausgelöst, wenn Python Debuggen

Traceback (most recent call last): 
    File "/Users/isaachess/Programming/vivint/Platform/MessageProcessing/vivint_cloud/queues/connectors/amqplib_connector.py", line 191, in acking_callback 
    callback(message.body) 
    File "/Users/isaachess/Programming/vivint/Platform/MessageProcessing/vivint_cloud/queues/consumable_message_queue.py", line 32, in deserialized_callback 
    self._callback_method(msg) 
    File "/Users/isaachess/Programming/vivint/Platform/BusinessLogic/businesslogic/util/statsd_util.py", line 95, in _time_func 
    retVal = f(*args, **kwargs) 
    File "/Users/isaachess/Programming/vivint/Platform/MessageProcessing/vivint_cloud/net/router.py", line 226, in handle 
    try: 
    File "/Users/isaachess/Programming/vivint/Platform/MessageProcessing/vivint_cloud/net/router.py", line 226, in handle 
    try: 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/bdb.py", line 49, in trace_dispatch 
    return self.dispatch_line(frame) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/bdb.py", line 68, in dispatch_line 
    if self.quitting: raise BdbQuit 
BdbQuit 

Diese nach den Zeilen eingefügt ist:

import pdb; pdb.set_trace()

in der Code.

Ich kann nicht herausfinden, warum das passiert. Ich habe Bdb und Bdbquit gelesen, kann aber nicht herausfinden, warum das in meinem Code passiert. Kann mir jemand Hinweise geben, warum das überhaupt passiert? I wirklich möchte den Debugger wieder arbeiten lassen.

+3

Wie führen Sie Ihren Prozess aus? Meine Vermutung ist, dass Ihr Prozess nicht an ein Terminal oder ähnliches angeschlossen ist. Ist das ein Teilprozess oder etwas ähnliches? – shx2

+0

@ shx2, Unterprozess? Könnte die Verwendung von [Luigi] (https://pypi.python.org/pypi/luigi) dazu führen? –

Antwort

6

Wenn Sie von der (pdb) prompt weiter und lassen Sie Ihren Code normalerweise zu beenden, würde ich nicht eine Ausgabe wie die Traceback erwarten Sie angegeben, aber wenn Sie aufhören pdb, mit dem quit Befehl oder^D (EOF), eine Zurückverfolgungs Das passiert, weil es nichts gibt, was die BdbQuit Exception, die ausgelöst wird, wenn der Debugger beendet wird, zu fangen. In bdb.py wird self.quitting durch die set_quit Methode (und finally Klauseln in den verschiedenen Laufmethoden) True gesetzt. Versandmethoden, die durch trace_dispatchraise BdbQuit genannt werden, ist True, und die typische except: Klausel für BdbQuit ist eine einfache pass Aussage; pdb erbt alles von gdb.

Kurz gesagt, wird die Ausnahmebehandlung verwendet, um die System-Trace-Funktion zu deaktivieren, die vom Debugger verwendet wird, wenn die Debuggerinteraktion vorzeitig beendet wird.

Eine Möglichkeit, die gesamte Rückverfolgung zu vermeiden, besteht darin, pdb anders zu verwenden. Anstatt pdb.set_trace() aus Ihrem Code aufzurufen (und BdbQuit überhaupt nicht zu behandeln), können Sie Ihren Code innerhalb von pdb aufrufen (statt umgekehrt), wobei die BdbQuit Ausnahme an diesem Punkt wie von pdb beabsichtigt behandelt wird. Dadurch können Sie auch Haltepunktpositionen auswählen, ohne den Code zu ändern (mit dem Befehl pdbbreak). Oder Sie können die beiden Ansätze kombinieren; Führen Sie Ihren Code unter pdb, pdb.set_trace() Aufrufe und alle, und diese Aufrufe werden Haltepunkte sein, die Sie nur durch Ändern Ihres Codes entfernen können.

Sie können Ihren Code innerhalb von pdb mithilfe des Befehls pdb mit Ihrem Skriptaufruf als Befehlszeilenargumente oder mit python -m pdb aufrufen.

+0

wäre es großartig, wenn Sie mögliche Ursachen für BdbQuit angeben könnten, da pdb es in einigen Skripten nicht aufruft. – Alex

+0

Dies ist nicht die vollständige Antwort, es gibt viele andere Einschränkungen von 'pdb', wie es in einem Multiprozess-Pool und so weiter nicht funktionieren kann. Du versäumst es, diese zu erwähnen. –

-1

Ich lief in diese, als ich import pdb und eine pdb.set_trace() in meinem Produktionscode verließ. Im Grunde war nichts zu c ontinue der Code, so dass es schließlich fehlgeschlagen ist. Ich fühle mich wie ein Quatsch.

0

Abgesehen von Eirik Fuller Antwort möchte ich hinzufügen, dass Sie nicht pdb in etwas verwenden können, das in einem anderen Prozess läuft. Zum Debuggen können Sie diese Antwort überprüfen: https://stackoverflow.com/a/23654936/7806805 aber es scheint sehr hackish oder Sie können Ihr Programm in einem einzigen Thread ausführen. Konsultieren Sie die Dokumentation: https://docs.python.org/3/library/concurrent.futures.html. Für Multiprocessing-Probleme möchten Sie vielleicht sogar durch https://www.reddit.com/r/learnpython/comments/46x9sm/why_is_pdbset_trace_crashing_whenever_it_is_in_an/ gehen

Anyways Ihre Frage fehlt dringend benötigten Kontext. Bitte fügen Sie zu Ihrer Frage hinzu.

Verwandte Themen