进口pdb的副作用——参考C++;来自traitsui wxpython的对象被保留

进口pdb的副作用——参考C++;来自traitsui wxpython的对象被保留,wxpython,enthought,pdb,traitsui,Wxpython,Enthought,Pdb,Traitsui,我正在用pdb调试一些代码,发现每当导入pdb模块时(无论是否有断点处于活动状态),程序都能正常工作,但在其他情况下会崩溃 具体来说,代码是多线程独立GUI应用程序。GUI保存在一个侧线程中,而主线程在GUI完成自身构造后立即执行各种操作(即,它们被添加到事件循环上事件队列的末尾)。下面是一个简单的例子: #import pdb class Gui(HasTraits): hello = Button('hello') def some_method(self): print

我正在用pdb调试一些代码,发现每当导入pdb模块时(无论是否有断点处于活动状态),程序都能正常工作,但在其他情况下会崩溃

具体来说,代码是多线程独立GUI应用程序。GUI保存在一个侧线程中,而主线程在GUI完成自身构造后立即执行各种操作(即,它们被添加到事件循环上事件队列的末尾)。下面是一个简单的例子:

#import pdb

class Gui(HasTraits):
  hello = Button('hello')

  def some_method(self):
    print 58

class GuiThread(Thread):
  def __init__(self):
    Thread.__init__(self)
    self.gui = Gui()

  def run():
    self.gui.configure_traits()

#pdb.set_trace()
g = GuiThread()
g.start()

from pyface.api import GUI
gui = GUI()
gui.invoke_later( g.gui.some_method )
此崩溃与<>代码> x.y.Cy.PyDeasObjeCask:ByApp对象的C++部分已被删除,属性访问不再允许。但是,如果单行
import pdb
未注释,程序将按预期工作,GUI线程在事件循环结束时将58打印到stdout(即使堆栈跟踪未注释)

我还尝试在一些不使用traitsui的非常简单的wx应用程序中测试这种行为。在这些应用程序中,当使用跟踪进行调试时,但当不调试程序时,可以找到正确的行为(打印58)

我的问题是,PDB做什么可以阻止C++对象被垃圾收集?了解这一点可能有助于我找出发生这种情况的原因

另请参见相关问题和,这些问题的重点不太突出