2010-01-29 9 views
8

Estoy tratando con un servidor escrito por python que se bloquea y deja de funcionar, incluido el registro. Me pregunto si hay un pitón equivalente a la señal "kill -3" de java que al menos imprime la stacktrace actual.¿Cómo forzar a la VM de python a imprimir una traza de pila?

+2

'kill envía -2' SIGINT, que al menos en Linux parece traducirse en una excepción' KeyboardInterrupt'. Eso podría causar que un rastro de pila se vierta en alguna parte. Depende del servidor, por supuesto. –

Respuesta

2
import signal, traceback 
def quit_handler(signum,frame): 
    traceback.print_stack() 
signal.signal(signal.SIGQUIT,quit_handler) 
+0

Si el servidor "se bloquea", no necesariamente obtiene una señal SIGQUIT, supongo. – AndiDog

+0

@AndiDog: creo que se supone que debes usar 'kill (1)' para enviarlo cuando detectes manualmente que se ha bloqueado. – SamB

4

utilizar el módulo faulthandler. https://pypi.python.org/pypi/faulthandler/

import faulthandler 
faulthandler.register(signal.SIGUSR1) 

Esto funciona fuera de la señal del bucle intérprete de Python manejo en el nivel C para que funcione incluso cuando el propio intérprete de Python se cuelga de espera en otra cosa.

Consulte también: http://docs.python.org/dev/library/faulthandler

+0

Como usted indica, 'faulthandler' está incluido en la biblioteca estándar de Python 3.3+ – rescdsk

Cuestiones relacionadas