WIP: Use Boost.Stacktrace to print a stacktrace in case of unhandled errors

This commit is contained in:
Martchus 2021-10-20 22:18:03 +02:00
parent be92d5366c
commit e388f72b97
3 changed files with 34 additions and 0 deletions

View File

@ -592,6 +592,7 @@ SyncthingDir *SyncthingConnection::addDirInfo(std::vector<SyncthingDir> &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) {

View File

@ -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)

View File

@ -18,6 +18,9 @@
#include <c++utilities/application/commandlineutils.h>
#include <c++utilities/misc/parseerror.h>
#include <boost/stacktrace/stacktrace.hpp>
#include <boost/stacktrace/safe_dump_to.hpp>
#include <qtutilities/resources/importplugin.h>
#include <qtutilities/resources/qtconfigarguments.h>
#include <qtutilities/resources/resources.h>
@ -29,6 +32,9 @@
#include <QSettings>
#include <QStringBuilder>
#include <csignal>
#include <fstream>
#include <iostream>
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);
}