debugging 如何调试PyQt5应用程序退出后零星冻结?

roejwanj  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(160)

我正在开发一个中等复杂度的PyQt5应用程序。它有各种各样的小部件(包括本地的和第三方的)和Qthreads。它大部分时间都工作得很好,但是大约有5次在我退出后,应用程序在后台挂起。
下面是我对closeEvent的定义:

def closeEvent(self, event):
    qApp.quit()

我还定义了一个quit_action并将其连接到qApp.quit(),如下所示:

self.quit_action.triggered.connect(qApp.quit)

我启动PyQt5应用程序的标准方式:

app = QApplication([])

window = GUIWindow()
window.show()

sys.exit(app.exec())

我不知道如何调试这种奇怪的错误。它只发生了几次,我不能重现错误。
我在控制台中运行应用程序:

python main.py

通常我可以关闭应用程序没有问题。但有一次,在我关闭应用程序后(通过单击窗口的“x”按钮或通过触发菜单中的quit_action),窗口消失,进程在后台挂起。我必须按“Ctlr+Z”,然后杀死进程。
什么是策略来调试这样奇怪的错误?如何才能找到究竟是什么原因造成的冻结的应用程序?

rkkpypqq

rkkpypqq1#

这类错误很难隔离。看起来我的特定错误是应用程序的几个小部件组合的结果,甚至很难提供一个最小的工作示例来重现错误。更不用说错误只在几次运行中发生一次。
看起来我已经通过gdb检查了挂起过程,找到了bug的罪魁祸首(参见stackoverflow Is there a way to attach a debugger to a multi-threaded Python process?中的问题)。
当我的应用程序再次冻结时-我通过gdb连接到进程,调查线程并发现有问题的线程。
EDIT:即使qApp.quit()不起作用,也可以关闭PyQt应用程序临时解决方案:

def closeEvent(self, event):
    qApp.quit()
    sys.exit()

相关问题