[前][次][番号順一覧][スレッド一覧][生データ]

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

[前][次][番号順一覧][スレッド一覧][生データ]