首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pydev多线程调试

pydev多线程调试
EN

Stack Overflow用户
提问于 2013-04-04 07:14:05
回答 1查看 1.2K关注 0票数 3

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

每当我放置遇到的断点(不管哪个线程、main或子线程在其中遇到),我都会得到以下跟踪:

代码语言:javascript
复制
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的子类,而不是直接的threading.Thread实例(在本例中,工作人员是class Association(threading.Thread):的一个实例)。

当然,我对PyDev的了解还不足以证实这一理论,否则我就会修正它。互联网似乎也是如此。

子类Thread是否很少使用,以致于在PyDev体系结构中根本没有考虑到它?如果不重新设计库,如何解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-04 07:54:43

我只需要更努力地寻找回溯。

在对threading.Thread的子类中,pynetdicom库覆盖了__getattr__,并对其进行了一些破坏。问题是:

代码语言:javascript
复制
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)捕获的。

解决办法是更新这一节:

代码语言:javascript
复制
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__就应该这样做。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15804780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档