19

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

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

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

4

5 回答 5

9

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

不幸的是,目前我不知道能够调试 gevent 的免费工具。

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

于 2012-12-26T10:12:26.910 回答
4

pdb - Python 调试器

import pdb
pdb.set_trace() # Place this where you want to drop into the python interpreter.
于 2012-08-14T22:17:32.253 回答
1

在 VS Code 中调试时,

我收到了这个错误:

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

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

"env": {
    "GEVENT_SUPPORT": "True"
},
于 2021-10-27T14:31:42.343 回答
1

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

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()

这是非常危险的,因为您可能会在应用程序的剩余生命周期中以奇怪的方式表现标准输入/标准输出。

相反,您可以使用我编写的库: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()

请注意,使用这些解决方案中的任何一个,您都会松开 Key-up、Key-down pdb 提示设施,请参阅 gevent issue patching stdin/stdout

于 2018-03-17T20:13:42.760 回答
0

我目前使用 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
于 2013-11-01T15:54:24.347 回答