aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAqua-sama <aqua@iserlohn-fortress.net>2020-01-03 21:58:20 +0200
committerAqua-sama <aqua@iserlohn-fortress.net>2020-01-03 23:28:39 +0200
commit0642a0910ca0fb8e392636254684b91637a7b542 (patch)
tree4fa4328fcdf205b80103d5255ea1570439b46cce /src
parentMerge some QoL improvements from staging branch (diff)
downloadsmolbote-0642a0910ca0fb8e392636254684b91637a7b542.tar.xz
PKGBUILD: add install stage for debug symbols
- make toggling breakpad work properly
Diffstat (limited to 'src')
-rw-r--r--src/crashhandler.cpp44
-rw-r--r--src/crashhandler.h38
-rw-r--r--src/main.cpp32
-rw-r--r--src/meson.build4
4 files changed, 67 insertions, 51 deletions
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 <QByteArray>
+#include <client/linux/handler/exception_handler.h>
#include <unistd.h>
-//#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<BreakpadContext *>(context);
+ auto *ctx = static_cast<CrashHandler::Context *>(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 <client/linux/handler/exception_handler.h>
-#endif
+#include <string>
-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<std::string>("browser.crash.path").value_or("/tmp");
- assert(!crashpath.empty());
-
- CrashHandler::BreakpadContext ctx;
- google_breakpad::MinidumpDescriptor descriptor(crashpath.c_str());
-
- const auto crashHandler = config->value<std::string>("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<bool>("usebreakpad").value()) {
+ CrashHandler::Context ctx(
+ conf.value<std::string>("path.crashdump").value(),
+ conf.value<std::string>("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'))
+