调试随机挂起并使用100%处理器核心的Python脚本

时间:2013-06-03 21:15:43

标签: python multithreading debugging

我目前正在开发一个相当复杂的多线程Python脚本。有一个主要功能一次在大约5个线程中运行。我一直有一些问题,它悬挂并使用它运行的100%处理器核心。在主函数运行数百次之后发生这种挂起,因此很难确切地确定它发生的确切时间和位置。程序挂起后,它永远不会再次开始运行。

似乎只有一个线程一次挂起,所以我真的不明白为什么它会挂起整个程序。那时我发现this Stack Overflow solution解释说,“在一些Python实现中,一次只能执行一个Python线程.CPython中的线程只对多路复用IO操作非常有用,而不是将CPU密集型任务放在后台“。因此,当一个线程以完全CPU使用率挂起时,整个程序可以理解地停止。

下面是程序挂起时Process Explorer的python.exe进程视图的屏幕截图。如您所见,只有一个线程实际上正在做某事。

Process Manager screenshot

我希望能够准确分析脚本挂起之前执行的行。我真的不知道在哪里可以使用“import pdb; pdb.set_trace()”插入断点,因为我不知道它什么时候或哪里搞砸了。我不能手动单步执行该程序,因为它需要30分钟到几个小时的运行才能挂起。我试着通过我的脚本查找任何明显的无限循环可能会导致或类似的东西,但我似乎无法弄清楚导致挂起的原因。

我的问题是:我该如何调试呢?理想情况下,我希望看到它在挂起之前执行了哪些行,但我甚至不知道如何检测它何时挂起。我不能在这里发布完整的脚本,所以希望有人知道如何调试这个。提前谢谢。

2 个答案:

答案 0 :(得分:1)

这可能有助于src https://softwareengineering.stackexchange.com/questions/126940/debug-multiprocessing-in-python

import multiprocessing, logging
logger = multiprocessing.log_to_stderr()
logger.setLevel(multiprocessing.SUBDEBUG)

答案 1 :(得分:0)

你可以试试来自Sys Internals的procmon,看看你的进程在系统调用级别正在做什么。

您还可以尝试使用调试器进行附加,并查看有关为每个线程获取回溯的信息。我不确定gdb在Windows上运行得有多好,但这就是我过去在* ix上使用的内容。您有时可以看到Python调用堆栈,即使您使用http://svn.python.org/projects/python/trunk/Misc/gdbinit

之类的东西附加到C程序(cpython解释器)

pdb可能是比gdb更好的选择,但我没有使用pdb。