From 0642a0910ca0fb8e392636254684b91637a7b542 Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Fri, 3 Jan 2020 21:58:20 +0200 Subject: PKGBUILD: add install stage for debug symbols - make toggling breakpad work properly --- src/crashhandler.cpp | 44 +++++++++++++++++++++++++++++++------------- src/crashhandler.h | 38 ++++++++++++++++++++------------------ src/main.cpp | 32 +++++++++++++------------------- src/meson.build | 4 +++- 4 files changed, 67 insertions(+), 51 deletions(-) (limited to 'src') diff --git a/src/crashhandler.cpp b/src/crashhandler.cpp index 194d04b..0c2fec7 100644 --- a/src/crashhandler.cpp +++ b/src/crashhandler.cpp @@ -8,31 +8,49 @@ #include "crashhandler.h" #include "version.h" - -#ifdef BREAKPAD - -//#ifdef Q_OS_LINUX +#include +#include #include -//#endif // Q_OS_LINUX - -bool CrashHandler::dumpCallback(const google_breakpad::MinidumpDescriptor &descriptor, void *context, bool succeeded) +// bool filter_callback (void*) +// --> true: continue processing and write a minidump +static bool minidumpCb(const google_breakpad::MinidumpDescriptor &descriptor, void *context, bool succeeded) { printf("Dump path: %s\n", descriptor.path()); - auto *ctx = static_cast(context); + auto *ctx = static_cast(context); if(ctx != nullptr) { - if(ctx->handler != nullptr) { + if(!ctx->handler.empty()) { // fork and run 'handler master:commit path.dmp' pid_t pid = fork(); if(pid == 0) { - char buffer[256]; - snprintf(buffer, 256, "%s %s %s", ctx->handler, poi_Version, descriptor.path()); - execlp("/bin/sh", "/bin/sh", "-c", buffer, (char *)nullptr); + // pathname program argument ... nullptr + execlp(ctx->handler.c_str(), + ctx->handler.c_str(), "--crashd", ctx->dumppath.c_str(), "-c", descriptor.path(), poi_Version, + (char *)nullptr); } } } return succeeded; } -#endif + +bool CrashHandler::install_handler(CrashHandler::Context &ctx) +{ + if(ctx.dumppath.empty()) + return false; + + // Disable Chromium's crash handler so breakpad can capture crashes instead. + // This has to be done before QtWebEngine gets initialized. + const auto chromiumFlags = qgetenv("QTWEBENGINE_CHROMIUM_FLAGS"); + if(!chromiumFlags.contains("disable-in-process-stack-traces")) { + qputenv("QTWEBENGINE_CHROMIUM_FLAGS", chromiumFlags + " --disable-in-process-stack-traces"); + } + + google_breakpad::MinidumpDescriptor descriptor(ctx.dumppath.c_str()); + + // minidump descriptor, filter callback, minidump callback, callback_context, install handler, server_fd + auto *eh = new google_breakpad::ExceptionHandler(descriptor, nullptr, minidumpCb, &ctx, true, -1); + + return true; +} diff --git a/src/crashhandler.h b/src/crashhandler.h index e7f7fa1..9b79ecc 100644 --- a/src/crashhandler.h +++ b/src/crashhandler.h @@ -9,26 +9,28 @@ #ifndef SMOLBOTE_CRASHHANDLER_H #define SMOLBOTE_CRASHHANDLER_H -#ifdef BREAKPAD -//#ifdef Q_OS_LINUX -#include -#endif +#include -class CrashHandler +namespace CrashHandler { - -public: - struct BreakpadContext { - char *handler = nullptr; - }; - - // bool filter_callback (void*) - // --> true: continue processing and write a minidump - -#ifdef BREAKPAD - static bool dumpCallback(const google_breakpad::MinidumpDescriptor &descriptor, void *context, bool succeeded); +struct Context { + const std::string dumppath; + const std::string handler; + + explicit Context(const std::string &path, const std::string &crashhandler) + : dumppath(path) + , handler(crashhandler) + { + } +}; + +bool install_handler(Context &ctx) +#ifndef HAVE_BREAKPAD +{ + return false; +} #endif - -}; // CrashHandler +; +}; #endif // SMOLBOTE_CRASHHANDLER_H diff --git a/src/main.cpp b/src/main.cpp index f4f2b78..f6a5b17 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -148,26 +148,20 @@ int main(int argc, char **argv) // set this, otherwise the webview becomes black when using a stylesheet app.setAttribute(Qt::AA_DontCreateNativeWidgetSiblings, true); -#ifdef CONFIG_USEBREAKPAD - const std::string crashpath = config->value("browser.crash.path").value_or("/tmp"); - assert(!crashpath.empty()); - - CrashHandler::BreakpadContext ctx; - google_breakpad::MinidumpDescriptor descriptor(crashpath.c_str()); - - const auto crashHandler = config->value("browser.crash.handler"); - if(crashHandler) { - const int length = crashHandler.value().length() + 1; - ctx.handler = new char[length]; - crashHandler.value().copy(ctx.handler, length - 1); - ctx.handler[length - 1] = '\0'; - } - - // minidump descriptor, filter callback, minidump callback, callback_context, install handler, server_fd - google_breakpad::ExceptionHandler eh(descriptor, nullptr, CrashHandler::dumpCallback, &ctx, true, -1); + { + Configuration conf; + if(conf.value("usebreakpad").value()) { + CrashHandler::Context ctx( + conf.value("path.crashdump").value(), + conf.value("path.crashhandler").value()); - spdlog::debug("Installed breakpad exception handler (path {})", crashpath); -#endif // CONFIG_USEBREAKPAD + if(CrashHandler::install_handler(ctx)) { + spdlog::info("Installed breakpad crash handler: {}", ctx.dumppath); + } else { + spdlog::warn("Failed to install breakpad crash handler: {}", ctx.dumppath); + } + } + } const auto profile = []() { Configuration c; diff --git a/src/meson.build b/src/meson.build index 25f94f0..956c41b 100644 --- a/src/meson.build +++ b/src/meson.build @@ -20,7 +20,7 @@ poi_sourceset.add(mod_qt5.preprocess( )) poi_sourceset.add(files( - 'main.cpp', 'builtins.cpp', 'crashhandler.cpp', + 'main.cpp', 'builtins.cpp', 'browser.cpp', 'util.cpp', 'util.h', @@ -53,3 +53,5 @@ poi_sourceset.add(files( interfaces_moc, version_h, poi_settings_h ) +poi_sourceset.add(when: [dep_breakpad, dep_threads], if_true: files('crashhandler.cpp')) + -- cgit v1.2.1