diff options
author | Drew DeVault <sir@cmpwn.com> | 2015-08-24 21:40:38 -0400 |
---|---|---|
committer | Drew DeVault <sir@cmpwn.com> | 2015-08-24 21:40:38 -0400 |
commit | 2e755cf13fb653a397a8895121184322dc1dcdd6 (patch) | |
tree | 0c193e7e81b497510e7e4927df5e105749ae8b24 | |
parent | dbad30a409b83d2e327e5eb2a53b46f12e462258 (diff) | |
parent | 7c5b6f8c5285c1ddb8604875a48c7798367cf8ad (diff) |
Merge pull request #125 from Luminarys/master
Added in backtrace printing
-rw-r--r-- | include/log.h | 1 | ||||
-rw-r--r-- | sway/log.c | 25 |
2 files changed, 26 insertions, 0 deletions
diff --git a/include/log.h b/include/log.h index 3d77769c..945ad239 100644 --- a/include/log.h +++ b/include/log.h @@ -16,6 +16,7 @@ void sway_log(log_importance_t verbosity, const char* format, ...) __attribute__ void sway_log_errno(log_importance_t verbosity, char* format, ...) __attribute__((format(printf,2,3))); void sway_abort(const char* format, ...) __attribute__((format(printf,1,2))); bool sway_assert(bool condition, const char* format, ...) __attribute__((format(printf,2,3))); +void error_handler(int sig); void layout_log(const swayc_t *c, int depth); #endif @@ -8,6 +8,7 @@ #include <signal.h> #include <errno.h> #include <string.h> +#include <execinfo.h> int colored = 1; log_importance_t v = L_SILENT; @@ -30,6 +31,8 @@ void init_log(log_importance_t verbosity) { fcntl(fd[i], F_SETFD, flag | FD_CLOEXEC); } } + signal(SIGSEGV, error_handler); + signal(SIGABRT, error_handler); } void sway_log_colors(int mode) { @@ -114,6 +117,28 @@ bool sway_assert(bool condition, const char* format, ...) { return false; } +void error_handler(int sig) { + int i; + int max_lines = 20; + void *array[max_lines]; + char **bt; + size_t bt_len; + + sway_log(L_ERROR, "Error: Signal %d. Printing backtrace", sig); + bt_len = backtrace(array, max_lines); + bt = backtrace_symbols(array, bt_len); + if (!bt) { + sway_log(L_ERROR, "Could not allocate sufficient memory for backtrace_symbols(), falling back to stderr"); + backtrace_symbols_fd(array, bt_len, STDERR_FILENO); + exit(1); + } + + for (i = 0; (size_t)i < bt_len; i++) { + sway_log(L_ERROR, "Backtrace: %s", bt[i]); + } + exit(1); +} + #include "workspace.h" /* XXX:DEBUG:XXX */ |