From 69501590eec9c1bc6c7640d17b01ad4d2ce007a5 Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Thu, 5 Nov 2009 17:00:03 -0500 Subject: Make default fatal error handler nicer. If we can, only exit the current thread, and print a backtrace. --- libdimension/error.c | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) (limited to 'libdimension/error.c') diff --git a/libdimension/error.c b/libdimension/error.c index da7b8bd..c3c9b60 100644 --- a/libdimension/error.c +++ b/libdimension/error.c @@ -18,10 +18,15 @@ * . * *************************************************************************/ +#define _GNU_SOURCE +#include +#include /* For gettid() where supported */ +#include /* For backtrace() etc. */ + #include "dimension.h" #include -#include /* For fprintf() */ -#include /* For exit() */ +#include /* For fprintf() */ +#include /* For exit() */ static void dmnsn_default_fatal_error_fn(); static dmnsn_fatal_error_fn *dmnsn_fatal = &dmnsn_default_fatal_error_fn; @@ -131,5 +136,25 @@ void dmnsn_set_fatal_error_fn(dmnsn_fatal_error_fn *fatal) static void dmnsn_default_fatal_error_fn() { + const unsigned int size = 64; + void *buffer[size]; + + int nptrs = backtrace(buffer, size); + /* buffer + 1 to hide this static function */ + backtrace_symbols_fd(buffer + 1, nptrs - 1, STDERR_FILENO); + +#ifdef SYS_gettid + pid_t pid = getpid(), + tid = syscall(SYS_gettid); + + if (pid == tid) { + exit(EXIT_FAILURE); + } else { + int *ret = malloc(sizeof(int)); + *ret = 1; + pthread_exit(ret); + } +#else exit(EXIT_FAILURE); +#endif } -- cgit v1.2.3