Issue
I have a django application using a C++ library (imported via swig). The C++ library launches own thread which calls callbacks in Python code.
I cannot setup a breakpoint in python code, neither in PyDev nor PyCharm. Tried also 'gevent compatibility' option too with no luck.
I verified the callbacks are properly called as logging.info dumps what expected. Breakpoints set in other threads work fine. So it seems that python debuggers cannot manage breakpoints in python code called by threads created in non-python code.
Does anyone know a workaround? Maybe there is some 'magic' thread initialization sequence I could use?
Solution
You have to setup the debugger machinery for it to work on non-python threads (this is done automatically when a Python thread is created, but when you create a thread for which Python doesn't have any creation hook, you have to do it yourself) -- note that for some frameworks -- such as QThread/Gevent -- things are monkey patched so that we know about the initialization and start the debugger, but for other frameworks you have to do it yourself.
To do that, after starting the thread you have to call:
import pydevd
pydevd.settrace(suspend=False, trace_only_current_thread=True)
Note that if you had put suspend=True
, it'd simulate a manual breakpoint and would stop at that point of the code.
For a real-world case, if you have a callback function and that only that function in your current script is called by another thread from another program, say C++, then you will have to put the call inside the function instead of calling it right after the import
statement. See here about this example in PyTorch.
Answered By - Fabio Zadrozny
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.