c++ - 使用调试/崩溃报告将应用程序部署到客户端
问题描述
我创建了一个可以在 Linux 和 Windows 中编译的 Qt 应用程序。此外,使用Qt 安装程序框架,我为这两个操作系统创建了安装程序。但是,我的应用程序仍然存在一些错误。我知道如何在我的计算机上使用调试器来调试它们,但是当有人使用我创建的安装程序安装它时,我无法跟踪最终用户计算机中可能发生的分段错误。
有一些程序会执行某种崩溃日志,因此当它们崩溃时,可以将日志文件发送给开发人员以尝试找出问题。我可以通过在我的应用程序中添加一个日志系统来记录(打印到文件)用户在我的应用程序中一直在做什么。但是,这是一种非常复杂的方式,并且涉及到我的大量写作。对我来说,看起来应该有某种自动工具可以在安装了应用程序的计算机中“以调试模式运行程序”(即创建崩溃报告)。有人知道在您开发的应用程序仅安装但未编译的计算机上创建崩溃报告的方法吗?我假设我必须在 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.io或Sentry,它提供了将 Crashpad 集成到您的应用程序中的教程,还提供了一个上传服务器和许多工具。
推荐阅读
- java - ListView 中的 java.lang.NullPointerException 问题
- r - 在同一图中编辑 stat_smooth 线和 geom_points
- java - 如何使用流加入非字符串对象列表
- vue.js - 在动作 vuex 中访问 getter
- python - 烧瓶:方法'jinja_env'没有'globals'成员pylint(无成员)
- material-ui - 使用 Material UI 更改未选中复选框的颜色?
- django-rest-framework - ModelViewSet 在检索方法中混合了 url 模式
- scala - 纯值不是 io.databaker.db.DbParameter 的成员
- html - Css Grid-template-area 在浏览器中不起作用
- r - 在 Quanteda 中,我们如何从字面上匹配引号?