diff --git a/CMakeLists.txt b/CMakeLists.txt index 320b4678..4b023d48 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -265,7 +265,10 @@ set(PROJECT_VERSION ${CPACK_PACKAGE_VERSION}) message(STATUS "Version: ${PROJECT_VERSION}") cmake_host_system_information(RESULT BUILD_HOST QUERY HOSTNAME) -set(BUILD_USER $ENV{USER}) + +include(CheckSymbolExists) +check_symbol_exists(backtrace_symbols_fd "execinfo.h" HAVE_BACKTRACE_SYMBOLS_FD) + configure_file(cmake/nheko.h config/nheko.h) @@ -607,6 +610,10 @@ if(WIN32) target_compile_definitions(nheko PRIVATE _WIN32_WINNT=0x0601) else() add_executable (nheko ${OS_BUNDLE} ${NHEKO_DEPS}) + + if (HAVE_BACKTRACE_SYMBOLS_FD AND NOT CMAKE_BUILD_TYPE STREQUAL "Release") + set_target_properties(nheko PROPERTIES ENABLE_EXPORTS ON) + endif() endif() if(APPLE) diff --git a/cmake/nheko.h b/cmake/nheko.h index bf1a54fe..c2329917 100644 --- a/cmake/nheko.h +++ b/cmake/nheko.h @@ -1,6 +1,9 @@ namespace nheko { constexpr auto version = "${PROJECT_VERSION}"; -constexpr auto build_user = "${BUILD_USER}@${BUILD_HOST}"; constexpr auto build_os = "${CMAKE_HOST_SYSTEM_NAME}"; constexpr auto enable_debug_log = ${SPDLOG_DEBUG_ON}; } + +// clang-format off +#define HAVE_BACKTRACE_SYMBOLS_FD ${HAVE_BACKTRACE_SYMBOLS_FD} +// clang-format on diff --git a/src/Olm.h b/src/Olm.h index d356cb55..8479f4f2 100644 --- a/src/Olm.h +++ b/src/Olm.h @@ -4,8 +4,6 @@ #pragma once -#include - #include #include #include diff --git a/src/main.cpp b/src/main.cpp index fe1a9ee3..f4484f94 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -40,15 +40,48 @@ QQmlDebuggingEnabler enabler; #endif -#if defined(Q_OS_LINUX) -#include +#if HAVE_BACKTRACE_SYMBOLS_FD #include +#include +#include +#include void stacktraceHandler(int signum) { std::signal(signum, SIG_DFL); - boost::stacktrace::safe_dump_to("./nheko-backtrace.dump"); + + // boost::stacktrace::safe_dump_to("./nheko-backtrace.dump"); + + // see + // https://stackoverflow.com/questions/77005/how-to-automatically-generate-a-stacktrace-when-my-program-crashes/77336#77336 + void *array[50]; + size_t size; + + // get void*'s for all entries on the stack + size = backtrace(array, 50); + + // print out all the frames to stderr + fprintf(stderr, "Error: signal %d:\n", signum); + backtrace_symbols_fd(array, size, STDERR_FILENO); + + int file = ::open("/tmp/nheko-crash.dump", + O_CREAT | O_WRONLY | O_TRUNC +#if defined(S_IWUSR) && defined(S_IRUSR) + , + S_IWUSR | S_IRUSR +#elif defined(S_IWRITE) && defined(S_IREAD) + , + S_IWRITE | S_IREAD +#endif + ); + if (file != -1) { + constexpr char header[] = "Error: signal\n"; + write(file, header, std::size(header) - 1); + backtrace_symbols_fd(array, size, file); + close(file); + } + std::raise(SIGABRT); }