Bdbquit elevado al depurar python

Recientemente, al agregar el depurador a mi código Python 2.7.10, recibo este mensaje:

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/consumble_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 

Esto es después de insertar las líneas:

import pdb; pdb.set_trace()

en el codigo

No puedo entender por qué esto está sucediendo. He leído sobre Bdb y Bdbquit, pero no puedo entender por qué sucede esto en mi código. ¿Alguien me puede dar algunas pistas de por qué sucede esto en general? Tengo muchas ganas de que el depurador vuelva a funcionar.

Si continúa desde el (pdb) y permite que su código termine normalmente, no esperaría un resultado como el rastreo que indicó, pero si pdb , con el comando quit o ^ D (EOF), un rastreo como ese ocurre porque no hay nada para detectar la excepción BdbQuit cuando se cierra el depurador. En bdb.py self.quitting se establece en True mediante el método set_quit (y, finally cláusulas de los distintos métodos de ejecución). Los métodos de envío llamados por trace_dispatch raise BdbQuit cuando self.quitting es True , y la típica except: cláusula para BdbQuit es una simple statement de pass ; pdb hereda todo eso de gdb .

En resumen, el manejo de excepciones se usa para deshabilitar la función de rastreo del sistema utilizada por el depurador, cuando la interacción del depurador termina antes.

Una forma de evitar el rastreo completo es usar pdb diferente. En lugar de llamar a pdb.set_trace() desde su código (y no manejar BdbQuit en absoluto), puede invocar su código dentro de pdb (en lugar de viceversa), en cuyo punto la excepción de BdbQuit se manejará según lo previsto por pdb. Eso también le permitirá elegir ubicaciones de punto de interrupción sin modificar su código (usando el comando break pdb ). O puedes mezclar los dos enfoques; ejecute su código bajo pdb , pdb.set_trace() llamadas y todo, y esas llamadas serán puntos de interrupción que puede eliminar solo modificando su código.

Puede invocar su código dentro de pdb usando el comando pdb con la invocación de su script como sus argumentos de línea de comando, o con python -m pdb .

Me encontré con esto cuando dejé import pdb y un pdb.set_trace() en mi código de producción. Cuando se ejecutó la línea pdb.set_trace() , python estaba esperando a que yo ingresara para indicarle que comience o entre, etc … Debido a que un servidor web estaba llamando al código de python, no estaba allí para presionar c continuar. Después de tanto tiempo (no estoy seguro de cuánto tiempo) finalmente levantó la excepción BdbQuit .

No tenía nada configurado para detectar esa excepción, por lo que aumentó 500 en mi servidor web.

Me tomó un tiempo entender que mi código de depuración que se ejecuta en un daemon / fondo estaba causando el problema. Me sentí tonto.

Aparte de la respuesta de Eirik Fuller, me gustaría agregar que no se puede usar pdb en algo que se ejecuta en un proceso diferente. Para la depuración puede verificar esta respuesta: https://stackoverflow.com/a/23654936/7806805 pero parece muy intrépido o puede hacer que su progtwig se ejecute en un solo hilo. Consulte la documentación: https://docs.python.org/3/library/concurrent.futures.html . Para problemas de multiprocesamiento, es posible que incluso desee consultar https://www.reddit.com/r/learnpython/comments/46x9sm/why_is_pdbset_trace_crashing_whenever_it_is_in_an/

De todos modos su pregunta carece de contexto muy necesario. Por favor agregue a su pregunta.

Una posible razón es que está ejecutando el Python script in the background . Cuando un proceso se ejecuta en segundo plano, no puede enviar entradas al proceso a través del terminal y, por lo tanto, la consola pdb no puede funcionar. Con el tiempo, aumenta bdbquit.