6 #include <QCoreApplication>
8 #include <QStringBuilder>
16 #ifdef SWIFT_USE_CRASHPAD
17 # if defined(Q_OS_WIN) && !defined(NOMINMAX)
20 # include "crashpad/client/crash_report_database.h"
21 # include "crashpad/client/crashpad_client.h"
22 # include "crashpad/client/settings.h"
23 # include "crashpad/client/simulate_crash.h"
26 using namespace swift::config;
28 using namespace crashpad;
38 CCrashHandler::~CCrashHandler() {}
40 #ifdef SWIFT_USE_CRASHPAD
42 base::FilePath qstringToFilePath(
const QString &str)
45 return base::FilePath(str.toStdWString());
47 return base::FilePath(str.toStdString());
52 void CCrashHandler::init()
54 #ifdef SWIFT_USE_CRASHPAD
55 static const QString crashpadHandler(
57 static const QString handler = CFileUtils::appendFilePaths(CSwiftDirectories::binDirectory(), crashpadHandler);
58 const QString database = CSwiftDirectories::crashpadDatabaseDirectory();
59 const QString metrics = CSwiftDirectories::crashpadMetricsDirectory();
61 if (!QFileInfo::exists(handler)) {
return; }
63 const std::string serverUrl(
"http://swift-project.sp.backtrace.io:6097/");
64 std::map<std::string, std::string> annotations;
68 annotations[
"format"] =
"minidump";
73 annotations[
"qtversion"] = QT_VERSION_STR;
76 const QString logAttachment = QStringLiteral(
"--attachment=attachment_%1=%2")
77 .arg(CFileLogger::getLogFileName(), CFileLogger::getLogFilePath());
79 std::vector<std::string> arguments;
80 arguments.push_back(logAttachment.toStdString());
83 const QString crashInfoFileName(
"swiftcrashinfo.txt");
84 const QString crashInfoFilePath(CFileUtils::appendFilePaths(
85 CFileUtils::stripFileFromPath(CFileLogger::getLogFilePath()), crashInfoFileName));
86 m_crashAndLogInfo.setLogPathAndFileName(crashInfoFilePath);
87 const QString crashAttachment =
88 QStringLiteral(
"--attachment=attachment_%1=%2").arg(crashInfoFileName, crashInfoFilePath);
89 arguments.push_back(crashAttachment.toStdString());
94 QDir().mkpath(database);
96 m_crashReportDatabase = CrashReportDatabase::Initialize(qstringToFilePath(database));
97 m_crashpadClient = std::make_unique<CrashpadClient>();
98 m_crashpadClient->StartHandler(qstringToFilePath(handler), qstringToFilePath(database),
99 qstringToFilePath(metrics), serverUrl, annotations, arguments,
false,
true);
101 this->crashAndLogAppendInfo(u
"Init crash info at " % QDateTime::currentDateTimeUtc().toString());
105 void CCrashHandler::setUploadsEnabled(
bool enable)
107 #ifdef SWIFT_USE_CRASHPAD
108 if (!m_crashReportDatabase) {
return; }
109 crashpad::Settings *settings = m_crashReportDatabase->GetSettings();
110 settings->SetUploadsEnabled(enable);
116 bool CCrashHandler::isCrashDumpUploadEnabled()
const
118 #ifdef SWIFT_USE_CRASHPAD
119 if (!m_crashReportDatabase) {
return false; }
120 crashpad::Settings *settings = m_crashReportDatabase->GetSettings();
121 bool enabled =
false;
122 bool ok = settings->GetUploadsEnabled(&enabled);
123 return ok && enabled;
129 void CCrashHandler::triggerCrashInfoWrite() { m_crashAndLogInfo.triggerWritingFile(); }
133 m_crashAndLogInfo = info;
134 m_dsCrashAndLogInfo.inputSignal();
137 void CCrashHandler::crashAndLogInfoUserName(
const QString &name)
140 m_dsCrashAndLogInfo.inputSignal();
143 void CCrashHandler::crashAndLogInfoSimulator(
const QString &simulator)
145 m_crashAndLogInfo.setSimulatorString(simulator);
146 m_dsCrashAndLogInfo.inputSignal();
149 void CCrashHandler::crashAndLogInfoFlightNetwork(
const QString &flightNetwork)
151 m_crashAndLogInfo.setFlightNetworkString(flightNetwork);
152 m_dsCrashAndLogInfo.inputSignal();
155 void CCrashHandler::crashAndLogAppendInfo(
const QString &info)
157 m_crashAndLogInfo.appendInfo(info);
158 m_dsCrashAndLogInfo.inputSignal();
161 void CCrashHandler::simulateCrash()
163 #ifdef SWIFT_USE_CRASHPAD
165 m_crashAndLogInfo.appendInfo(
"Simulated crash dump!");
166 m_crashAndLogInfo.writeToFile();
167 CRASHPAD_SIMULATE_CRASH();
171 CLogMessage(
this).
warning(u
"This compiler or platform does not support crashpad. Cannot simulate crash dump!");
175 void CCrashHandler::simulateAssert()
177 #ifdef SWIFT_USE_CRASHPAD
179 m_crashAndLogInfo.appendInfo(
"Simulated ASSERT!");
180 m_crashAndLogInfo.writeToFile();
181 Q_ASSERT_X(
false, Q_FUNC_INFO,
"Test server to test Crash handler");
183 CLogMessage(
this).
warning(u
"This compiler or platform does not support crashpad. Cannot simulate crash dump!");
187 CCrashHandler::CCrashHandler(QObject *parent) : QObject(parent) {}
static const QString & getPlatformString()
Info such as Win32, Win64, macOS, Linux.
static const QString & getShortVersionString()
Version as QVersionNumber.
static const QString & getVersionString()
Version as QVersionNumber.
static bool isLocalDeveloperDebugBuild()
Local build for developers.
static constexpr bool isRunningOnWindowsNtPlatform()
Running on Windows NT platform?
static const QString & gitHeadSha1()
Returns SHA-1 of git HEAD at build time.
static const QString & backtraceToken()
Backtrace token for minidump uploads.
void setUserName(const QString &userName)
User name.
Class for emitting a log message.
Derived & warning(const char16_t(&format)[N])
Set the severity to warning, providing a format string.
Derived & info(const char16_t(&format)[N])
Set the severity to info, providing a format string.
Free functions in swift::misc.