进口pdb的副作用——参考C++;来自traitsui wxpython的对象被保留
我正在用pdb调试一些代码,发现每当导入pdb模块时(无论是否有断点处于活动状态),程序都能正常工作,但在其他情况下会崩溃 具体来说,代码是多线程独立GUI应用程序。GUI保存在一个侧线程中,而主线程在GUI完成自身构造后立即执行各种操作(即,它们被添加到事件循环上事件队列的末尾)。下面是一个简单的例子:进口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
#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++对象被垃圾收集?了解这一点可能有助于我找出发生这种情况的原因
另请参见相关问题和,这些问题的重点不太突出