mirror of
https://github.com/zulip/zulip.git
synced 2025-11-05 22:43:42 +00:00
With this change, pkill -SIGUSR1 -f runtornado will dump the stack and SIGUSR2 will enable an interactive debugging session. This fixes #613 for Tornado which was the original motive for that ticket; I'm not sure whether we want to do this for our Django processes as well, but it would be easy to do so if we did. (imported from commit a7de7c6070f4bf0404bed6f434e6a6b291d66a26)
27 lines
1.0 KiB
Python
27 lines
1.0 KiB
Python
import code
|
|
import traceback
|
|
import signal
|
|
|
|
# Interactive debugging code from
|
|
# http://stackoverflow.com/questions/132058/showing-the-stack-trace-from-a-running-python-application
|
|
# (that link also points to code for an interactive remote debugger
|
|
# setup, which we might want if we move Tornado to run in a daemon
|
|
# rather than via screen).
|
|
def interactive_debug(sig, frame):
|
|
"""Interrupt running process, and provide a python prompt for
|
|
interactive debugging."""
|
|
d={'_frame':frame} # Allow access to frame object.
|
|
d.update(frame.f_globals) # Unless shadowed by global
|
|
d.update(frame.f_locals)
|
|
|
|
message = "Signal recieved : entering python shell.\nTraceback:\n"
|
|
message += ''.join(traceback.format_stack(frame))
|
|
i = code.InteractiveConsole(d)
|
|
i.interact(message)
|
|
|
|
# SIGUSR1 => Just print the stack
|
|
# SIGUSR2 => Print stack + open interactive debugging shell
|
|
def interactive_debug_listen():
|
|
signal.signal(signal.SIGUSR1, lambda sig, stack: traceback.print_stack(stack))
|
|
signal.signal(signal.SIGUSR2, interactive_debug)
|