【问题标题】:gevent monkey-patching and breakpointsgevent猴子补丁和断点
【发布时间】:2012-07-14 18:32:09
【问题描述】:

我一直在玩 Gevent,我非常喜欢它。但是我遇到了一个问题。没有命中断点,并且调试不起作用(同时使用 Visual Studio Python 工具和 Eclipse PyDev)。这发生在调用 monkey.patch_all() 之后。

这对我来说是个大问题,不幸的是这是使用 gevent 的障碍。我发现了一个 few threads 似乎表明 gevent 会中断调试,但我想有一个解决方案。

有谁知道如何使调试和断点与 gevent 和猴子补丁一起工作?

【问题讨论】:

  • 好吧,为什么不像我们80年代那样使用“打印”?虽然这并不完全是您要寻找的东西,但它可能有助于修复一两个错误。

标签: python debugging pydev monkeypatching gevent


【解决方案1】:

pdb - The Python Debugger

import pdb
pdb.set_trace() # Place this where you want to drop into the python interpreter.

【讨论】:

    【解决方案2】:

    PyCharm IDE 解决了这个问题。设置配置标志后支持gevent代码调试:http://blog.jetbrains.com/pycharm/2012/08/gevent-debug-support/

    很遗憾,目前我还不知道有什么免费的工具可以调试 gevent。

    UPD:有!现在有一个社区版的 PyCharm。

    【讨论】:

    【解决方案3】:

    我目前使用 Pycharm 2.7.3,我也遇到了 gevent 0.13.8 破坏调试的问题。但是当我更新到gevent 1.0rc3 时,我发现我可以再次正确调试。


    旁注:

    我现在才知道 Jetbrains 有一个使用配置标志的解决方法。 当我需要使用以下 hack 进行调试时,我正在解决这个问题。老实说,我不知道它为什么起作用,也不知道负面后果是什么。我只是做了一些试验和错误,这恰好允许在使用 grequests 时进行调试。

    # overrides the monkeypatch issue which causes debugging in PyDev to not work.
    def patch_time():
        return
    import gevent.monkey
    gevent.monkey.patch_time = patch_time 
    import grequests
    

    【讨论】:

      【解决方案4】:

      最简单、最危险的解决方案是修改标准输入和标准输出:

      import gevent.monkey
      gevent.monkey.patch_all(sys=True)
      
      def my_app():
          # ... some code here
      
          import pdb
          pdb.set_trace()
      
          # ... some more code here
      
      my_app()
      

      这是非常危险的,因为你冒着 stdin/stdout 行为奇怪的风险 在您的应用程序生命周期的其余时间。

      相反,您可以使用我编写的库:gtools.pdb。它最小化 仅 pdb 提示的风险:

      def my_app():
          # ... some code here
      
          import gtools.pdb
          gtools.pdb.set_trace()
      
          # ... some more code here
      
      my_app()
      

      基本上,它的作用是告诉 pdb 使用非阻塞标准输入和标准输出 它的交互式提示。任何正在运行的 greenlets 仍将继续运行 在后台。

      如果你想避免依赖,你需要做的就是告诉 pdb 使用 一个 gevent 友好的标准输入和标准输出,如下所示:

      import sys
      from gevent.fileobject import FileObjectThread as File
      
      def Pdb():
          import pdb
          return pdb.Pdb(stdin=File(sys.stdin), stdout=File(sys.stdout))
      
      def my_app():
          # ... some code here
      
          Pdb().set_trace()
      
          # ... some more code here
      
      my_app()
      

      请注意,使用这些解决方案中的任何一个,您都会失去上键、下键 pdb 提示功能see gevent issue patching stdin/stdout

      【讨论】:

        【解决方案5】:

        在 VS Code 中调试时,

        我收到了这个错误:

        似乎正在使用 gevent 猴子补丁。请设置一个 环境变量:GEVENT_SUPPORT=True 启用 gevent 调试器中的支持。

        为此,在调试launch.json 设置中,我设置了以下内容:

        "env": {
            "GEVENT_SUPPORT": "True"
        },
        

        【讨论】:

          猜你喜欢
          • 2021-04-04
          • 2017-01-25
          • 1970-01-01
          • 2012-01-30
          • 2012-06-14
          • 1970-01-01
          • 1970-01-01
          • 2016-09-01
          • 2012-09-16
          相关资源
          最近更新 更多