c++ - 使用调试/崩溃报告将应用程序部署到客户端

标签 c++ windows ubuntu debugging remote-debugging

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

有些程序会记录某种崩溃日志,因此当它们崩溃时,可以将日志文件发送给开发人员以尝试找出问题。我可以通过在我的应用程序中添加一个日志系统来实现类似的目标,该系统记录(打印到文件)用户在我的应用程序中始终执行的操作。然而,这是一种相当复杂的方法,并且最终涉及到大量的写作。对我来说,似乎应该有某种自动工具可以在安装应用程序的计算机中“以 Debug模式运行程序”(即创建崩溃报告)。 有人知道在仅安装但未编译您开发的应用程序的计算机上创建崩溃报告的方法吗?我想我必须在 RelWithDebInfo 中编译我的项目才能在该领域实现某些目标,这不是问题。

最佳答案

对于主要平台(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 集成到您的应用程序中的教程,还提供了一个带有许多工具的上传服务器。

关于c++ - 使用调试/崩溃报告将应用程序部署到客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60347001/

相关文章:

windows - 通过jenkins访问windows上的linux挂载位置

c++ - 重复的c++模板实例化

windows - Perl:SMTP 无法连接到邮件服务器

C++17 元组拆包

windows - 如何使用 REST+cURL 更新 TeamCity 构建参数

c - 当时间过去时真正杀死当前进程

c++ - 从 Windows 迁移到 Ubuntu

android - 为什么我不能在 Android Studio 中将任何东西拖到 'activity_main.xml' 上?

C++ 暂停外部程序

c++ - 用C++实现一棵树