我可以在Python中的后台线程上放置断点吗?

Don*_*kby 7 python eclipse debugging breakpoints pydev

我正在使用PyDev for Eclipse插件,我试图在一些代码中设置一个断点,该代码在后台线程中运行.即使代码正在执行,断点也永远不会被击中.这是一个小例子:

import thread

def go(count):
    print 'count is %d.' % count # set break point here

print 'calling from main thread:'
go(13)
print 'calling from bg thread:'
thread.start_new_thread(go, (23,))

raw_input('press enter to quit.')
Run Code Online (Sandbox Code Playgroud)

该示例中的断点在主线程上调用时会被触发,但在从后台线程调用时则不会.有什么我可以做的,或者是PyDev调试器的限制?

更新

谢谢你的工作.我提交了一个PyDev功能请求,它已经完成.它应该与1.6.0版一起发布.谢谢,PyDev团队!

Fab*_*zny 6

问题是线程模块中没有API来知道线程何时启动.

您在示例中可以做的是自己设置调试器跟踪功能(如Alex指出的那样),如下面的代码所示(如果您不在远程调试器中,则目前需要pydevd.connected = True - 我将更改pydev所以不再需要它了.您可能希望为pydevd导入添加try..except ImportError(如果您未在调试器中运行,则会失败)

def go(count):

   import pydevd
   pydevd.connected = True
   pydevd.settrace(suspend=False)
   print 'count is %d.' % count # set break point here
Run Code Online (Sandbox Code Playgroud)

现在,第二个想法,我认为pydev可以替换线程模块中的start_new_thread方法,提供自己的函数,它将设置调试器,然后调用原始函数(只是这样做,它似乎工作,所以,如果你使用将在几个小时内可用的夜间,这将成为未来1.6.0,它应该工作而不做任何特殊的事情).

  • 令人惊讶的是,我在pydev 2.6中遇到了同样的问题.我有一个GUI应用程序,其中类A启动类B(QtCore.QThread),并且调试器不会在B方法中停止,同时执行代码.如果我试图进入b.start()调用调试器将我发送到"__main__"结构的末尾 (3认同)