Flavien
Flavien

Reputation: 8127

gevent monkey-patching and breakpoints

I have been playing with Gevent, and I like it a lot. However I have run into a problem. Breakpoint are not being hit, and debugging doesn't work (using both Visual Studio Python Tools and Eclipse PyDev). This happens after monkey.patch_all() is called.

This is a big problem for me, and unfortunately this is a blocker for the use of gevent. I have found a few threads that seem to indicate that gevent breaks debugging, but I would imagine there is a solution for that.

Does anyone know how to make debugging and breakpoints work with gevent and monkey patching?

Upvotes: 21

Views: 11122

Answers (5)

Wes
Wes

Reputation: 856

While debugging in VS Code,

I was getting this error:

It seems that the gevent monkey-patching is being used. Please set an environment variable with: GEVENT_SUPPORT=True to enable gevent support in the debugger.

To do this, in the debug launch.json settings, I set the following:

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

Upvotes: 4

Tiago Coutinho
Tiago Coutinho

Reputation: 1668

The simplest, most dangerous solution would be to monkey patch stdin and stdout:

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

This is quite dangerous since you risk stdin/stdout behaving in a strange way during the rest of your app lifetime.

Instead you can use a library that I wrote: gtools.pdb. It minimizes the risk to the pdb prompt only:

def my_app():
    # ... some code here

    import gtools.pdb
    gtools.pdb.set_trace()

    # ... some more code here

my_app()

Basically, what it does is tell pdb to use a non-blocking stdin and stdout for its interactive prompt. Any running greenlets will still continue to run in the background.

If you want to avoid the dependency, all you need to do is tell pdb to use a gevent friendly stdin and stdout with something like this:

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

Note that with any of these solutions, you loose Key-up, Key-down pdb prompt facilites see gevent issue patching stdin/stdout.

Upvotes: 1

Ellioh
Ellioh

Reputation: 5330

PyCharm IDE solves the problem. It supports gevent code debugging after you set a configuration flag: http://blog.jetbrains.com/pycharm/2012/08/gevent-debug-support/.

Unfortunately, at the moment I don't know a free tool capable of debugging gevent.

UPD: THERE IS! Now there is a community version of PyCharm.

Upvotes: 9

Marcel Wilson
Marcel Wilson

Reputation: 4572

I use Pycharm 2.7.3 currently and I too was having issues with gevent 0.13.8 breaking debugging. However when I updated to gevent 1.0rc3 I found I could debug again properly.


Sidenote:

I only just now learned that Jetbrains had a workaround with the config flag. I was getting around the problem when I needed to debug with the following hack. I honestly don't know why it worked nor what the negative consequences were. I just did a little trial and error and this happened to allow debugging to work when using 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

Upvotes: 0

Jason
Jason

Reputation: 373

pdb - The Python Debugger

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

Upvotes: 4

Related Questions