我正在用 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 )
这与wx._core.PyDeadObjectError: The C++ part of the PyApp object has been deleted, attribute access no longer allowed
. 但是,如果单行import pdb
未注释,则程序按预期工作,并且 GUI 线程在事件循环结束时将 58 打印到标准输出(即使堆栈跟踪没有取消注释)。
我也一直在尝试在一些不使用 traitsui 的非常简单的 wx 应用程序中测试这种行为。在这些应用程序中,在使用跟踪进行调试时会发现正确的行为(打印出 58),但在不调试程序段错误时会发现。
我的问题是,pdb 在做什么可能会阻止 C++ 对象被垃圾收集?知道这一点可能有助于我追查为什么会发生这种情况。