-/* signal seg reaches, this function will run */
-static void ms_signal_segv(int signum, siginfo_t * info, void * ptr) {
- int i;
-
- UNUSED_ARGUMENT(signum);
- UNUSED_ARGUMENT(info);
- UNUSED_ARGUMENT(ptr);
-
- pthread_mutex_lock(&ms_global.quit_mutex);
- fprintf(stderr, "Segmentation fault occurred.\n");
-
-#if defined(SIGSEGV_STACK_X86) || defined(SIGSEGV_STACK_IA64)
- int f = 0;
- Dl_info dlinfo;
- void **bp = 0;
- void *ip = 0;
-#else
- void *bt[20];
- char **strings;
- int sz;
-#endif
-
-#if defined(SIGSEGV_STACK_X86) || defined(SIGSEGV_STACK_IA64)
-#if defined(SIGSEGV_STACK_IA64)
- ip = (void*)ucontext->uc_mcontext.gregs[REG_RIP];
- bp = (void**)ucontext->uc_mcontext.gregs[REG_RBP];
-#elif defined(SIGSEGV_STACK_X86)
- ip = (void*)ucontext->uc_mcontext.gregs[REG_EIP];
- bp = (void**)ucontext->uc_mcontext.gregs[REG_EBP];
-#endif
-
- fprintf(stderr, "Stack trace:\n");
- while(bp && ip) {
- if(!dladdr(ip, &dlinfo))
- break;
-
- const char *symname = dlinfo.dli_sname;
-#ifndef NO_CPP_DEMANGLE
- int status;
- char *tmp = __cxa_demangle(symname, NULL, 0, &status);
-
- if(status == 0 && tmp)
- symname = tmp;
-#endif
-
- fprintf(stderr, "% 2d: %p <%s+%u> (%s)\n",
- ++f,
- ip,
- symname,
- (unsigned)(ip - dlinfo.dli_saddr),
- dlinfo.dli_fname);
-
-#ifndef NO_CPP_DEMANGLE
- if(tmp)
- free(tmp);
-#endif
-
- if(dlinfo.dli_sname && !strcmp(dlinfo.dli_sname, "main"))
- break;
-
- ip = bp[1];
- bp = (void**)bp[0];
- }
-#else
- fprintf(stderr, "Stack trace:\n");
- sz = backtrace(bt, 20);
- strings = backtrace_symbols(bt, sz);
-
- for(i = 0; i < sz; ++i)
- fprintf(stderr, "%s\n", strings[i]);
-#endif
- fprintf(stderr, "End of stack trace\n");
- pthread_mutex_unlock(&ms_global.quit_mutex);
- exit (1);
-}