-
Notifications
You must be signed in to change notification settings - Fork 16
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
338460a
commit 02a6f46
Showing
2 changed files
with
116 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,113 @@ | ||
diff --git a/common/linux_stack_trace.c b/common/linux_stack_trace.c | ||
index 800e1a6..0bf381d 100644 | ||
--- a/common/linux_stack_trace.c | ||
+++ b/common/linux_stack_trace.c | ||
@@ -56,108 +56,5 @@ extern char g_exe_name[256]; | ||
|
||
void signal_stack_trace_print(int signum, siginfo_t *info, void *ptr) | ||
{ | ||
- static const char *si_codes[3] = {"", "SEGV_MAPERR", "SEGV_ACCERR"}; | ||
- | ||
- int i, f = 0; | ||
- ucontext_t *ucontext; | ||
- Dl_info dlinfo; | ||
- void **bp = NULL; | ||
- void *ip = NULL; | ||
- char cmd[256]; | ||
- char buff[256]; | ||
- char output[8 * 1024]; | ||
- char *pCurrent; | ||
- | ||
- pCurrent = output; | ||
- ucontext = (ucontext_t*)ptr; | ||
- pCurrent += sprintf(pCurrent, "Segmentation Fault!\n"); | ||
- pCurrent += sprintf(pCurrent, "\tinfo.si_signo = %d\n", signum); | ||
- pCurrent += sprintf(pCurrent, "\tinfo.si_errno = %d\n", info->si_errno); | ||
- pCurrent += sprintf(pCurrent, "\tinfo.si_code = %d (%s)\n", \ | ||
- info->si_code, si_codes[info->si_code]); | ||
- pCurrent += sprintf(pCurrent, "\tinfo.si_addr = %p\n", info->si_addr); | ||
- for(i = 0; i < NGREG; i++) | ||
- { | ||
- pCurrent += sprintf(pCurrent, "\treg[%02d] = 0x"REGFORMAT"\n", | ||
- i, ucontext->uc_mcontext.gregs[i]); | ||
- } | ||
- | ||
-#ifndef SIGSEGV_NOSTACK | ||
-#if defined(SIGSEGV_STACK_IA64) || defined(SIGSEGV_STACK_X86) | ||
-#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 | ||
- | ||
- pCurrent += sprintf(pCurrent, "\tStack trace:\n"); | ||
- while(bp && ip) | ||
- { | ||
- const char *symname; | ||
-#ifndef NO_CPP_DEMANGLE | ||
- int status; | ||
- char * tmp; | ||
-#endif | ||
- | ||
- if(!dladdr(ip, &dlinfo)) | ||
- { | ||
- break; | ||
- } | ||
- | ||
- symname = dlinfo.dli_sname; | ||
- | ||
-#ifndef NO_CPP_DEMANGLE | ||
- tmp = __cxa_demangle(symname, NULL, 0, &status); | ||
- | ||
- if (status == 0 && tmp) | ||
- { | ||
- symname = tmp; | ||
- } | ||
-#endif | ||
- | ||
- sprintf(cmd, "addr2line -e %s %p", g_exe_name, ip); | ||
- if (getExecResult(cmd, buff, sizeof(buff)) != 0) | ||
- { | ||
- *buff = '0'; | ||
- } | ||
- | ||
- pCurrent += sprintf(pCurrent, "\t\t% 2d: %p <%s+%lu> (%s in %s)\n", | ||
- ++f, ip, symname, | ||
- (unsigned long)ip-(unsigned long)dlinfo.dli_saddr, | ||
- trim_right(buff), 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 | ||
- pCurrent += sprintf(pCurrent, "\tStack trace (non-dedicated):\n"); | ||
- sz = backtrace(bt, 20); | ||
- strings = backtrace_symbols(bt, sz); | ||
- for(i = 0; i < sz; ++i) | ||
- { | ||
- pCurrent += sprintf(pCurrent, "\t\t%s\n", strings[i]); | ||
- } | ||
-#endif | ||
- pCurrent += sprintf(pCurrent, "\tEnd of stack trace.\n"); | ||
-#else | ||
- pCurrent += sprintf(pCurrent, "\tNot printing stack strace.\n"); | ||
-#endif | ||
- | ||
- log_it_ex(&g_log_context, LOG_CRIT, output, pCurrent - output); | ||
} | ||
|