From 654370425d8fd454dca290290aeb92a6060e69a8 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 24 Sep 2020 23:56:58 +1000 Subject: [PATCH] crashpad: detect when crashpad handler is missing --- app/common/crashpadinterface.cpp | 67 +++++++++++++++++++------------- 1 file changed, 40 insertions(+), 27 deletions(-) diff --git a/app/common/crashpadinterface.cpp b/app/common/crashpadinterface.cpp index 393cba4c6..c65db16d0 100644 --- a/app/common/crashpadinterface.cpp +++ b/app/common/crashpadinterface.cpp @@ -71,49 +71,62 @@ bool LinuxExceptionHandler(int, siginfo_t*, ucontext_t*) bool InitializeCrashpad() { - QString exe_dir = QCoreApplication::applicationDirPath(); + QString handler_fn; + // Determine filename of handler from platform #ifdef OS_WIN - base::FilePath handler(QSTRING_TO_BASE_STRING(QDir(exe_dir).filePath(QStringLiteral("crashpad_handler.exe")))); + handler_fn = QStringLiteral("crashpad_handler.exe"); #else - // FIXME: On Linux, probably should put this in a subdir so that it doesn't conflict with - // anything else in /usr/bin - base::FilePath handler(QSTRING_TO_BASE_STRING(QDir(exe_dir).filePath(QStringLiteral("crashpad_handler")))); + handler_fn = QStringLiteral("crashpad_handler"); #endif - base::FilePath reports_dir = GenerateReportPathForCrashpad(); + // Generate absolute path + QString handler_abs_path = QDir(QCoreApplication::applicationDirPath()).filePath(handler_fn); - base::FilePath metrics_dir(QSTRING_TO_BASE_STRING(QDir(OLIVE_NAMESPACE::FileFunctions::GetTempFilePath()).filePath(QStringLiteral("metrics")))); + bool status = false; - // Metadata that will be posted to the server with the crash report map - std::map annotations; + if (QFileInfo::exists(handler_abs_path)) { + base::FilePath handler(QSTRING_TO_BASE_STRING(handler_fn)); - // Disable crashpad rate limiting so that all crashes have dmp files - std::vector arguments; - arguments.push_back("--no-rate-limit"); - arguments.push_back("--no-upload-gzip"); + base::FilePath reports_dir = GenerateReportPathForCrashpad(); - // Initialize Crashpad database - std::unique_ptr database = crashpad::CrashReportDatabase::Initialize(reports_dir); - if (database == NULL) return false; + base::FilePath metrics_dir(QSTRING_TO_BASE_STRING(QDir(OLIVE_NAMESPACE::FileFunctions::GetTempFilePath()).filePath(QStringLiteral("metrics")))); - // Disable automated crash uploads - crashpad::Settings *settings = database->GetSettings(); - if (settings == NULL) return false; - settings->SetUploadsEnabled(false); + // Metadata that will be posted to the server with the crash report map + std::map annotations; + + // Disable crashpad rate limiting so that all crashes have dmp files + std::vector arguments; + arguments.push_back("--no-rate-limit"); + arguments.push_back("--no-upload-gzip"); + + // Initialize Crashpad database + std::unique_ptr database = crashpad::CrashReportDatabase::Initialize(reports_dir); + if (database == NULL) return false; + + // Disable automated crash uploads + crashpad::Settings *settings = database->GetSettings(); + if (settings == NULL) return false; + settings->SetUploadsEnabled(false); + + // Start crash handler + client = new crashpad::CrashpadClient(); + status = client->StartHandler(handler, reports_dir, metrics_dir, + "https://olivevideoeditor.org/crashpad/report.php", + annotations, arguments, true, true); + } - // Start crash handler - client = new crashpad::CrashpadClient(); - bool status = client->StartHandler(handler, reports_dir, metrics_dir, - "https://olivevideoeditor.org/crashpad/report.php", - annotations, arguments, true, true); // Override Crashpad exception filter with our own + if (status) { #if defined(OS_WIN) - SetUnhandledExceptionFilter(Win32ExceptionHandler); + SetUnhandledExceptionFilter(Win32ExceptionHandler); #elif defined(OS_LINUX) - crashpad::CrashpadClient::SetFirstChanceExceptionHandler(LinuxExceptionHandler); + crashpad::CrashpadClient::SetFirstChanceExceptionHandler(LinuxExceptionHandler); #endif + } else { + qWarning() << "Failed to start Crashpad, automatic crash reporting will be disabled"; + } return status; }