debugging 在pycharm或eclipse+pydev中的C线程中无法使用python断点

toe95027  于 2023-05-23  发布在  PyCharm
关注(0)|答案(2)|浏览(155)

我有一个使用C库的django应用程序(通过swig导入)。C库启动自己的线程,该线程在Python代码中调用回调。
我不能在Python代码中设置断点,无论是在PyDev还是PyCharm中。也尝试了“gevent兼容性”选项,但没有成功。
我验证了回调是正确调用的,因为logging.info转储了预期的内容。在其他线程中设置的断点工作正常。所以看起来python调试器无法管理python代码中的断点,这些断点是由非python代码中创建的线程调用的。
有谁知道变通办法吗?也许有一些'魔术'线程初始化序列,我可以使用?

l7wslrjt

l7wslrjt1#

您必须设置调试器机制,使其在非Python线程上工作(这是在创建Python线程时自动完成的,但是当你创建一个Python没有任何创建钩子的线程时,你必须自己做)--注意,对于一些框架--比如QThread/Gevent --事情是猴子补丁,这样我们就知道初始化并启动调试器,但对于其他框架,您必须自己完成。
要做到这一点,在启动线程后,你必须调用:

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

请注意,如果您输入了suspend=True,它将模拟一个手动断点,并将在代码的该点处停止。
对于现实世界的情况,如果你有一个回调函数,并且只有当前脚本中的那个函数被另一个程序(比如C++)中的另一个线程调用,那么你必须把调用放在函数内部,而不是在import语句之后调用它。关于example in PyTorch

lbsnaicq

lbsnaicq2#

这是@fabio-zadrozny回答的后续。
下面是我创建的一个mixin,我的类(从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)

相关问题