From: Vicent Marti Date: Thu, 2 Dec 2010 19:48:03 +0000 (+0200) Subject: Fix segfault handler in Mac OS X X-Git-Url: https://git.proxmox.com/?a=commitdiff_plain;h=599955586da1c3ad514f3e65f1081d2012ec862d;p=libgit2.git Fix segfault handler in Mac OS X Signed-off-by: Vicent Marti --- 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 #include #include -#include #include -#include -#include -#include -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) {