java程序如果因为失败了退出,都会打印一个stacktrace出来,便于排查问题。
对于正在运行的程序也可以用jstack来打印。
在python里面如果对于将正在运行的python程序打印stacktrace呢?(比如你想知道你的程序卡在哪里了,你不可能在每个可能卡的地方都加一个调试信息)
python自己没有提供类似于jstack这样的工具,因此我们只有自己实现。
trace.py
import code, traceback, signal
def listen():
signal.signal(signal.SIGUSR1, lambda sig, stack: traceback.print_stack(stack))
函数listen的意思就是,对kill信号加入响应函数,然后在响应函数中打印当前的stacktrace。
因此在正式脚本里面,只要执行这段函数,然后在对进场发个SIGUSR1的信号,它就会将他当前正在执行的代码打印出来。
main.py
if __name__ == "__main__":
try:
import trace
trace.listen()
except:
pass
使用
kill -SIGUSR1 $PID