首页 > 解决方案 > 使用调试/崩溃报告将应用程序部署到客户端

问题描述

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

有一些程序会执行某种崩溃日志,因此当它们崩溃时,可以将日志文件发送给开发人员以尝试找出问题。我可以通过在我的应用程序中添加一个日志系统来记录(打印到文件)用户在我的应用程序中一直在做什么。但是,这是一种非常复杂的方式,并且涉及到我的大量写作。对我来说,看起来应该有某种自动工具可以在安装了应用程序的计算机中“以调试模式运行程序”(即创建崩溃报告)。有人知道在您开发的应用程序仅安装但未编译的计算机上创建崩溃报告的方法吗?我假设我必须在 RelWithDebInfo 中编译我的项目才能在这个领域取得一些成就,这不是问题。

标签: c++windowsubuntudebuggingremote-debugging

解决方案


对于主要平台(Windows、Mac OS、Linux)上的自动崩溃报告,您可以使用开源库Google Breakpad(例如用于 Firefox),或更现代的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 文档。

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


推荐阅读