2010-03-29 9 views
7

Ho un'applicazione python che dovrebbe essere molto longeva, ma a volte il processo scompare e non so perché. Nulla viene registrato quando questo accade, quindi sono un po 'una perdita.Cattura un'applicazione python prima che esca

C'è qualche modo nel codice che posso collegare ad un evento di uscita, o un altro modo per far funzionare un po 'del mio codice appena prima che il processo si interrompa? Vorrei registrare lo stato delle strutture di memoria per capire meglio cosa sta succedendo.

risposta

8

atexit è pronunciato "all'uscita". Le prime volte che ho letto il nome di questa funzione, l'ho letto come "un texit", che non rende lo quasi uguale a.

+0

Le cose potrebbero andare peggio; per esempio, l'autore del modulo potrebbe avere un bel giorno xitty al lavoro, quindi hanno chiamato il modulo dopo il fatto. ;) – tzot

3

Si potrebbe provare a eseguire l'applicazione direttamente da una console (cmd su windows, sh/bash/etc su unix), in modo da poter vedere qualsiasi traccia dello stack, ecc. Stampata sulla console quando il processo muore.

3

non sono sicuro se si è in grado di modificare il codice sorgente, ma in tal caso si potrebbe desiderare di provare questo:

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 

Se si avvia il programma Python da una riga di comando si dovrebbe essere oggetto di dumping nel debugger Python quando muore, supponendo che qualcosa di "cattivo" abbia causato un'eccezione. Immagino che forse stderr/stdout siano stati catturati e tu non stia vedendo qualche eccezione?

cioè ricerca di qualcosa di simile a:

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

Se il processo sta morendo senza eccezioni a tutti allora che potrebbe essere più difficile da trovare. Uno (molto difficile) su Windows sarebbe utilizzare qualcosa come windbg da allegare al processo e impostare un punto di interruzione nel CRT in un punto pertinente.

Buona fortuna!

Problemi correlati