调试器在“收集数据…”时超时

85

我正在使用 Windows 10 上的 PyCharm (PyCharm Community Edition 2016.2.2;Build #PC-162.1812.1,构建于2016年8月16日;JRE:1.8.0_76-release-b216 x86;JVM:由 JetBrains s.r.o 提供的 OpenJDK Server VM) 调试一个 Python (3.5) 程序。

问题:在某些断点处停止时,调试器窗口会卡在“正在收集数据”的状态下,最终超时。

要显示的数据既不特殊也不是特别大。它在 PyCharm 中某种程度上是可用的,因为在一些数据的值上设置条件断点可以正常工作(程序会中断)——看起来只是为了显示而收集数据的过程失败了(与操作目的不同)。

当我进入到我设置断点的位置周围的一个函数时,它的数据被正确地显示出来了。当我返回到调用函数(我从哪里下来并且最初想设置断点的函数)时,我再次卡在“正在收集数据”的超时状态下。

至少自2005年以来,已经有许多类似的问题提出。一些已经修复了,一些没有。这些修复通常是更新到最新版本(我已经有最新版本了)。

是否有一般方向可以解决或者解决这类问题?


编辑:一年后,问题仍然存在,开发人员/支持人员在提出错误后仍然没有反应。


编辑于2018年4月:看起来问题已经在2018.1版本中得到了解决,下面的代码设置了一个断点在print行上时会挂起,现在已经可以正常工作(我可以看到变量):

import threading

def worker():
    a = 3
    print('hello')

threading.Thread(target=worker).start()

1
我遇到了完全相同的问题。你找到解决方法或者至少有解释了吗? - Josh
6
很遗憾,不行。我已向开发人员提交了一张工单,但他们没有任何反应(另一张工单也是同样的情况)。虽然产品很好,但支持简直是不存在的。 - WoJ
1
我正在Keras中拟合LSTM网络,当我尝试从调试器控制台执行'model.predict'时,出现了一些无意义的东西。当我使用前馈网络进行相同操作时,这种情况并没有发生。实际上,当不在调试器/控制台中运行代码时,它可以正常运行。这很奇怪也很烦人。 - Josh
当我使用大对象进行调试时,我也会遇到这个问题。还没有解决方法吗? - CamJohnson26
当我调试一个单独的进程时,我得到相同的结果。 - Lars
我在尝试查看一个变量时遇到了这个问题,当时在线程锁定ctx内部时出现问题,但在外部没有问题。 - amohr
7个回答

220

我在使用Pycharm 2018.2处理一个复杂的Flask项目中出现了同样的问题,该项目包含SocketIO。

当我在代码中放置一个调试断点并按下调试按钮时,它会停在断点处,但变量不会加载。它只是无限地收集数据。我启用了Gevent兼容性,问题得到了解决。这里是您可以找到设置的地方:

Image


9
如果你正在使用 Gevent,那么这确实可以解决它! - delucasvb
58
我正在使用带有 PyTorch(深度学习框架)的 PyCharm 2019.2,其中有非常大的(张量)对象,并遇到了相同的问题。我一直在苦思冥想和浪费时间,对于这个解决方案(启用“Gevent兼容”修复了调试器卡住的问题)非常感激! - neta777
7
调试PyTorch代码时遇到了同样的问题 - 这应该是正确的答案! - Colonder
1
太好了...这个问题让我准备放弃Pycharm,转而使用VS Code。 - kmiklas
5
各位,与其每个人都说谢谢,不如点赞第一个人的评论。这样做的意思是相同的,并且更加简洁 :) - Nagabhushan S N
显示剩余3条评论

46

如果你因为使用PyTorch(或其他任何深度学习库)并在PyCharm中尝试调试(我使用的是torch 1.31,PyCharm 2019.2),但速度非常慢,请开启Gevent兼容选项在Python Debugger设置中,正如linkliu mayuyu所指出的。这个问题可能是由于调试大型深度学习模型(在我这里是BERT transformer)导致的,但我并不确定。

我添加了这个答案,因为现在已经到了2019年底,但这个问题似乎还没有解决。此外,我认为这影响到许多使用深度学习的工程师,所以我希望我的答案格式可以触发他们的stackoverflow算法 :-)

注意(2020年6月):虽然添加Gevent兼容选项可以让你调试PyTorch模型,但它会阻止你在PyCharm中调试Flask应用程序!我的断点不再起作用了,花了我一段时间才发现这个标志是原因。因此,请确保仅在每个项目基础上启用它。


2
同时也对gensim有帮助。谢谢。 - A. Kali
请注意,这是在Python调试器下,而不仅仅是调试器。一度找不到与Gevent兼容的版本。 - illan
解决了问题!非常感谢。但是这跟PyTorch有什么关系呢? - SnzFor16Min
非常感谢。我已经努力解决这个问题将近一个星期了,而这个解决方案解决了我的问题。我使用了一个PyTorch的Docker容器作为解释器,在调试时遇到了困难。 - undefined

11
当我在使用 sympy 和 Python 模块 'Lea' 计算概率分布的代码时,也遇到了这个问题。为了解决超时问题,我采取的措施是将调试设置中的 'Variables Loading Policy' 从默认值 'Asynchronously' 更改为 'Synchronously'。
调试变量加载策略设置Debug Variables Loading Policy setting

谢谢!这正是我在寻找的东西。 - Manel B
3
在我的情况下,我需要将其设置为“按需”来解决问题。我有许多包含非常大的Pandas数据帧的变量,每个变量的渲染可能需要10秒钟左右。有时调试器会尝试渲染许多变量,并在很长一段时间内卡住。 - David Parks
谢谢,这解决了我的问题! - Nicola
2023年1月2日对我来说没有任何影响,无论是同步、异步还是按需设置。不过,Gevent的解决方案确实有效。 - illan

7

当我尝试运行用PyTorch编写的一些深度学习脚本时(使用PyCharm 2019.3),我遇到了同样的问题。

最终我发现问题是我将DataLoader中的num_workers设置为很大的值(在我的情况下是20)所致。

因此,在调试模式下,建议将num_workers设置为1


1
num_workers1设置为0在这里对我起作用了。 我猜,调试线程在工作线程上没有访问权限。 - phi

5
我认为这是因为一些类具有默认方法__str__(),它太冗长了。当Pycharm遇到断点时,会调用此方法显示本地变量,并在加载字符串时卡住。 我使用的一个技巧是手动编辑导致错误的类,并将__str__()方法替换为更简洁的内容。
例如,对于pytorch _TensorBase类(以及所有扩展它的张量类),会发生这种情况,可以通过编辑pytorch源代码torch/tensor.py来解决,将__str__()方法更改为:
def __str__(self):
        # All strings are unicode in Python 3, while we have to encode unicode
        # strings in Python2. If we can't, let python decide the best
        # characters to replace unicode characters with.
        return str() + ' Use .numpy() to print'
        #if sys.version_info > (3,):
        #    return _tensor_str._str(self)
        #else:
        #    if hasattr(sys.stdout, 'encoding'):
        #        return _tensor_str._str(self).encode(
        #            sys.stdout.encoding or 'UTF-8', 'replace')
        #    else:
        #        return _tensor_str._str(self).encode('UTF-8', 'replace')

远非最佳,但派上用场。

更新:在最新的PyCharm版本(2018.1)中,错误似乎已经得到解决,至少对于影响我的情况是如此。


这是很好的信息,但在我的情况下,是我的自己的代码卡住了(也没有类)。这通常发生在调试多进程程序时。 - WoJ
谢谢提醒。我使用了多线程代码进行了检查,问题似乎已经解决了(我在问题的编辑中添加了一个示例代码)。 - WoJ

2

对于我来说,解决方案是在开始调试之前删除所有手动监视器。如果“变量”窗口中存在任何手动监视器,则会一直停留在“正在收集数据...”状态。


1

使用Odoo或其他大型Python服务器

尽管我已经尝试了所有的解决方案,但以上任何一个都没有奏效。 通常情况下可以正常工作,但有时会出现令人烦恼的收集数据...,或者有时是超时...

解决方法是重新启动Pycharm,并尽可能设置较少的断点。这样之后,它就会再次开始工作。

我不知道为什么会出现这种情况(也许太多断点了),但是这个方法行得通。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接