代码之家  ›  专栏  ›  技术社区  ›  johngull

osx:如果父进程在打开状态下运行,则外部程序(qprocess)崩溃,但如果父进程直接运行,则运行良好

  •  0
  • johngull  · 技术社区  · 8 年前

    我在MacOS 10.13上遇到了奇怪的情况,但找不到它的根源。

    我有一个打包的32位Qt应用程序。由于MacOS对其中一个操作的限制,我需要启动一个小的64位控制台二进制文件,这样做很有技巧。这个控制台二进制文件放在Contents/MacOS中,我使用QProcess启动它。

    如果我从IDE运行主应用程序,一切都很好。此外,如果我打开一个终端,cd到Contents/MacOS并直接运行主应用程序,一切都很好。

    但一旦我使用“open myApp.app”或通过UI启动它,QProcess exitCode()返回255,这似乎意味着崩溃。

    启动子流程的代码:

    QProcess p;
    p.start("./papply", QStringList() << osid << filepath);
    p.waitForFinished(5000);
    qDebug() << p.readAllStandardOutput();
    qDebug() << p.readAllStandardError();
    qDebug() << p.state();
    if(p.state()==QProcess::Running)
    {
      qDebug() << "peapply freezed - kill";
      p.kill();
      return false;
    }
    
    qDebug() << "Apply" << osid << filepath << "=" << p.exitCode();
    return p.exitCode()==0;
    

    任何帮助都将不胜感激。

    2 回复  |  直到 8 年前
        1
  •  1
  •   TheDarkKnight    8 年前

    我有一个打包的32位Qt应用程序。

    首先,为了防止您错过这一点,苹果已经声明下一版本的操作系统(10.14)将不支持32位应用程序,因此如果您想在未来版本的macOS上运行此应用程序,您需要更改这一点。

    如果您使用调试器,或从捆绑包的 Contents/MacOS 文件夹,它直接执行。相反,如果双击二进制文件,或使用 open 关键字,请求被发送到 Launch Services ,代表您打开应用程序。

    Bundle Identifier ,位于应用程序包的 Info.plist 文件

    当出现使用LS打开应用程序的请求时,LS将显示 包标识符 ,从应用程序的plist开始,LS将执行已执行的应用程序 registered ,具有该标识符。

    在plist中,我们也有钥匙 CFBundleExecutable ,定义为“ (推荐)包的可执行文件的名称 “。这是可能会执行的二进制文件的名称,位于Contents/MacOS文件夹中。

    注意,由于LS启动与给定标识符关联的应用程序,如果您的计算机上有相同应用程序的副本,具有相同的版本号和标识符,则它可能不一定要执行您双击的应用程序才能运行。

    因此,崩溃的原因很可能是由于LS启动了不同的应用程序,而不是您认为正在执行的应用程序。确保计算机上没有其他应用程序副本。

    如果生成崩溃报告,您应该能够在图像部分的开头看到应用程序的路径,其中包括指向动态库和框架的路径。

        2
  •  0
  •   johngull    8 年前

    而《黑暗骑士》(TheDarkKnight)提供了大量信息,但这并不完全是一个答案。

    对于将面临相同情况的人: 在macOS包中,应用程序的工作目录与包相关,但与Windows中的执行文件本身无关。

    因此,在我的情况下,下一个代码起作用:

    QString path = qApp->applicationDirPath();
    if(!path.endsWith("/"))
        path += "/";
    QProcess p;
    p.start(path + "papply", QStringList() << osid << filepath);