Morse Code

python打印stacktrace

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