【问题标题】:Qt5 app crashes when run from outside Qt从 Qt 外部运行时,Qt5 应用程序崩溃
【发布时间】:2013-09-07 15:51:29
【问题描述】:

我有一个最近才出现的奇怪问题。

当我从 Qt 应用程序内部访问外部二进制文件时,应用程序崩溃并出现错误:

Exception Type:  EXC_CRASH (SIGABRT)

但是当我从 Qt Creator 中的“构建和运行”运行它时,当我访问我的应用程序中点击外部二进制文件的点时,一切都运行良好。

这是我在应用程序从外部 Qt 创建者崩溃时遇到的功能

QString Api::getVideoFrame(QString filename, QString position)
{
    const QString ffmpeg = QDir::currentPath()+"/ffmpeg"; //mac version
    QProcess process;
    QStringList args;
    args    << "-ss" << position
            << "-i" << filename
            << "-f" << "image2"
            << "-vframes" << "1"
            //<< "-vcodec" << "bmp"
            << "pipe:1";
    process.start(ffmpeg, args);
    process.waitForFinished();

    return QString(process.readAllStandardOutput().toBase64());
}

在访问其他外部二进制文件时它也会崩溃,在这种情况下不仅是 ffmpeg。

我觉得它与 QDir::currentPath() 有关,因为当我弄乱路径时,它也会从 Qt Creator 内部崩溃。

显然我在 Contents/MacOS/ 文件夹中的可执行文件旁边添加了相应的二进制文件

我真的不知道如何调试这个..任何线索如何解决这个问题?

【问题讨论】:

  • 首先,您可能想在调试器中调试它?喜欢GDB。只需从命令行运行调试器,看看能否更好地确定崩溃位置。

标签: c++ qt qt5


【解决方案1】:

我实际上发现了为什么会发生这种情况,并且注意到这一点非常有趣

QDir::currentPath()

在 mac osX 上必须小心使用。

当从 Qt Creator 中执行应用程序时,它会返回:

/Volumes/LSPRO/Build/LSPRO.app/Contents/MacOS

在 .app 包中包含 te 二进制文件的路径

但是当你作为一个独立的应用程序运行它时,它会返回

/Volumes/LSPRO/Build

至少在我的配置上...

【讨论】:

  • 不要使用“cuurentpath”,而是使用 QCoreApplication::applicationDirPath () 并尝试。
  • 仍然很奇怪,它使应用程序崩溃而不是给出错误。我的意思是,无论你在另一个文件夹中有什么错误或混合的二进制文件,你运行的ffmpeg 应该崩溃,而不是你的实际应用程序,因为据我了解你只是运行一个外部可执行文件,崩溃应该来自链接或动态加载
  • @Rudolfs:这就是 MacOS 处理崩溃子级的方式:一个信号被传递给父级,从而导致父级也崩溃。
【解决方案2】:

I don't really know how to debug this.. any clue how to solve this?

是的,我有一些线索。

您可以尝试在这种情况下使用 QCoreApplication::applicationDirPath() 以使其在 MAC 上正常工作,正如用户在评论中所断言的那样。

Here 你可以找到文件系统引擎源代码,但如果你想进一步追踪你的嫌疑人作为错误的问题。简而言之,其中没有多少 Mac 专用代码,而不是 Unix。

另外,将来您可能想考虑使用 QtMultimedia,而不是处理 QProcess 和外部执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    • 2015-08-27
    相关资源
    最近更新 更多