在pycharm或eclipse+;皮德夫 我有一个使用C++库(通过SWIG导入)的Django应用程序。 C++库启动自己的线程,调用python代码中的回调。
我无法在python代码中设置断点,无论是在PyDev还是PyCharm中。 还尝试了“gevent兼容性”选项,但没有成功 我验证了回调是否正确调用为logging.info转储预期值。在其他线程中设置的断点工作正常。因此,python调试器似乎无法管理由非python代码中创建的线程调用的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线程上工作(这是在创建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
类,但似乎没有任何效果。你能举一个更详细的例子说明如何使用它吗。谢谢