2010-01-29 13 views
8

Mam do czynienia z serwerem napisanym przez Pythona, który blokuje się i przestaje działać, włączając rejestrowanie. Zastanawiam się, czy istnieje python odpowiadający sygnałowi "kill -3" java, który przynajmniej wypisuje bieżący stacktrace.Jak zmusić VM Pythona do drukowania śledzenia stosu?

+2

'zabić -2' wysyła SIGINT, który przynajmniej na Linux wydaje się przełożyć na' KeyboardInterrupt' wyjątku. To może spowodować, że gdzieś zostanie zrzucony ślad stosu. To zależy oczywiście od serwera. –

Odpowiedz

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

Jeśli serwer "blokuje się", to niekoniecznie otrzymuje sygnał SIGQUIT, jak sądzę. – AndiDog

+0

@AndiDog: Myślę, że powinieneś użyć 'kill (1)', aby wysłać go, gdy ręcznie wykryjesz, że jest zablokowany. – SamB

4

pomocą modułu faulthandler. https://pypi.python.org/pypi/faulthandler/

import faulthandler 
faulthandler.register(signal.SIGUSR1) 

ta działa poza sygnałem interpreter Pythona pętla przeładunku na poziomie C, więc to będzie działać nawet wtedy, gdy sam interpreter Pythona jest zawieszony czeka na coś innego.

Zobacz także: http://docs.python.org/dev/library/faulthandler

+0

Jak wskazujesz, 'faultampleler' jest zawarty w standardowej bibliotece z Python 3.3+ – rescdsk

Powiązane problemy