yarv-diff:409
From: ko1 atdot.net
Date: 8 Nov 2006 17:26:25 +0900
Subject: [yarv-diff:409] r577 - trunk
Author: ko1
Date: 2006-11-08 17:26:24 +0900 (Wed, 08 Nov 2006)
New Revision: 577
Modified:
trunk/ChangeLog
trunk/configure.in
trunk/error.c
trunk/vm_dump.c
trunk/yarvcore.c
Log:
* vm_dump.c : show C level backtrace (pointer only) with
backtrace() function (glibc feature)
* configure.in : ditto
* yarvcore.c : add NSDR method (show C level backtrace)
* error.c : fix indent
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2006-11-07 04:23:15 UTC (rev 576)
+++ trunk/ChangeLog 2006-11-08 08:26:24 UTC (rev 577)
@@ -4,6 +4,18 @@
# from Mon, 03 May 2004 01:24:19 +0900
#
+2006-11-08(Wed) 17:23:23 +0900 Koichi Sasada <ko1 atdot.net>
+
+ * vm_dump.c : show C level backtrace (pointer only) with
+ backtrace() function (glibc feature)
+
+ * configure.in : ditto
+
+ * yarvcore.c : add NSDR method (show C level backtrace)
+
+ * error.c : fix indent
+
+
2006-11-07(Tue) 13:17:10 +0900 Koichi Sasada <ko1 atdot.net>
* eval.c (rb_set_errinfo) : added
Modified: trunk/configure.in
===================================================================
--- trunk/configure.in 2006-11-07 04:23:15 UTC (rev 576)
+++ trunk/configure.in 2006-11-08 08:26:24 UTC (rev 577)
@@ -832,6 +832,8 @@
fi
fi
+AC_CHECK_FUNCS(backtrace)
+
dnl default value for $KANJI
DEFAULT_KCODE="KCODE_NONE"
Modified: trunk/error.c
===================================================================
--- trunk/error.c 2006-11-07 04:23:15 UTC (rev 576)
+++ trunk/error.c 2006-11-08 08:26:24 UTC (rev 577)
@@ -153,22 +153,23 @@
void
rb_bug(const char *fmt, ...)
{
- char buf[BUFSIZ];
- va_list args;
- FILE *out = stderr;
- int len = err_position(buf, BUFSIZ);
-
- if (fwrite(buf, 1, len, out) == len ||
- fwrite(buf, 1, len, (out = stdout)) == len) {
- yarv_bug();
- fputs("[BUG] ", out);
- va_start(args, fmt);
- vfprintf(out, fmt, args);
- va_end(args);
- fprintf(out, "\nruby %s (%s) [%s]\n\n",
- ruby_version, ruby_release_date, ruby_platform);
- }
- abort();
+ char buf[BUFSIZ];
+ va_list args;
+ FILE *out = stderr;
+ int len = err_position(buf, BUFSIZ);
+
+ if (fwrite(buf, 1, len, out) == len ||
+ fwrite(buf, 1, len, (out = stdout)) == len) {
+ yarv_bug();
+ fputs("[BUG] ", out);
+ va_start(args, fmt);
+ vfprintf(out, fmt, args);
+ va_end(args);
+ fprintf(out, "\nruby %s (%s) [%s]\n\n",
+ ruby_version, ruby_release_date, ruby_platform);
+ }
+
+ abort();
}
static struct types {
Modified: trunk/vm_dump.c
===================================================================
--- trunk/vm_dump.c 2006-11-07 04:23:15 UTC (rev 576)
+++ trunk/vm_dump.c 2006-11-08 08:26:24 UTC (rev 577)
@@ -561,8 +561,6 @@
return Qnil;
}
-
-
void
yarv_bug()
{
@@ -579,4 +577,20 @@
dp(RARRAY_PTR(bt)[i]);
}
}
+
+#if HAVE_BACKTRACE
+#include <execinfo.h>
+#define MAX_NATIVE_TRACE 1024
+ {
+ static void *trace[MAX_NATIVE_TRACE];
+ int n = backtrace(trace, MAX_NATIVE_TRACE);
+ int i;
+
+ printf("-- backtrace of native function call (Use addr2line) --\n");
+ for (i=0; i<n; i++) {
+ printf("%p\n", trace[i]);
+ }
+ printf("-------------------------------------------------------\n");
+ }
+#endif
}
Modified: trunk/yarvcore.c
===================================================================
--- trunk/yarvcore.c 2006-11-07 04:23:15 UTC (rev 576)
+++ trunk/yarvcore.c 2006-11-08 08:26:24 UTC (rev 577)
@@ -830,6 +830,30 @@
return Qnil;
}
+static VALUE
+nsdr(void)
+{
+ VALUE ary = rb_ary_new();
+#if HAVE_BACKTRACE
+#include <execinfo.h>
+#define MAX_NATIVE_TRACE 1024
+ static void *trace[MAX_NATIVE_TRACE];
+ int n = backtrace(trace, MAX_NATIVE_TRACE);
+ char **syms = backtrace_symbols(trace, n);
+ int i;
+
+ if (syms == 0) {
+ rb_memerror();
+ }
+
+ for (i=0; i<n; i++) {
+ rb_ary_push(ary, rb_str_new2(syms[i]));
+ }
+ free(syms);
+#endif
+ return ary;
+}
+
char yarv_version[0x20];
char *yarv_options = ""
#if OPT_DIRECT_THREADED_CODE
@@ -940,6 +964,7 @@
rb_define_global_function("segv", yarv_segv, 0);
rb_define_global_function("cfunc", cfunc, 0);
rb_define_global_function("SDR", sdr, 0);
+ rb_define_global_function("NSDR", nsdr, 0);
symIFUNC = ID2SYM(rb_intern("<IFUNC>"));
symCFUNC = ID2SYM(rb_intern("<CFUNC>"));
--
ML: yarv-diff quickml.atdot.net
Info: http://www.atdot.net/~ko1/quickml