升级到PyCharm 2016.2后,调试器中的BlockingSwitchOutError

时间:2016-07-25 01:46:49

标签: python debugging pycharm

从PyCharm 2016.1.4升级到2016.2后,当运行调试器并设置任何断点时,PyCharm会在我没有设置断点的各个地方停止,并将其记录到stderr:

Traceback (most recent call last):
  File "/usr/local/pycharm/debug-eggs/pycharm-debug.egg/_pydevd_bundle/pydevd_frame.py", line 539, in trace_dispatch
    self.do_wait_suspend(thread, frame, event, arg)
  File "/usr/local/pycharm/debug-eggs/pycharm-debug.egg/_pydevd_bundle/pydevd_frame.py", line 71, in do_wait_suspend
    self._args[0].do_wait_suspend(*args, **kwargs)
  File "/usr/local/pycharm/debug-eggs/pycharm-debug.egg/pydevd.py", line 714, in do_wait_suspend
    time.sleep(0.01)
  File "/home/jaza/mypyapp/mypyfile.py", line 999, in mypyfunc
    gevent.sleep(seconds)
  File "/usr/local/lib/python2.7/dist-packages/gevent/hub.py", line 194, in sleep
    hub.wait(loop.timer(seconds, ref=ref))
  File "/usr/local/lib/python2.7/dist-packages/gevent/hub.py", line 630, in wait
    result = waiter.get()
  File "/usr/local/lib/python2.7/dist-packages/gevent/hub.py", line 878, in get
    return self.hub.switch()
  File "/usr/local/lib/python2.7/dist-packages/gevent/hub.py", line 608, in switch
    switch_out()
  File "/usr/local/lib/python2.7/dist-packages/gevent/hub.py", line 612, in switch_out
    raise BlockingSwitchOutError('Impossible to call blocking function in the event loop callback')
BlockingSwitchOutError: Impossible to call blocking function in the event loop callback
操作系统:Linux Mint 17.3(即几乎与Ubuntu 14.04相同)。使用最新的gevent(1.1.2)。

如果我打开旧的PyCharm(即2016.1.4),并执行相同的操作 - 即启动调试器,设置断点,运行我的应用程序 - 我不会收到这些错误,并且PyCharm没有&#39 ; t除了在我的断点处停止代码中的任何地方。

我还试过降级"降级"调试器,通过重命名debug-eggs目录并将其替换为旧的debug-eggs路径的符号链接,然后在最新版本上运行其余的PyCharm。这并没有解决问题,即它仍然导致BlockingSwitchOutError被多次引发。

似乎这可能是PyCharm 2016.2中的一个错误。我已经向JetBrains提交了一份错误报告,请参阅https://youtrack.jetbrains.com/issue/PY-20183。但是也可以在SO上发布,以防有​​人看到我的应用程序中的代码出现问题(使用gevent.sleep(seconds)?),这意味着代码之前就已经运行了,但迟早会破解。

1 个答案:

答案 0 :(得分:3)

Elizaveta Shashkova在https://youtrack.jetbrains.com/issue/PY-20183的PyCharm问题跟踪器上发布的解决方案为我工作:

  

新功能出现在PyCharm中:断点线程挂起策略。你应该去Run |查看断点,选择断点并更改其线程挂起策略:“Thread”或“All”。您还可以为所有断点设置默认策略。

将暂停策略从“全部”更改为“线程”后,调试器不再在我的断点之外突破,也不会抛出BlockingSwitchOutError

而且,重新:

  

你也开启了“gevent compatible”设置吗? https://www.jetbrains.com/help/pycharm/2016.1/python-debugger.html

不,我没有开启此功能,我修正了我的问题而没有打开它。但如果我将来遇到类似的问题,我会尝试启用它。