调试一个 python 应用程序 "hangs"

Debugging a python application that just sort of "hangs"

我有一个事件驱动的应用程序,用 python 编写。一段时间后(通常 > 1 周)它似乎只是停止响应事件。发生这种情况时,我只需按 ctrl-C 并重新 运行,然后一切又好了。但是,这种情况不断发生有点烦人,我不知道是什么原因造成的。 有什么方法可以 运行 我的应用程序,当发生这种情况并且应用程序不再接受连接时,我可以进入调试器并查看它在做什么以及为什么它不接受连接?

我以前使用过pdb,但是我使用它的方式(if condition: pdb.set_trace())在这里并不适用,因为我不知道它在失败时在代码中做了什么。我的理想情况是代替 Ctrl-C,也许我按了 Ctrl-somethingelse,这会导致它停止并进入调试器。这种事情好办吗?

在您的情况下触发 pdb 可能并不简单。但是,每当我需要调试此类挂起时,我都会使用 dumpstacks() 函数检查进程中所有线程的 "snapshot" 回溯。

您可以使用计时器定期调用它并将输出打印到日志文件,并在您注意到挂起时参考它,或者利用一些 RPC 机制(例如信号)来触发您的函数调用按需处理。我通常做后者,因为我系统中的进程已经监听了这样的 RPC 请求(使用 rpyc)。