我正在开发一个中等复杂度的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”,然后杀死进程。
什么是策略来调试这样奇怪的错误?如何才能找到究竟是什么原因造成的冻结的应用程序?
1条答案
按热度按时间rkkpypqq1#
这类错误很难隔离。看起来我的特定错误是应用程序的几个小部件组合的结果,甚至很难提供一个最小的工作示例来重现错误。更不用说错误只在几次运行中发生一次。
看起来我已经通过gdb检查了挂起过程,找到了bug的罪魁祸首(参见stackoverflow Is there a way to attach a debugger to a multi-threaded Python process?中的问题)。
当我的应用程序再次冻结时-我通过gdb连接到进程,调查线程并发现有问题的线程。
EDIT:即使qApp.quit()不起作用,也可以关闭PyQt应用程序临时解决方案: