我有一个Python应用程序,它不时卡住,我不知道在哪里。
是否有任何方法向Python解释器发出信号,以显示正在运行的确切代码?
某种飞行中的堆叠痕迹?
相关问题:
从Python代码中的方法打印当前调用堆栈 检查正在运行的进程正在做什么:打印未检测的Python程序的堆栈跟踪
我有一个Python应用程序,它不时卡住,我不知道在哪里。
是否有任何方法向Python解释器发出信号,以显示正在运行的确切代码?
某种飞行中的堆叠痕迹?
相关问题:
从Python代码中的方法打印当前调用堆栈 检查正在运行的进程正在做什么:打印未检测的Python程序的堆栈跟踪
当前回答
使用inspect模块。
进口检查 帮助(inspect.stack) 模块检查中的函数堆栈帮助:
堆栈(上下文= 1) 返回调用者帧上面堆栈的记录列表。
我发现它确实很有帮助。
其他回答
可以使用PuDB,这是一个带有curses接口的Python调试器。只需添加
from pudb import set_interrupt_handler; set_interrupt_handler()
到您的代码中,并在需要中断时使用Ctrl-C。你可以继续使用c,如果你错过了它,想要再试一次,你可以再次打破多次。
Python -dv yourscript.py
这将使解释器以调试模式运行,并为您提供解释器正在做什么的跟踪。
如果你想交互调试代码,你应该像这样运行它:
Python -m PDB yourscript.py
它告诉python解释器使用模块“pdb”(python调试器)运行你的脚本,如果你这样运行它,解释器将以交互模式执行,很像GDB
pyrasite可以在没有调试符号的情况下,在常规python中运行一个未准备好的python程序,从而获得该程序的堆栈跟踪。在Ubuntu Trusty上对我来说很有魅力:
$ sudo pip install pyrasite
$ echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
$ sudo pyrasite 16262 dump_stacks.py # dumps stacks to stdout/stderr of the python program
(向@Albert致敬,在其他工具中,他的回答包含指向this的指针。)
我想对haridsv的回答加一个评论,但我缺乏这样做的声誉:
我们中的一些人仍然停留在2.6以上的Python版本(thread .ident需要),所以我让代码在Python 2.5中工作(尽管没有显示线程名称):
import traceback
import sys
def dumpstacks(signal, frame):
code = []
for threadId, stack in sys._current_frames().items():
code.append("\n# Thread: %d" % (threadId))
for filename, lineno, name, line in traceback.extract_stack(stack):
code.append('File: "%s", line %d, in %s' % (filename, lineno, name))
if line:
code.append(" %s" % (line.strip()))
print "\n".join(code)
import signal
signal.signal(signal.SIGQUIT, dumpstacks)
没有办法钩入正在运行的python进程并获得合理的结果。如果进程锁定,我所做的是连接strace并试图弄清楚到底发生了什么。
不幸的是,strace通常是“修复”竞争条件的观察器,因此输出在那里也是无用的。