【问题标题】:pydev multithread debuggingpydev 多线程调试
【发布时间】:2013-04-04 15:54:43
【问题描述】:

我正在尝试调试一个使用 pynetdicom 库的应用程序。我不确定该具体细节有多相关,但是相关的是它大量使用多线程来运行后台套接字侦听器任务而不会阻塞主线程。可以使用storescp.py 示例来重现这一点。

每当我放置遇到的断点时(无论遇到什么线程、主线程或子线程),我都会得到以下回溯:

Traceback (most recent call last):
  File "/Applications/Aptana Studio 3/plugins/org.python.pydev_2.7.0.2013012902/pysrc/pydevd.py", line 1397, in <module>
    debugger.run(setup['file'], None, None)
  File "/Applications/Aptana Studio 3/plugins/org.python.pydev_2.7.0.2013012902/pysrc/pydevd.py", line 1090, in run
    pydev_imports.execfile(file, globals, locals) #execute the script
  File "/Users/alexw/Development/Python/kreport2/KReport2/dicomdatascraper.py", line 183, in <module>
    oldDicomList = copy.copy(newData)
  File "/Users/alexw/Development/Python/kreport2/KReport2/dicomdatascraper.py", line 183, in <module>
    oldDicomList = copy.copy(newData)
  File "/Applications/Aptana Studio 3/plugins/org.python.pydev_2.7.0.2013012902/pysrc/pydevd_frame.py", line 135, in trace_dispatch
    self.doWaitSuspend(thread, frame, event, arg)
  File "/Applications/Aptana Studio 3/plugins/org.python.pydev_2.7.0.2013012902/pysrc/pydevd_frame.py", line 25, in doWaitSuspend
    self._args[0].doWaitSuspend(*args, **kwargs)
  File "/Applications/Aptana Studio 3/plugins/org.python.pydev_2.7.0.2013012902/pysrc/pydevd.py", line 832, in doWaitSuspend
    self.processInternalCommands()
  File "/Applications/Aptana Studio 3/plugins/org.python.pydev_2.7.0.2013012902/pysrc/pydevd.py", line 360, in processInternalCommands
    thread_id = GetThreadId(t)
  File "/Applications/Aptana Studio 3/plugins/org.python.pydev_2.7.0.2013012902/pysrc/pydevd_constants.py", line 140, in GetThreadId
    return thread.__pydevd_id__
  File "/Users/alexw/.virtualenvs/kreport2dev/devlibs/pynetdicom/source/netdicom/applicationentity.py", line 73, in __getattr__
    obj = eval(attr)()
  File "<string>", line 1, in <module>
NameError: name '__pydevd_id__' is not defined

我的想法是,也许,为了使事情正常进行,PyDev 将 __pydevd_id__ 修补到派生线程中,但是未能将它们修补到 这些 线程中,因为它们实际上是,子类而不是threading.Thread 的直接实例(在这种情况下,worker 是class Association(threading.Thread): 的实例)。

当然,我对 PyDev 的了解还不够好,无法证实这个理论,或者修复它。互联网似乎也没有。

子类化Thread 是不是很少使用一种在 PyDev 架构中根本不考虑的模式?如果不重新设计库,如何解决这个问题?

【问题讨论】:

    标签: python pydev


    【解决方案1】:

    我只是需要更仔细地查看那个回溯。

    pynetdicom 库,在其 threading.Thread 的子类中,覆盖了 __getattr__ 并在某种程度上破坏了它。问题是:

    def __getattr__(self, attr):
        #while not self.AssociationEstablished:
        #    time.sleep(0.001)
        obj = eval(attr)
    
        # do some stuff
    
        return obj
    

    当传递不存在的属性时,会引发 NameError。这不会被 pydev 的猴子补丁程序 (if thread.__pydevd_id__ raises AttributeError, thread.__pydevd_id__ = stuff) 捕获

    解决方案是这样更新该部分:

    def __getattr__(self, attr):
        #while not self.AssociationEstablished:
        #    time.sleep(0.001)
        try:
            obj = eval(attr)
        except NameError:
            raise AttributeError
    
        # do some stuff
    
        return obj
    

    这会拦截 NameError 并改为引发 AttributeError,如果查询的属性不存在,__getattr__ 应该这样做。

    【讨论】:

      猜你喜欢
      • 2013-04-03
      • 2011-10-07
      • 2020-01-08
      • 1970-01-01
      • 2010-10-28
      • 2017-05-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多