From e388f72b97a1f9e96a9aeb01390dbbc47d32e2a4 Mon Sep 17 00:00:00 2001 From: Martchus Date: Wed, 20 Oct 2021 22:18:03 +0200 Subject: [PATCH] WIP: Use Boost.Stacktrace to print a stacktrace in case of unhandled errors --- connector/syncthingconnection.cpp | 1 + tray/CMakeLists.txt | 3 +++ tray/application/main.cpp | 30 ++++++++++++++++++++++++++++++ 3 files changed, 34 insertions(+) diff --git a/connector/syncthingconnection.cpp b/connector/syncthingconnection.cpp index 750db9a..31da780 100644 --- a/connector/syncthingconnection.cpp +++ b/connector/syncthingconnection.cpp @@ -592,6 +592,7 @@ SyncthingDir *SyncthingConnection::addDirInfo(std::vector &dirs, c */ SyncthingDev *SyncthingConnection::findDevInfo(const QString &devId, int &row) { + throw std::runtime_error("foobar"); row = 0; for (SyncthingDev &d : m_devs) { if (d.id == devId) { diff --git a/tray/CMakeLists.txt b/tray/CMakeLists.txt index 9a4bf1c..82748cc 100644 --- a/tray/CMakeLists.txt +++ b/tray/CMakeLists.txt @@ -114,6 +114,9 @@ if (NOT QT_FORK_AWESOME_ICON_ENGINE_LIB_IS_SHARED) use_qt_fork_awesome_icon_engine() endif () +# use Boost.Stacktrace to print stacktraces in case of fatal errors +use_package(TARGET_NAME Boost::stacktrace_basic PACKAGE_NAME Boost PACKAGE_ARGS "COMPONENTS;stacktrace_basic") + # link also explicitly against the following Qt modules list(APPEND ADDITIONAL_QT_MODULES Network) diff --git a/tray/application/main.cpp b/tray/application/main.cpp index d70c009..b6ea9c9 100644 --- a/tray/application/main.cpp +++ b/tray/application/main.cpp @@ -18,6 +18,9 @@ #include #include +#include +#include + #include #include #include @@ -29,6 +32,9 @@ #include #include +#include +#include + #include using namespace std; @@ -237,7 +243,31 @@ int runApplication(int argc, const char *const *argv) return res; } +static void printStackTrace() +{ + try { + std::cerr << boost::stacktrace::stacktrace(); + } catch (...) {} + std::abort(); +} + +static void printStackTraceFromSignalHandler(int signal) +{ + std::signal(SIGSEGV, SIG_DFL); + std::signal(SIGABRT, SIG_DFL); + boost::stacktrace::safe_dump_to(PROJECT_VARNAME "-stacktrace-dump.bin"); + std::raise(signal); +} + int main(int argc, char *argv[]) { + std::set_terminate(&printStackTrace); + std::signal(SIGABRT, &printStackTraceFromSignalHandler); + std::signal(SIGSEGV, &printStackTraceFromSignalHandler); + if (auto stacktraceFile = std::ifstream("stacktrace.bin", std::ios_base::in | std::ios_base::binary); stacktraceFile.is_open()) { + std::cerr << "Last execution crashed:\n" << boost::stacktrace::stacktrace::from_dump(stacktraceFile); + std::rename(PROJECT_VARNAME "-stacktrace-dump.bin", PROJECT_VARNAME "-stacktrace-dump.bin.bak"); + } + return runApplication(argc, argv); }