From 161b9562e42005bb42c714b55ddd2a748f086656 Mon Sep 17 00:00:00 2001 From: apathy Date: Tue, 19 Jul 2016 05:05:13 -0700 Subject: [PATCH] In GNUC environments make use of backtrace function from glibc. Using _GNUC_ wrapper, if needed I can added in a more robust configure time check for the specific header, but that seemed overkill for just this check. --- src/main.cpp | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 05da205..f81a1a9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -14,11 +14,23 @@ #include #include +#ifdef __GNUC__ +#include +#endif + INITIALIZE_EASYLOGGINGPP StationChatConfig BuildConfiguration(int argc, char* argv[]); +#ifdef __GNUC__ +void SignalHandler(int sig); +#endif + int main(int argc, char* argv[]) { +#ifdef __GNUC__ + signal(SIGSEGV, SignalHandler); +#endif + auto config = BuildConfiguration(argc, argv); el::Loggers::setDefaultConfigurations(config.loggerConfig, true); @@ -47,7 +59,7 @@ StationChatConfig BuildConfiguration(int argc, char* argv[]) { ("config,c", po::value(&configFile)->default_value("swgchat.cfg"), "sets path to the configuration file") ("logger_config", po::value(&config.loggerConfig)->default_value("logger.cfg"), - "setspath to the logger configuration file") + "sets path to the logger configuration file") ; po::options_description options("Configuration"); @@ -89,3 +101,15 @@ StationChatConfig BuildConfiguration(int argc, char* argv[]) { return config; } + +#ifdef __GNUC__ +void SignalHandler(int sig) { + const int BACKTRACE_LIMIT = 10; + void *arr[BACKTRACE_LIMIT]; + auto size = backtrace(arr, BACKTRACE_LIMIT); + + fprintf(stderr, "Error: signal %d:\n", sig); + backtrace_symbols_fd(arr, size, STDERR_FILENO); + exit(1); +} +#endif