diff --git a/ChangeLog b/ChangeLog index ccfdb56aea..0fad107c80 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Tue Apr 2 16:00:06 2013 NARUSE, Yui + + * vm_dump.c (rb_print_backtrace): separate to ease showing C backtrace. + + * internal.h (rb_print_backtrace): ditto. + Tue Apr 2 15:22:09 2013 NARUSE, Yui * test/ruby/envutil.rb (assert_separately): stop_auto_run of diff --git a/internal.h b/internal.h index fccbeb64f7..6cb6b91589 100644 --- a/internal.h +++ b/internal.h @@ -336,6 +336,7 @@ VALUE rb_sourcefilename(void); /* vm_dump.c */ void rb_vm_bugreport(void); +void rb_print_backtrace(void); /* vm_eval.c */ void Init_vm_eval(void); diff --git a/vm_dump.c b/vm_dump.c index 54de8ca6fc..d0bfe59e80 100644 --- a/vm_dump.c +++ b/vm_dump.c @@ -674,6 +674,34 @@ dump_thread(void *arg) } #endif +void +rb_print_backtrace(void) +{ +#if HAVE_BACKTRACE +#define MAX_NATIVE_TRACE 1024 + static void *trace[MAX_NATIVE_TRACE]; + int n = backtrace(trace, MAX_NATIVE_TRACE); + char **syms = backtrace_symbols(trace, n); + + if (syms) { +#ifdef USE_ELF + rb_dump_backtrace_with_lines(n, trace, syms); +#else + int i; + for (i=0; i