diff options
author | Vicent Marti <tanoku@gmail.com> | 2010-12-02 21:48:03 +0200 |
---|---|---|
committer | Vicent Marti <tanoku@gmail.com> | 2010-12-02 21:48:03 +0200 |
commit | 599955586da1c3ad514f3e65f1081d2012ec862d (patch) | |
tree | b8cb38d71b8c757d5c6f68566c8d365da78ecad9 | |
parent | 691aa96817b9b4c6ad3a43b2d31d6e96a918a999 (diff) | |
download | libgit2-599955586da1c3ad514f3e65f1081d2012ec862d.tar.gz |
Fix segfault handler in Mac OS X
Signed-off-by: Vicent Marti <tanoku@gmail.com>
-rw-r--r-- | tests/test_main.c | 48 |
1 files changed, 9 insertions, 39 deletions
diff --git a/tests/test_main.c b/tests/test_main.c index 2fa1bcc14..35bcdd76c 100644 --- a/tests/test_main.c +++ b/tests/test_main.c @@ -32,48 +32,21 @@ * GCC only */ #ifdef __GNUC__ +#include <stdio.h> #include <execinfo.h> #include <signal.h> -#include <stdio.h> #include <stdlib.h> -#include <string.h> -#include <ucontext.h> -#include <unistd.h> -typedef struct _sig_ucontext { - unsigned long uc_flags; - struct ucontext *uc_link; - stack_t uc_stack; - struct sigcontext uc_mcontext; - sigset_t uc_sigmask; -} sig_ucontext_t; - -void crash_handler(int sig_num, siginfo_t *info, void *ucontext) +void crash_handler(int sig) { - void *array[50]; - void *caller_address; - char **messages; - int size, i; - - sig_ucontext_t *uc; - - uc = (sig_ucontext_t *)ucontext; - - caller_address = (void *)uc->uc_mcontext.eip; - - fprintf(stderr, "Signal %d (%s), address: %p from %p\n", - sig_num, strsignal(sig_num), info->si_addr, - (void *)caller_address); - - size = backtrace(array, 50); - array[1] = caller_address; - messages = backtrace_symbols(array, size); + void *array[10]; + size_t size; - for (i = 1; i < size && messages != NULL; ++i) - fprintf(stderr, "\t(%d) %s\n", i, messages[i]); + size = backtrace(array, 10); - free(messages); - exit(EXIT_FAILURE); + fprintf(stderr, "Error (signal %d)\n", sig); + backtrace_symbols_fd(array, size, 2); + exit(1); } #endif @@ -99,10 +72,7 @@ int main(int argc, char **argv) struct test_def *t; #ifdef __GNUC__ - struct sigaction sigact; - sigact.sa_sigaction = crash_handler; - sigact.sa_flags = SA_RESTART | SA_SIGINFO; - sigaction(SIGSEGV, &sigact, (struct sigaction *)NULL); + signal(SIGSEGV, crash_handler); #endif if (argc == 1) { |