Feature #17638 » ruby-libbacktrace-using-backtrace.patch
| vm_dump.c | ||
|---|---|---|
|
}
|
||
|
#endif
|
||
|
#if defined(USE_LIBBACKTRACE)
|
||
|
void
|
||
|
libbacktrace_cb_error(void *data, const char *msg, int errnum)
|
||
|
{
|
||
|
fprintf(stderr, "libbacktrace error: msg: %s, errnum: %d\n", msg, errnum);
|
||
|
}
|
||
|
void
|
||
|
libbacktrace_cb_syminfo(void *data, uintptr_t pc, const char *symname, uintptr_t symval, uintptr_t symsize)
|
||
|
{
|
||
|
if (symname != NULL) {
|
||
|
fprintf(stderr, "[0x%"PRIxPTR"] %s+0x%"PRIxPTR"\n", pc, symname, pc-symval);
|
||
|
} else {
|
||
|
fprintf(stderr, "[0x%"PRIxPTR"]\n", pc);
|
||
|
}
|
||
|
}
|
||
|
int
|
||
|
libbacktrace_cb_pcinfo(void *data, uintptr_t pc, const char *filename, int lineno, const char *function)
|
||
|
{
|
||
|
if (filename != NULL) {
|
||
|
fprintf(stderr, "\t%s:%d\n", filename, lineno);
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
#endif
|
||
|
void
|
||
|
rb_print_backtrace(void)
|
||
|
{
|
||
|
#if defined(USE_LIBBACKTRACE)
|
||
|
struct backtrace_state *state = backtrace_create_state(NULL, 0, NULL, NULL);
|
||
|
backtrace_print(state, 0, stderr);
|
||
|
#elif HAVE_BACKTRACE
|
||
|
#endif
|
||
|
#if HAVE_BACKTRACE
|
||
|
#define MAX_NATIVE_TRACE 1024
|
||
|
static void *trace[MAX_NATIVE_TRACE];
|
||
|
int n = (int)backtrace(trace, MAX_NATIVE_TRACE);
|
||
|
#if (defined(USE_ELF) || defined(HAVE_MACH_O_LOADER_H)) && defined(HAVE_DLADDR) && !defined(__sparc)
|
||
|
int i;
|
||
|
#if defined(USE_LIBBACKTRACE)
|
||
|
for (i = 0; i < n; i++) {
|
||
|
#if defined(__arm__)
|
||
|
uintptr_t pc = ((uintptr_t)trace[i] & (~1)) - 1;
|
||
|
#else
|
||
|
uintptr_t pc = (uintptr_t)trace[i] - 1;
|
||
|
#endif
|
||
|
backtrace_syminfo(state, pc, libbacktrace_cb_syminfo, libbacktrace_cb_error, NULL);
|
||
|
backtrace_pcinfo(state, pc, libbacktrace_cb_pcinfo, libbacktrace_cb_error, NULL);
|
||
|
}
|
||
|
#elif (defined(USE_ELF) || defined(HAVE_MACH_O_LOADER_H)) && defined(HAVE_DLADDR) && !defined(__sparc)
|
||
|
rb_dump_backtrace_with_lines(n, trace);
|
||
|
#elif defined(HAVE_EXECINFO_H)
|
||
|
char **syms = backtrace_symbols(trace, n);
|
||
| ... | ... | |
|
free(syms);
|
||
|
}
|
||
|
#endif
|
||
|
#elif defined(USE_LIBBACKTRACE)
|
||
|
backtrace_print(state, 0, stderr);
|
||
|
#elif defined(_WIN32)
|
||
|
DWORD tid = GetCurrentThreadId();
|
||
|
HANDLE th = (HANDLE)_beginthread(dump_thread, 0, &tid);
|
||