2013-04-04 71 views
2

我想调试一个使用pynetdicom库的应用程序。我不确定这些具体细节的相关程度如何,但与此相关的是,它大量使用多线程来运行后台套接字侦听器任务而不阻塞主线程。 storescp.py示例可用于重现此操作。pydev多线程调试

每当我把那个被遇到的(不管是什么主题,主要还是孩子时,它会遇到),我得到以下回溯断点:

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的直接实例(在这种情况下,工作者是class Association(threading.Thread):)。

当然,我不太了解PyDev以确认这个理论,否则就修复它。互联网似乎也不是。

子类化Thread很少使用一种模式,它在PyDev体系结构中根本不被考虑?如果不重新设计图书馆,这个问题如何解决?

回答

2

我只需要在追踪时更加努力。

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的公司的monkeypatching一成不变的生活(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__应该如果所查询的属性没有按不存在。