我有一个Python应用程序,它有时会卡住,我不知道在哪里.
有没有办法通知Python解释器向您显示正在运行的确切代码?
某种飞翔上的追踪?
Related questions:个
我有一个Python应用程序,它有时会卡住,我不知道在哪里.
有没有办法通知Python解释器向您显示正在运行的确切代码?
某种飞翔上的追踪?
Related questions:个
我有一个模块,我用来处理这样的情况-进程将运行很长时间,但有时会因为未知和不可重现的原因而停滞不前.它有点老套,只能在Unix上运行(需要信号):
import code, traceback, signal
def 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)
i = code.InteractiveConsole(d)
message = "Signal received : entering python shell.\nTraceback:\n"
message += ''.join(traceback.format_stack(frame))
i.interact(message)
def listen():
signal.signal(signal.SIGUSR1, debug) # Register handler
要使用它,只需在程序启动时调用listen()函数(您甚至可以将其粘贴在site.py中,让所有python程序都使用它),然后让它运行.在任何时候,都可以使用kill或python向进程发送SIGUSR1信号:
os.kill(pid, signal.SIGUSR1)
这将导致程序在当前的位置断开到python控制台,向您显示堆栈跟踪,并允许您操作变量.使用control-d(EOF)继续运行(不过请注意,您可能会在发送信号时中断任何I/O等,因此它不是完全非侵入性的.
我还有另一个脚本做同样的事情,只是它通过管道与正在运行的进程通信(允许调试后台进程等).在这里发布有点大,但我把它添加为python cookbook recipe.