gevent猴子补丁和断点
Posted
技术标签:
【中文标题】gevent猴子补丁和断点【英文标题】:gevent monkey-patching and breakpoints 【发布时间】:2012-07-14 18:32:09 【问题描述】:我一直在玩 Gevent,我非常喜欢它。但是我遇到了一个问题。没有命中断点,并且调试不起作用(同时使用 Visual Studio Python 工具和 Eclipse PyDev)。这发生在调用 monkey.patch_all()
之后。
这对我来说是个大问题,不幸的是这是使用 gevent 的障碍。我发现了一个 few threads 似乎表明 gevent 会中断调试,但我想有一个解决方案。
有谁知道如何使调试和断点与 gevent 和猴子补丁一起工作?
【问题讨论】:
好吧,为什么不像我们80年代那样使用“打印”?虽然这并不完全是您要寻找的东西,但它可能有助于修复一两个错误。 【参考方案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。
【讨论】:
因为即使在一年左右之后这些线程仍然有用... Jetbrains 现在提供免费的“社区”版本的 Pycharm --jetbrains.com/pycharm/download/index.html【参考方案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"
,
【讨论】:
以上是关于gevent猴子补丁和断点的主要内容,如果未能解决你的问题,请参考以下文章