调试:如何检查我的Python程序挂在哪里?

mie*_*nik 5 python debugging trace

我编写的一个相当大的Python程序可以运行,但是有时,在运行几分钟或几小时后,在不容易再现的瞬间,它会挂起并且不输出任何信息到屏幕上。

我当时不知道它在做什么,它在代码的哪一部分。

如何在调试器或其他工具中运行此程序,以查看程序在挂起时正在执行哪些代码行?

它太大,无法在各处放置“打印”语句。

我做了:

python -m trace --trace /usr/local/bin/my_program.py
Run Code Online (Sandbox Code Playgroud)

但这给了我很多输出,我什至看不到任何东西,只有几百万行在屏幕上滚动。

最好的情况是,我可以使用“ kill -SIGUSR1”或类似的命令向程序发送一些信号,然后程序会进入调试器并向我显示它停止的那一行,并可能允许我逐步执行该程序,然后。

我试过了:

pdb usr/local/bin/my_program.py
Run Code Online (Sandbox Code Playgroud)

然后:

(Pdb) cont
Run Code Online (Sandbox Code Playgroud)

但是当挂起时我该怎么做呢?它不会引发异常,就像它在等待某些东西一样,可能处于无限循环中。

更详细一点:当程序挂起时,我按^ C键,然后(不确定是否有必要),该程序正常运行(不引发任何异常,并且在屏幕上没有提示我为什么停止)。

Pat*_*ick 5

这对您可能有用。 我通常会

>>> import pdb
>>> import program2debug
>>> pdb.run('program2debug.test()')
Run Code Online (Sandbox Code Playgroud)

我通常会在-v程序中添加一个选项,从而启用大量的打印语句来详细说明我在做什么。将来编写程序时,请考虑先做同样的事情,然后再增加数千行。

  • @miernik:我认为您需要将程序的主体代码放在一个名为`test()`的函数中,以实现@Patrick建议的功能。 (2认同)
  • @miernik:这就是为什么人们会执行if if __name__ =='__main__':main()`...这样可以确保将程序作为模块导入时不会立即执行的原因。当然,您也可以调用方法test()而不是main,这没关系。 (2认同)