OSX - Qt 应用程序在接收系统事件 QEvent::FileOpen 时崩溃

Posted

技术标签:

【中文标题】OSX - Qt 应用程序在接收系统事件 QEvent::FileOpen 时崩溃【英文标题】:OSX - Qt application crashed when receiving system event QEvent::FileOpen 【发布时间】:2014-01-06 17:40:28 【问题描述】:

我正在使用 plist 文件来允许我的 Qt 应用程序能够直接从 finder 打开文件。不幸的是,有时在某些系统上(如下所述)应用程序崩溃/冻结。

此问题仅发生在某些客户端计算机上,并且仅当我在我们的生产计算机上使用 10.6.8 OSX 编译应用程序时。当我在我的 10.9.1 OSX 上编译它时,一切正常。

我在我们的应用程序中尝试了一些更改并注释了很多代码,但是当整个 QApplication::event() 方法被注释时,应用程序也会崩溃。在我看来,这是 10.8.6 OSX / 3.2.6 Xcode 中的一些错误。不幸的是,由于一些向后兼容性问题,我现在无法将其更新到较新的版本。

我正在使用来自 git 的最新 Qt 4.8.6,并且在官方 4.8.2 版本上也有同样的行为。

是否有任何已知的解决方法或任何建议如何查找/修复此错误?这非常困难,因为无论是否处理事件,都无法从调试器测试此事件,并且使用 QMessageBox 进行跟踪也崩溃了。崩溃调用堆栈也没有显示任何有用的东西(如下所示)。

我的应用程序 plist 文件格式如下:

  <key>CFBundleDocumentTypes</key>
  <array>
    <dict>
      <key>CFBundleTypeName</key>         <string>ORM Designer project file</string>
      <key>CFBundleTypeRole</key>         <string>Editor</string>
      <key>CFBundleTypeIconFile</key>     <string>@ICON@</string>
      <key>LSHandlerRank</key>            <string>Owner</string>
      <key>LSIsAppleDefaultForType</key>  <true/>
      <key>CFBundleTypeExtensions</key>   
      <array>
        <string>ormdesigner</string>
        <string>ormdes</string>
        <string>ormdesigner2</string>
        <string>ormdes2</string>
      </array>
    </dict>
  </array>

Google 的 CrashPad 捕获的调用堆栈:

崩溃原因:EXC_BAD_ACCESS / 0x0000000d 崩溃地址:0x0

Thread 0 (crashed)
 0  QtCore + 0x7cd6a
    rbx = 0x00000000ffffffff   r12 = 0x6163696c7070412f
    r13 = 0x00007fff5fbfbe30   r14 = 0x00007fff5fbfbfb0
    r15 = 0x0000000000007fff   rip = 0x00000001054bed6a
    rsp = 0x00007fff5fbfbe00   rbp = 0x00007fff5fbfbe20
    Found by: given as instruction pointer in context
 1  QtCore + 0x13f2cb
    rip = 0x00000001055812cc   rsp = 0x00007fff5fbfbe30
    rbp = 0x00007fff5fbfbe70
    Found by: stack scanning
 2  QtGui + 0x38b4e
    rip = 0x00000001057b6b4f   rsp = 0x00007fff5fbfbe80
    rbp = 0x00007fff5fbfc000
    Found by: stack scanning
 3  libobjc.A.dylib + 0x78e1
    rip = 0x00007fff8cce48e2   rsp = 0x00007fff5fbfbee0
    rbp = 0x00007fff5fbfc000
    Found by: stack scanning
 4  libobjc.A.dylib + 0x121db
    rip = 0x00007fff8ccef1dc   rsp = 0x00007fff5fbfbf50
    rbp = 0x00007fff5fbfc000
    Found by: stack scanning
 5  CoreFoundation + 0x1a9eef
    rip = 0x00007fff8752aef0   rsp = 0x00007fff5fbfbf68
    rbp = 0x00007fff5fbfc000
    Found by: stack scanning

完整的调用栈是posted to pastebin。

感谢您的建议 卢德克

【问题讨论】:

那是哪个 Qt 版本?调试回溯会很有用(尝试使用export DYLD_IMAGE_SUFFIX=_debug。可能需要在 Qt 项目错误跟踪器中报告。 最初我在 4.8.2 上发现了这个 bug。我还尝试从 git 将 Qt 更新到最新的 4.8.6,但没有区别。 我忘了回复您的其余评论。 “export”子句不起作用,因为只有在从 Finder 执行应用程序时才会出现错误,因此没有用于调试视图的控制台。而且据我了解,我认为问题在 10.7 版本上已经解决,所以我认为没有必要报告它。 【参考方案1】:

我们决定重新安装两台构建机器,一台安装到 Mac OSX 10.6.8,另一台安装到 OSX 10.7.5。

我们在两台机器上安装了完全相同的软件,唯一不同的是 Xcode。在 10.6.8 上是最新的 3.2.6,在 10.7.5 上是 4.6.3。

当我们在两台机器上构建我们的应用程序时,在 10.7 创建的版本运行良好,没有任何崩溃。基于 10.6 构建的应用程序。再次崩溃。所以从我们尝试过的所有东西(我们在这个错误上花了大约 30 小时)我几乎可以肯定问题出在 Xcode 编译器内部。

如果有人有类似的问题,最简单且省时的解决方法是将他的构建机器更新到新版本。

【讨论】:

以上是关于OSX - Qt 应用程序在接收系统事件 QEvent::FileOpen 时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

QT OSX 调试失去目标

如何检索当前接收关键事件的 OSX 应用程序

QT遇到Release事件无法正常接收的情况怎么办

如何在 OSX 上设置 Qt 的标签栏背景样式

Qt/C++ 在 Mac OSX 10 上将系统范围 QSettings 存储在哪里?

Qt5.5 如何在应用程序级别覆盖 MousePress 事件坐标