1

我正在用 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++ 对象被垃圾收集?知道这一点可能有助于我追查为什么会发生这种情况。

另请参阅此处此处的相关问题,这些问题的关注度稍低。

4

0 回答 0