我有一个Python应用程序,它不时卡住,我不知道在哪里。
是否有任何方法向Python解释器发出信号,以显示正在运行的确切代码?
某种飞行中的堆叠痕迹?
相关问题:
从Python代码中的方法打印当前调用堆栈 检查正在运行的进程正在做什么:打印未检测的Python程序的堆栈跟踪
我有一个Python应用程序,它不时卡住,我不知道在哪里。
是否有任何方法向Python解释器发出信号,以显示正在运行的确切代码?
某种飞行中的堆叠痕迹?
相关问题:
从Python代码中的方法打印当前调用堆栈 检查正在运行的进程正在做什么:打印未检测的Python程序的堆栈跟踪
当前回答
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的指针。)
其他回答
如果您使用的是Linux系统,请使用出色的gdb和Python调试扩展(可以在Python -dbg或Python -debuginfo包中)。它还有助于多线程应用程序、GUI应用程序和C模块。
使用以下命令运行程序:
$ gdb -ex r --args python <programname>.py [arguments]
这指示gdb准备python <programname>.py <arguments>并运行它。
现在当你的程序挂起时,切换到gdb控制台,按Ctr+C并执行:
(gdb) thread apply all py-list
参见示例会话和更多信息在这里和这里。
可以使用PuDB,这是一个带有curses接口的Python调试器。只需添加
from pudb import set_interrupt_handler; set_interrupt_handler()
到您的代码中,并在需要中断时使用Ctrl-C。你可以继续使用c,如果你错过了它,想要再试一次,你可以再次打破多次。
Pyringe是一个调试器,可以与正在运行的python进程交互,打印堆栈跟踪,变量等,而不需要任何先验设置。
虽然我过去经常使用信号处理程序解决方案,但在某些环境中仍然很难重现这个问题。
Python -dv yourscript.py
这将使解释器以调试模式运行,并为您提供解释器正在做什么的跟踪。
如果你想交互调试代码,你应该像这样运行它:
Python -m PDB yourscript.py
它告诉python解释器使用模块“pdb”(python调试器)运行你的脚本,如果你这样运行它,解释器将以交互模式执行,很像GDB
如何调试任何函数在控制台:
创建使用pdb.set_trace()的函数,然后是要调试的函数。
>>> import pdb
>>> import my_function
>>> def f():
... pdb.set_trace()
... my_function()
...
然后调用创建的函数:
>>> f()
> <stdin>(3)f()
(Pdb) s
--Call--
> <stdin>(1)my_function()
(Pdb)
愉快的调试:)