【问题标题】:How to debug PyQt5 appcrash on exit如何在退出时调试 PyQt5 appcrash
【发布时间】:2015-05-18 10:19:40
【问题描述】:

我开发 PyQt5 软件已经有一段时间了。过去,我设法将我的 Python 3 PyQt5 软件与 py2exe 打包在一起,一切正常。

但是,现在我遇到了一个问题,即打包的 exe 程序在用户退出时会崩溃。更具体地说,我得到了带有以下详细信息的 APPCRASH

问题签名: 问题事件名称:APPRCASH 应用程序名称:Sotilasmatrikkelit.exe 应用程序版本:0.0.0.0 申请时间戳:54467a51 故障模块名称:PyQt5.QtCore.pyd 故障模块版本:0.0.0.0 故障模块时间戳:549be77e 异常代码:c0000005 异常偏移量:0010c185 操作系统版本:6.1.7601.2.1.0.256.4 区域设置 ID:1035 附加信息 1:0a9e 附加信息 2:0a9e372d3b4ad19135b953a78882e789 附加信息 3:0a9e 附加信息4:0a9e372d3b4ad19135b953a78882e789

在开发过程中从 Pycharm 运行软件时,我从未遇到过这种崩溃。关于如何调试这个或一般可能是什么原因的任何想法?

我怀疑这可能与内存管理有关(PyQt 不会在退出时正确删除所有资源,因此会出现段错误),但是在没有更好的调试信息的情况下,有没有人有任何好的建议来找出确切的问题?我应该尝试在退出时进行某种清理吗? Atm 我这样启动软件:

def start():
  import sys
  app = QApplication(sys.argv)
  fixingtool = Mainwindow(app)
  fixingtool.show()
  sys.exit(app.exec_())

其他调查似乎表明我得到了由 C++ 空指针引起的访问冲突。听起来很吓人,因为我不太了解 PyQt 调试。无论如何,我在我的业务逻辑代码上发现了一个区域,如果删除该区域将消除问题。但是,此代码与 PyQt 无关,只是普通的 Python 代码,不应有任何不同。最奇怪的是,如果我从代码中删除某些函数,即使在运行时未调用函数,问题也会消失,这意味着仅使用这些函数导入文件会导致问题。下面是一个代码示例:

import re

from books.karelians.extraction.extractors.baseExtractor import BaseExtractor
from books.karelians.extraction.extractionExceptions import *
from books.karelians.extraction.extractors.dateExtractor import DateExtractor
from shared import textUtils
from books.karelians.extractionkeys import KEYS
from interface.valuewrapper import ValueWrapper
from shared import regexUtils
from books.karelians.extraction.extractors.professionextractor import ProfessionExtractor

class SpouseExtractor(BaseExtractor):


    def extract(self, text, entry):
        super(SpouseExtractor, self).extract(text)
        self.entry = entry
        self.PATTERN = r"Puol\.?(?P<spousedata>[A-ZÄ-Öa-zä-ö\s\.,\d-]*)(?=(Lapset|poika|tytär|asuinp))"
        self.NAMEPATTERN = r"(?P<name>^[\w\s\.-]*)"
        self.OPTIONS = (re.UNICODE | re.IGNORECASE)    #TODO: TRY IGNORE CASE?
        self.REQUIRES_MATCH_POSITION = False
        self.SUBSTRING_WIDTH = 100

        self.hasSpouse = False
        self.spouseName = ""
        self.profession = {KEYS["profession"] : ValueWrapper("")}

        self.initVars(text)
        self._findSpouse(text)
        return self._constructReturnDict()

    def initVars(self,text):
        pass

    def _findSpouse(self, text):
        try:
            self.foundSpouse = regexUtils.safeSearch(self.PATTERN, text, self.OPTIONS)
            self.hasSpouse = True
            self._findSpouseName(self.foundSpouse.group("spousedata"))
            self._setFinalMatchPosition()
        except regexUtils.RegexNoneMatchException:
            pass

    def _findSpouseName(self, text):
        try:
            name = regexUtils.safeSearch(self.NAMEPATTERN, text, self.OPTIONS)
            self.spouseName = name.group("name").strip()
            self._findProfession(text[name.end():])
        except regexUtils.RegexNoneMatchException:
            self.errorLogger.logError(SpouseNameException.eType, self.currentChild)

    def _findProfession(self, text):
        professionExt = ProfessionExtractor(self.entry, self.errorLogger, self.xmlDocument)
        professionExt.setDependencyMatchPositionToZero()
        self.profession = professionExt.extract(text, self.entry)


    def _setFinalMatchPosition(self):
        #Dirty fix for inaccuracy in positions which would screw the Location extraction
        self.matchFinalPosition = self.foundSpouse.end() + self.matchStartPosition - 4

    def _constructReturnDict(self):
        print(self.profession)
        return {KEYS["spouse"]: ValueWrapper({ KEYS["hasSpouse"]:  ValueWrapper(self.hasSpouse),KEYS["spouseName"]:  ValueWrapper(self.spouseName), KEYS["spouseProfession"]: ValueWrapper(self.profession[KEYS["profession"]].value) })}

如果我删除或注释掉所有函数“initVars()”程序将正确退出。什么给了?

【问题讨论】:

  • 我在我的代码中发现了一个奇怪的地方,如果我删除了一个我从未使用过的函数(忘记删除它),问题就消失了。然而,在应用程序中有另一个看起来完全正常的代码区域,当导入时,它会以某种方式在退出时弄乱垃圾收集。我遇到访问冲突。

标签: python debugging crash pyqt py2exe


【解决方案1】:

这本身并不是真正解决问题的方法,但我将把它留在这里以防有人遇到类似问题。

今天我决定尝试 cx_freeze 而不是 py2exe,我认为问题可能出在 py2exe 上,因为在使用普通的 python 解释器运行应用程序时,整个问题并没有发生。

事实证明我是对的,在我使用 cx_freeze 而不是 py2exe 打包应用程序后,问题似乎神奇地消失了。我没有对代码做任何更改。比我更了解 py2exe 和 cx_freeze 如何工作的人可能能够解释其中的区别。我的疯狂猜测是,由于某种原因,Python 解释器的退出在 py2exe 的情况下没有得到完美的处理,以某种方式弄乱了最终的垃圾清理。我不知道这是 py2exe 的问题还是我没有正确配置 py2exe 的错。

无论如何,我很高兴它现在可以正常工作,因为昨天真是令人沮丧的一天。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-28
    • 2021-08-06
    • 2017-10-06
    • 1970-01-01
    • 2018-11-02
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    相关资源
    最近更新 更多