调试器在"收集数据......"时超时

WoJ*_*WoJ 11 python debugging pycharm python-3.x python-3.5

我正在3.5使用PyCharm Community Edition 2016.2.2 ; Build #PC-162.1812.1, built on August 16, 2016 ; JRE: 1.8.0_76-release-b216 x86 ; JVM: OpenJDK Server VM by JetBrains s.r.oWindows 10上的PyCharm()调试Python()程序.

问题:当在某些断点处停止时,调试器窗口停留在"收集数据",最终超时.(无法显示帧变量)

要显示的数据既不特殊,也不特别大.它以某种方式可用于PyCharm,因为所述数据的某些值的条件断点工作正常(程序中断) - 看起来收集它仅用于显示(与操作目的相反)的过程失败.

当我进入我的断点周围的函数时,它的数据显示正确.当我向上移动堆栈(到调用函数,我从那里退出的那个以及我最初想要断点的那个)时 - 我再次陷入"收集数据"超时.

至少自2005年以来,出现了许多同样问题.一些是固定的,一些不是.修复通常是对最新版本的更新(我有).

我是否可以采取一般方向来解决或解决这一系列问题?


编辑:一年后,问题仍然存在,并且在bug被提出之后仍然没有来自开发者/支持者的反应.


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

import threading

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

threading.Thread(target=worker).start()
Run Code Online (Sandbox Code Playgroud)

u_b*_*u_b 25

万一您登陆这里是因为您使用PyTorch(或任何其他深度学习库)并尝试在PyCharm (在我的情况下为 Torch 1.31,PyCharm 2019.2)中进行调试,但速度非常慢:

linkliu mayuyu指出的那样Gevent compatiblePython Debugger设置中启用。该问题可能是由于调试大型深度学习模型(在我的情况下为 BERT 转换器)引起的,但我对此并不完全确定。

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

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

  • 对 gensim 也有帮助。谢谢 (2认同)

小智 21

使用pycharm2018.2调试Web应用程序时遇到相同的问题。

该项目是与SocketIO结合的复杂的Flask Web服务器。

当我在代码中创建调试断点,然后按调试按钮时,它在断点处停止,但未加载变量。它只是收集数据数据。最后,我对调试器设置进行了一些调整,使它可以工作。请参见下图以更改设置:

图片

  • 伙计们,与其每个人都说谢谢,不如为第一个投票。这一切都意味着相同,但混乱程度要少得多:) (5认同)
  • 我正在将PyCharm 2019.2与PyTorch(一个DL框架)一起使用,它具有非常大的(张量)对象,并且存在相同的问题。我一直在动脑筋,浪费时间,非常感谢这种解决方案(启用“与Gevent兼容”修复了调试器挂断)! (3认同)
  • 调试 PyTorch 代码时遇到同样的问题 - 这应该是正确的答案! (3认同)
  • 这解决了 PyTorch 代码的问题,这确实应该是正确的答案。 (3认同)
  • 如果您使用的是Gevent,则确实可以解决该问题! (2认同)

小智 7

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

我终于发现问题是我设置num_workersDataLoader一个很大的值(在我的例子中20)。

所以,在调试模式下,我建议设置num_workers1.


Man*_*l B 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')
Run Code Online (Sandbox Code Playgroud)

远非最佳,但已经到手了。

更新:该错误似乎在最新的 PyCharm 版本(2018.1)中得到了解决,至少对于影响我的情况来说是这样。


Ton*_*y P 5

当我使用 sympy 和旨在计算概率分布的 Python 模块“Lea”处理代码时,我也遇到了这个问题。

我为解决超时问题而采取的措施是将调试设置中的“变量加载策略”从默认的“异步”更改为“同步”。

调试变量加载策略设置

  • 就我而言,我需要将其设置为“按需”来解决问题。我有许多带有不同大 pandas 数据帧的变量,每个变量可能需要 10 秒才能在调试器中渲染。有时,调试器会尝试渲染许多变量,但会永远陷入困境。 (3认同)