使用 debug/crash 报告将应用程序部署到客户端

Deploying application to client with debug/crash reports

我创建了一个可以在 Linux 和 Windows 中编译的 Qt 应用程序。此外,使用 Qt installer framework 我已经为 OS 创建了安装程序。但是,我的应用程序仍然存在一些错误。我知道如何在我的计算机上使用调试器调试它们,但是当有人使用我创建的安装程序安装它时,我无法跟踪最终用户计算机中可能发生的分段错误。

有些程序会执行某种崩溃日志,因此当它们崩溃时,可以将日志文件发送给开发人员以尝试找出问题所在。我可以通过在我的应用程序中添加一个日志系统来实现类似的目的,该系统记录(打印到文件)用户在我的应用程序中一直在做什么。然而,这是一种相当复杂的方式,最终涉及到大量的写作。在我看来,安装应用程序的计算机中似乎应该有某种自动工具 "run your programs in debug mode"(即创建崩溃报告)。 是否有人知道在仅安装但未编译您开发的应用程序的计算机上创建崩溃报告的方法?我想我必须在 RelWithDebInfo 中编译我的项目才能在这个字段,这不是问题。

主要平台(Windows、Mac、OS、Linux)的自动崩溃报告,可以使用开源库Google Breakpad (used in Firefox for example), or the more modern Google Crashpad (例如在 Chromium 中使用)。这两个 C++ 库将在崩溃时生成一个 MiniDump 文件,如果需要,可以将其发送到远程服务器。

例如,这里是一个集成 Google Crashpad 的基本 Qt 应用程序:

#include <QtWidgets/qapplication.h>
#include <QtWidgets/qmainwindow.h>

#include <client/crashpad_client.h>

void initializeCrashpad()
{
    const auto dataDir = QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation);
    const auto db = dataDir + "/metrics/db";
    const auto metrics = dataDir + "/crash/metrics";
    const auto url = "https://my-http-server.com/"

    QDir().mkpath(db);
    QDir().mkpath(metrics);

    crashpad::CrashpadClient::StartHandler(
        "crashpad_handler.exe", // Relative path to a Crashpad handler executable
        db.toStdWString(), // Directory to Crashpad database 
        metrics.toStdWString(), // Directory where metrics files can be stored
        url.toStdString(), // URL of the HTTP upload server
        {}, // Annonations to include in the crash report
        true, // The program will be restarted if it crash
        true);
}

int main(int argc, char* argv[])
{
    initializeCrashpad();

    QApplication app(argc, argv);
    QMainWindow window;
    window.show();
    return app.exec();
}

然后您将需要使用 crash_handler.exe(或您所称的任何名称)来发布您的应用程序,或者使用 crashpad::HandlerMain() 来实现这个小程序。有关详细信息,请搜索 Google,或阅读 Crashpad 文档。

否则,您可以使用 free/non-free 服务 Backtrace.io or Sentry,它提供了将 Crashpad 集成到您的应用程序中的教程,还提供了一个上传服务器和许多工具。