代码之家  ›  专栏  ›  技术社区  ›  Don Kirkby

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

  •  7
  • Don Kirkby  · 技术社区  · 15 年前

    我正在使用pydevforeclipse插件,并试图在后台线程中运行的一些代码中设置断点。即使代码正在执行,断点也不会被命中。下面是一个小例子:

    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.')
    

    该示例中的断点在主线程上调用时会被命中,但在从后台线程调用时不会被命中。我能做些什么吗?或者这是PyDev调试器的一个限制?

    更新

    PyDev feature request ,已完成。它应该与版本1.6.0一起发布。谢谢,PyDev团队!

    4 回复  |  直到 15 年前
        1
  •  9
  •   Community CDub    5 年前

    在您的示例中,您可以自己设置调试器跟踪函数(正如Alex所指出的)如下所示(如果您不在远程调试器中,则当前需要pydevd.connected=True——我将更改pydev,这样就不再需要它了)。您可能需要为pydevd导入添加try..except ImportError(如果未在调试器中运行,则会失败)

    def go(计数):

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

    现在,再考虑一下,我认为pydev可以替换线程模块中的start\u new\u thread方法,提供自己的函数,该函数将设置调试器,然后调用原始函数(刚刚完成了,它似乎正在工作,因此,如果您使用几个小时后可用的nightly,它将成为未来的1.6.0,它应该不做任何特殊的工作)。

        2
  •  4
  •   Alex Martelli    15 年前

    根本问题在于 sys.settrace

    调试器支持多线程,

    我相信在PyDev中设置断点时 settrace 调用总是发生在主线程上(我最近没有看过PyDev,所以他们可能已经添加了一些方法来解决这个问题,但是我不记得我看过的时候有过任何方法)。

    sys.gettrace 要获取PyDev的trace函数,请将其保存在全局变量中,并确保在所有感兴趣的线程中调用它 sys.settrace 以这个全局变量作为参数——有点麻烦(对于设置断点时已经存在的线程来说更是如此!),但我想不出更简单的选择。

        3
  •  2
  •   Community CDub    8 年前

    this question ,我找到了启动命令行调试器的方法:

    import pdb; pdb.set_trace()
    

        4
  •  1
  •   Kevin Parker    11 年前

    根据Fabio的一篇文章,在使用setTrace(“000.000.000.000”)设置跟踪之后,对我来说,这是有效的,其中0是运行Eclipse/PyDev的计算机的IP

    threading.settrace(pydevd.GetGlobalDebugger().trace_dispatch)