pycharm 调试器在“正在收集数据...”时超时

svgewumm  于 2023-02-08  发布在  PyCharm
关注(0)|答案(7)|浏览(541)

我正在Windows 10上使用PyCharm(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.o)调试Python(3.5)程序。

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

要显示的数据既不特殊,也不特别大,它在某种程度上可用于PyCharm,因为在所述数据的某些值上的条件断点工作正常(程序中断)--看起来只是为了显示(而不是操作目的)而收集数据的过程失败了。
当我在断点所在的位置附近单步执行函数时,它的数据会正确显示。当我在堆栈中向上移动(到调用函数,我从那里开始单步执行,并且在那里我最初希望有断点)时,我又被"收集数据"超时卡住了。
至少从2005年开始,就有很多问题提出了同样的观点。有些得到了修复,有些没有。修复通常是更新到最新版本(我有)。

    • 是否有一个大致的方向,以便修复或解决这类问题?**

编辑:一年后,问题仍然存在,在bug被提出后,开发人员/支持人员仍然没有任何React。

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

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

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

zhte4eai1#

我在使用SocketIO处理一个复杂的Flask项目时遇到了与Pycharm 2018.2相同的问题。
当我在代码中放置一个调试断点并按下调试按钮时,它在断点处停止,但变量没有加载。它只是无限地收集数据。我启用了Gevent兼容性,它解决了这个问题。下面是你可以找到设置的地方:

s6fujrry

s6fujrry2#

如果你登陆这里是因为你正在使用PyTorch(或任何其他深度学习库),并尝试在PyCharm(torch 1.31,PyCharm 2019.2)中调试,但它超级慢:
linkliu mayuyu 所指出的,在Python Debugger设置中启用Gevent compatible,问题可能是由于调试大型深度学习模型(我的例子是BERT transformer)引起的,但我不完全确定这一点。
我添加这个答案是因为它是2019年底,这个问题似乎还没有得到解决。此外,我认为这影响了许多使用深度学习的工程师,所以我希望我的答案格式触发他们的stackoverflow算法:-)

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

5w9g7ksd

5w9g7ksd3#

当我使用sympy和Python模块“莱亚”编写代码以计算概率分布时,我也遇到了这个问题。
我解决超时问题所采取的措施是将调试设置中的“变量加载策略”从默认的“异步”更改为“同步”。

41ik7eoe

41ik7eoe4#

我认为这是由于某些类的默认方法__str__()太冗长造成的。当遇到断点时,Pycharm调用该方法来显示局部变量,并且在加载字符串时卡住了。我用来克服这个问题的一个技巧是手动编辑导致错误的类,并将__str__()方法替换为不太冗长的方法。
例如,pytorch TensorBase类(以及扩展它的所有Tensor类)会发生这种情况,可以通过编辑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)中得到了解决,至少对于影响我的情况是这样。

5cg8jx4n

5cg8jx4n5#

我在尝试运行PyTorch编写的深度学习脚本时遇到了同样的问题(PyCharm 2019.3)。
我最终发现问题在于我将DataLoader中的num_workers设置为一个很大的值(在我的例子中是20)。
因此,在调试模式下,我建议将num_workers设置为1

c3frrgcw

c3frrgcw6#

对我来说,解决办法是每次在开始调试之前删除手动监视,如果在“变量”窗口中有任何现有的手动监视,那么它将停留在“收集数据..."。

pb3s4cty

pb3s4cty7#

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

上面的解决方案都不适合我,尽管我试过了。它通常工作,但saldomly给这个恼人的Collecting data...或有时Timed Out...
解决办法是重新启动Pycharm并设置尽可能少的断点。之后它又开始工作了。
我不知道是怎么做的(可能是断点太多),但它的工作。

相关问题