关于调试:查看正在运行的Python程序的方法

Method to peek at a Python program running right now

是否可以在不中断的情况下找到有关当前运行的python程序正在做什么的任何信息?

另外,如果不可能的话,有没有可能让正在运行的python程序崩溃,这样我至少可以得到stacktrace(在Ubuntu上使用pydev)?

我知道我应该使用日志或者在调试模式下运行它,或者插入一条语句来运行调试程序…

相关问题

  • 从正在运行的python程序获取堆栈跟踪——非常相似,但更一般的是,这个问题是为了调试正在运行的python程序。


如果你放置

1
2
import code
code.interact(local=locals())

在脚本的任何一点上,Python都将在该点上实例化一个python shell,该shell在该点上可以访问脚本状态下的所有内容。^ d退出shell并在该点之后继续执行。

甚至可以从shell、调用函数等修改该点的状态。


如果您有一个运行中的python,它不是用任何类型的跟踪或日志机制构建的,并且您希望看到它在内部做什么,那么有两个选项:

  • 在Solaris或Mac上,如果使用系统提供的python,则使用dtrace

  • 使用gdb附加到正在运行的python进程,


要使具有stacktrace的python程序"崩溃",您可以发送sigint,即除非您捕获它或捕获keyboardinterrupt(默认情况下,python安装一个sigint处理程序,它会引发keyboardinterrupt)。

至于调试,Pydev是否有内置的调试支持(通过PDB)?


就个人而言,我更喜欢IPDB。这是PDB加上了IPython的优点。它看起来更像是一个交互式的Python解释器,有一些调试函数的快捷方式。


您可以使用lptrace。它就像用于Python程序的strace–它允许您附加到正在运行的Python进程,并打印它所做的每个函数调用。


如果您对崩溃感到满意,插入"1/0"将创建一个快速而脏的断点,并具有完整的回溯!


安装信号处理程序,该处理程序使用sys.settrace()设置跟踪函数,该函数打印跟踪并清除清除跟踪函数。这将允许您随时查看程序的位置,而不会中断程序。注意,该信号在每个sys.getcheckinterval()python指令之后处理。