aboutsummaryrefslogtreecommitdiff
path: root/src/crashhandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/crashhandler.cpp')
-rw-r--r--src/crashhandler.cpp44
1 files changed, 31 insertions, 13 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;
+}