【问题标题】:Deploying application to client with debug/crash reports使用调试/崩溃报告将应用程序部署到客户端
【发布时间】:2020-06-06 09:01:53
【问题描述】:

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

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

【问题讨论】:

标签: c++ windows ubuntu debugging remote-debugging


【解决方案1】:

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

【讨论】:

  • 我成功集成了crashpad。但是,我无法配置上传服务器。有没有关于如何做到这一点的教程?
  • 如果您想编写自己的 HTTP 崩溃收集服务器,您可以在此处查看示例:github.com/chromiumembedded/cef/blob/master/tools/…(在 Python 中)。您还可以使用 Mozilla 的 Socorro 系统,该系统允许崩溃收集和分析以及使用答案中提到的非免费服务之一。
  • Crashpad 使用 HTTP POST 和内容类型“multipart/form-data”上传崩溃报告。上传与从 HTML 字段上传文件完全相同。
  • 如何阅读 Linux 中的崩溃报告?我已经 posted a question 关于这个,也许你可以看看。
猜你喜欢
  • 1970-01-01
  • 2017-06-06
  • 1970-01-01
  • 1970-01-01
  • 2015-10-17
  • 2011-07-10
  • 1970-01-01
  • 2019-06-05
  • 2019-07-17
相关资源
最近更新 更多