Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在pycharm或eclipse+;皮德夫 我有一个使用C++库(通过SWIG导入)的Django应用程序。 C++库启动自己的线程,调用python代码中的回调。_Eclipse_Multithreading_Debugging_Pycharm_Pydev - Fatal编程技术网

在pycharm或eclipse+;皮德夫 我有一个使用C++库(通过SWIG导入)的Django应用程序。 C++库启动自己的线程,调用python代码中的回调。

在pycharm或eclipse+;皮德夫 我有一个使用C++库(通过SWIG导入)的Django应用程序。 C++库启动自己的线程,调用python代码中的回调。,eclipse,multithreading,debugging,pycharm,pydev,Eclipse,Multithreading,Debugging,Pycharm,Pydev,我无法在python代码中设置断点,无论是在PyDev还是PyCharm中。 还尝试了“gevent兼容性”选项,但没有成功 我验证了回调是否正确调用为logging.info转储预期值。在其他线程中设置的断点工作正常。因此,python调试器似乎无法管理由非python代码中创建的线程调用的python代码中的断点 有人知道解决方法吗?也许我可以使用一些“神奇的”线程初始化序列?您必须设置调试器机制,使其在非python线程上工作(这是在创建python线程时自动完成的,但当您创建python

我无法在python代码中设置断点,无论是在PyDev还是PyCharm中。 还尝试了“gevent兼容性”选项,但没有成功

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


有人知道解决方法吗?也许我可以使用一些“神奇的”线程初始化序列?

您必须设置调试器机制,使其在非python线程上工作(这是在创建python线程时自动完成的,但当您创建python没有任何创建挂钩的线程时,您必须自己完成)--请注意,对于某些框架(如QThread/Gevent),事情是经过猴子补丁的,以便我们了解初始化并启动调试器,但对于其他框架,您必须自己完成

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

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

请注意,如果您将
suspend=True
,它将模拟一个手动断点,并将在代码的该点停止。

这是@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)

谢谢你@Fabio Zadrozny!工作完美无瑕。因为我的回调是方法,所以我刚刚创建了一个元类,用初始化来包装它们。谢谢!也适用于pycharm 2016.2:)(只是我必须“pip安装pydevd”)很抱歉,但我不确定该如何使用此代码。这是否意味着我必须在我希望中断调试的位置放置一行pydevd.settrace(suspend=true…)?如果是这样的话,这是否意味着我必须修改源代码(这对于调试体验来说不是很方便),并且诸如条件断点之类的功能将不起作用?请注意,在Python3.7以后的版本中(如果您有pydevd编译的扩展),这不再需要。但是,如果您使用的是旧版本或没有编译的扩展名,那么您需要为每个线程添加一次调用,以便跟踪线程并使用断点。@FabioZadrozny感谢您的回复。我问这个问题是因为我遇到了这个问题,它确实是一个Py3.7环境。那么,你知道它是否应该在这个设置中工作(你7,在C++线程中初始化的回调)?实际上,我可以通过放置一行“breakpoint()”使其停止,但正如我提到的,这不是一种方便的调试方式。因为我需要修改源代码,并且无法创建条件断点,所以我正在使用
python fuse
编写一个FS。我在用PyCharm。我的断点没有被击中。我试图在我的代码中加入你的
TracingMixing
类,但似乎没有任何效果。你能举一个更详细的例子说明如何使用它吗。谢谢