Feature #17616 ยป ruby-linux-non_glibc-libunwind-backtrace.patch
| configure.ac | ||
|---|---|---|
|
AC_CHECK_FUNCS(procstat_getvmmap)
|
||
|
])
|
||
|
])
|
||
|
AC_CHECK_HEADERS([execinfo.h])
|
||
|
AS_CASE(["$target_cpu-$target_os"],
|
||
|
[*-linux*], [
|
||
|
AS_IF([test "x$ac_cv_header_execinfo_h" = xno], [
|
||
|
AC_CHECK_LIB([unwind], [unw_backtrace])
|
||
|
])],
|
||
|
[*-darwin*], [
|
||
|
AC_CHECK_HEADERS([libproc.h])
|
||
|
AC_CHECK_HEADERS([execinfo.h])
|
||
|
AS_IF([test "x$ac_cv_header_execinfo_h" = xyes], [
|
||
|
AC_CHECK_LIB([execinfo], [backtrace])
|
||
|
AC_CHECK_HEADERS([libunwind.h])
|
||
|
])],
|
||
|
[*-freebsd*|x86_64-netbsd*], [
|
||
|
AC_CHECK_HEADERS([execinfo.h])
|
||
|
AS_IF([test "x$ac_cv_header_execinfo_h" = xyes], [
|
||
|
AC_CHECK_LIB([execinfo], [backtrace])
|
||
|
AC_CHECK_LIB([unwind], [unw_backtrace])
|
||
|
-- a/vm.c
|
||
|
++ b/vm.c
|
||
| ... | ... | |
|
nsdr(VALUE self)
|
||
|
{
|
||
|
VALUE ary = rb_ary_new();
|
||
|
#if HAVE_BACKTRACE
|
||
|
#if HAVE_BACKTRACE && defined(HAVE_EXECINFO_H)
|
||
|
#include <execinfo.h>
|
||
|
#define MAX_NATIVE_TRACE 1024
|
||
|
static void *trace[MAX_NATIVE_TRACE];
|
||
|
-- a/vm_dump.c
|
||
|
++ b/vm_dump.c
|
||
| ... | ... | |
|
#if defined(HAVE_BACKTRACE)
|
||
|
# ifdef HAVE_LIBUNWIND
|
||
|
# ifdef __linux__
|
||
|
# include <libunwind.h>
|
||
|
# endif
|
||
|
# undef backtrace
|
||
|
# define backtrace unw_backtrace
|
||
|
# elif defined(__APPLE__) && defined(__x86_64__) && defined(HAVE_LIBUNWIND_H)
|
||
| ... | ... | |
|
#endif
|
||
|
#if HAVE_BACKTRACE
|
||
|
# include <execinfo.h>
|
||
|
# ifdef HAVE_EXECINFO_H
|
||
|
# include <execinfo.h>
|
||
|
# endif
|
||
|
#elif defined(_WIN32)
|
||
|
# include <imagehlp.h>
|
||
|
# ifndef SYMOPT_DEBUG
|
||
| ... | ... | |
|
int n = (int)backtrace(trace, MAX_NATIVE_TRACE);
|
||
|
#if (defined(USE_ELF) || defined(HAVE_MACH_O_LOADER_H)) && defined(HAVE_DLADDR) && !defined(__sparc)
|
||
|
rb_dump_backtrace_with_lines(n, trace);
|
||
|
#else
|
||
|
#elif defined(HAVE_EXECINFO_H)
|
||
|
char **syms = backtrace_symbols(trace, n);
|
||
|
if (syms) {
|
||
|
int i;
|
||