WIP: Use Boost.Stacktrace to print a stacktrace in case of unhandled errors
This commit is contained in:
parent
be92d5366c
commit
e388f72b97
|
@ -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) {
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue