2010-03-29 19 views
7

Tengo una aplicación Python que se supone que es muy larga vida, pero a veces el proceso simplemente desaparece y no sé qué. Nada se registra cuando esto sucede, por lo que estoy un poco perdido.La captura de una aplicación Python antes de que salga

¿Hay alguna manera en el código que puedo conectar a un evento de salida, o de alguna otra manera de conseguir algo de mi código para funcionar justo antes de se cierra el proceso? Me gustaría registrar el estado de las estructuras de memoria para comprender mejor lo que está sucediendo.

Respuesta

8

atexit se pronuncia "en la salida". Las primeras veces que he leído nombre de la función, lo leí como "un texit", lo cual no tiene casi tanto sentido.

+0

cosas podrían ser peores; por ejemplo, el autor del módulo podría tener un buen día xitty en el trabajo, por lo que llamaron al módulo después del hecho. ;) – tzot

3

es posible que trate de ejecutar la aplicación directamente desde una consola (cmd en las ventanas, sh/bash/etc en UNIX), para que pueda ver cualquier traza de la pila, etc impreso en la consola cuando el proceso de morir.

3

no estoy seguro de si usted es capaz de modificar el código fuente, pero si es así es posible que desee probar esto:

def debugexcept(type, value, tb): 
    if hasattr(sys, 'ps1') or not (sys.stderr.isatty() and sys.stdin.isatty()) or type == SyntaxError: 
     sys.__excepthook__(type, value, tb) 
    else: 
     import traceback, pdb 
     traceback.print_exception(type, value, tb) 
     print 
     pdb.pm() 


sys.excepthook = debugexcept 

Si inicia su programa de Python desde una línea de comandos que se debe botar en el depurador de Python cuando muera, asumiendo que algo 'malo' ha causado una excepción. Supongo que quizás se haya capturado stderr/stdout y no veas alguna excepción.

es decir, la búsqueda de algo así como:

sys.stdout = open('stdout.log', 'w') 
sys.stderr = open('stderr.log', 'w') 

Si el proceso está muriendo sin excepción en todo, entonces que puede ser más difícil de encontrar. Una (muy difícil) en windows sería usar algo como windbg para adjuntar al proceso y establecer un punto de interrupción en el CRT en algún lugar relevante.

¡Buena suerte!

Cuestiones relacionadas