我有一个Python应用程序,它不时卡住,我不知道在哪里。

是否有任何方法向Python解释器发出信号,以显示正在运行的确切代码?

某种飞行中的堆叠痕迹?

相关问题:

从Python代码中的方法打印当前调用堆栈 检查正在运行的进程正在做什么:打印未检测的Python程序的堆栈跟踪


当前回答

我是GDB阵营的python扩展。关注https://wiki.python.org/moin/DebuggingWithGdb,这意味着

DNF install GDB python-debuginfo或sudo apt-get install GDB python2.7-dbg GDB python <运行进程>的pid py-bt

同时考虑info threads和thread apply all py-bt。

其他回答

Pydb值得一看,它是“松散地基于gdb命令集的Python调试器的扩展版本”。它包括信号管理器,可以在发送指定信号时启动调试器。

2006年的“代码之夏”项目研究了在名为mpdb的模块中向pydb添加远程调试功能。

可以使用PuDB,这是一个带有curses接口的Python调试器。只需添加

from pudb import set_interrupt_handler; set_interrupt_handler()

到您的代码中,并在需要中断时使用Ctrl-C。你可以继续使用c,如果你错过了它,想要再试一次,你可以再次打破多次。

使用inspect模块。

进口检查 帮助(inspect.stack) 模块检查中的函数堆栈帮助:

堆栈(上下文= 1) 返回调用者帧上面堆栈的记录列表。

我发现它确实很有帮助。

您可以尝试faulthandler模块。使用pip Install faulthandler安装它,并添加:

import faulthandler, signal
faulthandler.register(signal.SIGUSR1)

在程序开始的时候。然后将SIGUSR1发送到进程(例如:kill -USR1 42),以显示所有线程的Python回溯到标准输出。阅读文档以获得更多选项(例如:登录到文件中)和其他显示回溯的方法。

该模块现在是Python 3.3的一部分。对于Python 2,请参见http://faulthandler.readthedocs.org/

如何调试任何函数在控制台:

创建使用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) 

愉快的调试:)