2010-11-26 18 views
6

Estoy buscando una forma de depurar una excepción de python "retrospectivamente". Básicamente, si mi programa genera una excepción que no se gestiona, quiero que guarde el estado del programa para que pueda volver más tarde y solucionar el problema.¿Cómo puedo depurar retrospectivamente una excepción de python?

He echado un vistazo a los documentos pdb, y parece que puede hacerlo, pero solo si puede interactuar con el programa en el momento de la excepción. Esto no funcionará para mí ya que el programa se ejecutará en segundo plano (sin un terminal de control).

Mi primer enfoque (¡condenado!) Fue poner un bloque try/except en el nivel más alto de mi programa, y ​​en el bloque except extraer el objeto traceback de la excepción actual y escribirlo en disco usando pickle. Planeé escribir un programa separado que desharía el objeto y usar pdb.post_mortem para depurar el programa bloqueado. Pero los objetos de rastreo no son seleccionables, pero no esperaría que funcionaran de todos modos, ya que no salvaría todo el estado del programa.

+2

Esto no resuelve su problema de ninguna manera, pero en lugar de envolver todo su programa en una declaración 'try', podría ser mejor configurar un controlador para excepciones no detectadas asignándolo a [' sys.excepthook'] (http://docs.python.org/library/sys.html#sys.excepthook). – aaronasterling

Respuesta

0

Lo que puede hacer es usar twisted.python y escribir el rastreo en un archivo, que le da un rastreo exacto incluyendo la excepción

+0

también está el módulo 'traceback'. Pero no creo que eso sea lo que quiere el OP. – knitti

+0

No estoy seguro de que haga lo que estoy buscando. Puedo volcar el rastreo al archivo cuando se captura la excepción, pero lo que realmente busco es una forma de depurar el programa de forma interactiva después del hecho (como si depurara un archivo core con gdb). –

1

Por lo que yo sé, no hay ninguna manera de hacer lo que preguntando Dicho esto, parece que podría estar buscando un depurador remoto. Hay un par de opciones:

  • rconsole - Esto no es realmente un depurador, pero le permite obtener un intérprete interactivo dentro de otro proceso. Esto puede ser útil para fines de depuración. No lo he intentado, pero parece relativamente sencillo.
  • rpdb2's embedded debugger - Esto le permite iniciar un depurador y luego conectarse desde otro shell.
+0

Gracias, las investigaré. –

0

Se puede crear un entorno de ejecución totalmente independiente en el nivel superior:

myEnv = {} 
myEnv.update(globals) 

luego ejecutar su código dentro de ese entorno de ejecución. Si ocurre una excepción, tiene traceback (stack) y todos los globales, por lo que puede reconstruir bastante bien el estado del programa.

0

Por el momento se detecta la excepción, antes de que la pila se desenrolla, el estado está disponible para su inspección con el módulo de inspección: http://docs.python.org/2/library/inspect.html

Genéricamente se usaría inspect.getinnerframes en el objeto de rastreo. Las variables locales en cada marco de pila están disponibles como .f_locals para que pueda ver cuáles son.

La parte difícil es la serialización de todos ellos correctamente: según los tipos que tenga en el ámbito local, puede o no ser capaz de extraerlos, volcarlos en JSON, o lo que sea.

0

espero que esto ayuda (me ayudó):

import logging, traceback 
_logger = logging.getLogger(__name__) 

try: 
    something_bad() 
except Exception as error: 
    _logger.exception("Oh no!") # Logs original traceback 
    store_exception_somewhere(error) 

También, al igual que in Python 3 there are a few new optionsraise new_exc from original_exc o raise OtherException(...).with_traceback(tb).

Cuestiones relacionadas