【问题标题】:Handling segmentation fault in a program ran from QProcess处理从 QProcess 运行的程序中的分段错误
【发布时间】:2023-05-24 00:33:01
【问题描述】:

我正在编写一个 Qt 应用程序来编译和运行 C++ 文件。我不知道如何在进程启动后检查运行时错误,例如分段错误。我尝试使用 error() 信号报告运行时错误,但它没有说明分段错误。

//connected to error() signal
void Tester::onError(QProcess::ProcessError e)
{
    switch(e) {
    case QProcess::Crashed:
    case QProcess::WriteError:
    case QProcess::ReadError:
    case QProcess::UnknownError:
        QMessageBox::information(NULL, "Run status", "Runtime error",
                                 QMessageBox::Ok | QMessageBox::Default);
        break;
    default:
        break;
    }
}

这是我正在测试的文件-

#include <iostream>

int main() {
    int *p = NULL;
    *p = 1;  //segmentation fault
    std::cout << *p;
    return 0;
}

当我从 Qt 应用程序测试文件时,新进程运行了大约 15-20 秒,然后发出了 finished() 信号,并带有一个奇怪的退出代码和一个显示“运行时错误”的消息框。如何检测到新 QProcess 中存在分段错误,以便将其显示给用户?
我正在使用 Windows 7。

【问题讨论】:

  • 您是否尝试连接到finished(int exitCode, QProcess::ExitStatus exitStatus) 信号并处理QProcess::ExitStatus 值?
  • 其他程序是否编译为调试版本?
  • @vahancho 不,我没有,我认为这将由 error() 信号处理。
  • @ratchetfreak 不,不是
  • finished(int, QProcess::ExitStatus) 应该给你 QProcess::CrashExit 作为状态。

标签: c++ qt segmentation-fault qprocess


【解决方案1】:

使用 QProcess 报告错误有点令人困惑 - 需要同时连接到 error() 和 finished() 以涵盖所有错误情况。

如果您连接到finished(int exitCode, QProcess::ExitStatus status),段错误应该导致statusQProcess::CrashExit

【讨论】:

  • 它有点工作,但QProcess::CrashExit也可能是因为其他原因,所以我不能用它来定位段错误。
  • 至少在 Unix 上是可以检测到的。请参阅linux.die.net/man/3/wait 和 WTERMSIG()。 Qt 对 CrashExit 使用 WIFEXITED(),因此确定 SIGSEGV 确实是不够的。但这是 QProcess API 的限制,而不是操作系统的限制。
最近更新 更多