在 pycharm 或 eclipse+pydev 中的 C 线程中不工作 python 断点

Not working python breakpoints in C thread in pycharm or eclipse+pydev

我有一个使用 C++ 库的 django 应用程序(通过 swig 导入)。 C++ 库启动自己的线程,该线程调用 Python 代码中的回调。

我无法在 python 代码中设置断点,无论是在 PyDev 还是 PyCharm 中。 也尝试了 'gevent compatibility' 选项,但没有成功。

我验证了回调被正确调用,因为 logging.info 转储了预期的内容。在其他线程中设置的断点工作正常。因此,似乎 python 调试器无法管理非 python 代码中创建的线程调用的 python 代码中的断点。

有人知道解决方法吗?也许我可以使用一些 'magic' 线程初始化序列?

您必须设置调试器机制以使其在非 python 线程上工作(这是在创建 Python 线程时自动完成的,但是当您为其创建线程时 Python 没有任何创建挂钩,你必须自己做) -- 注意对于某些框架 -- 例如 QThread/Gevent -- 事情是猴子修补的,所以我们知道初始化和开始调试器,但对于其他框架,您必须自己完成。

为此,在启动线程后您必须调用:

import pydevd
pydevd.settrace(suspend=False, trace_only_current_thread=True)

请注意,如果您放置了 suspend=True,它会模拟一个手动断点并会在代码的那个点停止。

这是@fabio-zadrozny 回答的后续。

这是我创建的一个 mixin,我的 class(它从 C 线程获取回调)继承自。

class TracingMixing(object):
    """The callbacks in the FUSE Filesystem are C threads and breakpoints don't work normally.
       This mixin adds callbacks to every function call so that we can breakpoint them."""

    def __call__(self, op, path, *args):
        pydevd.settrace(suspend=False, trace_only_current_thread=True, patch_multiprocessing=True)
        return getattr(self, op)(path, *args)