[ruby-dev:50019] Re: メソッド呼び出し時の引数の値を VM 側で取得する方法について

From: Tetsuo Handa <penguin-kernel@...>
Date: 2017-03-13 10:18:53 UTC
List: ruby-dev #50019
 間が空いてしまいましたが、その後の状況についてです。

以下のパッチを適用すると、 make 中の Generating RDoc documentation という段階で
lib/rdoc/token_stream.rb:59: [BUG] Segmentation fault at 0x00000000000000 という
エラーが出るところまで進みました。

----------------------------------------
diff --git a/signal.c b/signal.c
index 888c8ea..29ba6c2 100644
--- a/signal.c
+++ b/signal.c
@@ -1415,7 +1415,7 @@ ruby_sig_finalize(void)
 
 int ruby_enable_coredump = 0;
 #ifndef RUBY_DEBUG_ENV
-#define ruby_enable_coredump 0
+//#define ruby_enable_coredump 0
 #endif
 
 /*
diff --git a/vm_insnhelper.c b/vm_insnhelper.c
index f04d836..9576489 100644
--- a/vm_insnhelper.c
+++ b/vm_insnhelper.c
@@ -1500,6 +1500,74 @@ vm_call_iseq_setup_2(rb_thread_t *th, rb_control_frame_t *cfp, struct rb_calling
     }
 }
 
+/* ///// */
+VALUE rb_class_path_no_cache(VALUE _klass);
+static void dump_function_entry(rb_thread_t *th, int argc, VALUE *argv)
+{
+    static FILE *fp = NULL;
+    static __thread _Bool dump_recurse = 0;
+    VALUE _klass = 0;
+    VALUE _id = 0;
+    if (dump_recurse)
+	return;
+    dump_recurse = 1;
+    if (!fp)
+	fp = fopen("/dev/null", "a"); //fp = fopen("/tmp/ruby.log", "a");
+    rb_thread_method_id_and_class((th), &_id, 0, &_klass);
+    if (!_klass || !fp) {
+	dump_recurse = 0;
+	return;
+    }
+    if (RB_TYPE_P(_klass, T_ICLASS))
+	_klass = RBASIC(_klass)->klass;
+    else if (FL_TEST(_klass, FL_SINGLETON))
+	_klass = rb_iv_get(_klass, "__attached__");
+    switch (TYPE(_klass)) {
+    case T_CLASS:
+    case T_ICLASS:
+    case T_MODULE:
+	{
+	    int i;
+	    volatile int raised = rb_threadptr_reset_raised(th);
+	    VALUE _name = rb_class_path_no_cache(_klass);
+	    const char *classname = !NIL_P(_name) ? StringValuePtr(_name) : "<unknown>";
+	    const char *methodname = rb_id2name(_id);
+	    const char *filename = rb_sourcefile();
+	    int state;
+	    fprintf(fp, "class=%s method=%s filename=%s line=%u argc=%u",
+		    classname, methodname, filename, rb_sourceline(), argc);
+	    fflush(fp);
+	    if (argc) {
+		    TH_PUSH_TAG(th);
+		    if ((state = TH_EXEC_TAG()) == 0) {
+		    for (i = 0; i < argc; i++) {
+			VALUE rstr;
+			char buff[0x100];
+			fprintf(fp, " argv[%u,%u]", i, TYPE(argv[i]));
+			fflush(fp);
+			fprintf(fp, "[%s]", rb_raw_obj_info(buff, 0x100, argv[i]));
+			fflush(fp);
+			rstr = rb_inspect(argv[i]);
+			fprintf(fp, "=");
+			fflush(fp);
+			fprintf(fp, "%s", StringValueCStr(rstr));
+			fflush(fp);
+		    }
+		    }
+		    TH_POP_TAG();
+	    }
+	    fprintf(fp, "\n");
+	    fflush(fp);
+	    if (raised)
+		rb_threadptr_set_raised(th);
+	    else
+		rb_threadptr_reset_raised(th);
+	    break;
+	}
+    }
+    dump_recurse = 0;
+}
+
 static inline VALUE
 vm_call_iseq_setup_normal(rb_thread_t *th, rb_control_frame_t *cfp, struct rb_calling_info *calling, const struct rb_call_info *ci, struct rb_call_cache *cc,
 			  int opt_pc, int param_size, int local_size)
@@ -1515,6 +1583,7 @@ vm_call_iseq_setup_normal(rb_thread_t *th, rb_control_frame_t *cfp, struct rb_ca
 		  iseq->body->iseq_encoded + opt_pc, sp,
 		  local_size - param_size,
 		  iseq->body->stack_max);
+    dump_function_entry(th, (int) (sp - argv), argv);
     return Qundef;
 }
 
@@ -1561,6 +1630,7 @@ vm_call_iseq_setup_tailcall(rb_thread_t *th, rb_control_frame_t *cfp, struct rb_
 		  iseq->body->iseq_encoded + opt_pc, sp,
 		  iseq->body->local_table_size - iseq->body->param.size,
 		  iseq->body->stack_max);
+    dump_function_entry(th, (int) (sp - argv), argv);
 
     cfp->sp = sp_orig;
     RUBY_VM_CHECK_INTS(th);
----------------------------------------

----------------------------------------
Generating RDoc documentation
Parsing sources...
/root/ruby/lib/rdoc/token_stream.rb:59: [BUG] Segmentation fault at 0x00000000000000
ruby 2.5.0dev (2017-03-13 trunk 57949) [x86_64-linux]

-- Control frame information -----------------------------------------------
c:0015 p:---- s:0107 e:000106 CFUNC  :inspect
c:0014 p:0000 s:0104 e:000103 METHOD /root/ruby/lib/rdoc/token_stream.rb:59
c:0013 p:0379 s:0099 e:000098 METHOD /root/ruby/lib/rdoc/parser/c.rb:671
c:0012 p:0284 s:0083 e:000082 METHOD /root/ruby/lib/rdoc/parser/c.rb:1061
c:0011 p:0067 s:0065 e:000064 BLOCK  /root/ruby/lib/rdoc/parser/c.rb:480 [FINISH]
c:0010 p:---- s:0056 e:000055 CFUNC  :scan
c:0009 p:0013 s:0051 e:000050 METHOD /root/ruby/lib/rdoc/parser/c.rb:461
c:0008 p:0043 s:0047 e:000046 METHOD /root/ruby/lib/rdoc/parser/c.rb:1259
c:0007 p:0231 s:0043 e:000042 METHOD /root/ruby/lib/rdoc/rdoc.rb:367
c:0006 p:0017 s:0031 e:000030 BLOCK  /root/ruby/lib/rdoc/rdoc.rb:419 [FINISH]
c:0005 p:---- s:0027 e:000026 CFUNC  :map
c:0004 p:0086 s:0023 e:000022 METHOD /root/ruby/lib/rdoc/rdoc.rb:417
c:0003 p:0254 s:0015 e:000014 METHOD /root/ruby/lib/rdoc/rdoc.rb:488
c:0002 p:0053 s:0008 E:001960 EVAL   ./bin/rdoc:20 [FINISH]
c:0001 p:0000 s:0003 E:002210 (none) [FINISH]

-- Ruby level backtrace information ----------------------------------------
../bin/rdoc:20:in `<main>'
/root/ruby/lib/rdoc/rdoc.rb:488:in `document'
/root/ruby/lib/rdoc/rdoc.rb:417:in `parse_files'
/root/ruby/lib/rdoc/rdoc.rb:417:in `map'
/root/ruby/lib/rdoc/rdoc.rb:419:in `block in parse_files'
/root/ruby/lib/rdoc/rdoc.rb:367:in `parse_file'
/root/ruby/lib/rdoc/parser/c.rb:1259:in `scan'
/root/ruby/lib/rdoc/parser/c.rb:461:in `do_methods'
/root/ruby/lib/rdoc/parser/c.rb:461:in `scan'
/root/ruby/lib/rdoc/parser/c.rb:480:in `block in do_methods'
/root/ruby/lib/rdoc/parser/c.rb:1061:in `handle_method'
/root/ruby/lib/rdoc/parser/c.rb:671:in `find_body'
/root/ruby/lib/rdoc/token_stream.rb:59:in `add_tokens'
/root/ruby/lib/rdoc/token_stream.rb:59:in `inspect'

-- Machine register context ------------------------------------------------
 RIP: 0x00007f54d1036fb6 RBP: 0x00007f54d3323080 RSP: 0x00007fff776ecd80
 RAX: 0x0000000000000000 RBX: 0x00007f54d3323050 RCX: 0x00007f54cfdd8c7d
 RDX: 0x0000000000000000 RDI: 0x00007f54d2a085d0 RSI: 0x00007f54d2b80300
  R8: 0x00007f54d0e8b740  R9: 0x00007f54d0e8b740 R10: 0x0000000000000019
 R11: 0x0000000000000000 R12: 0x00007f54d3324b88 R13: 0x00007f54d3324620
 R14: 0x0000000000000000 R15: 0x00007f54d0e89d40 EFL: 0x0000000000010246

-- C level backtrace information -------------------------------------------
/root/ruby/ruby(rb_vm_bugreport+0x528) [0x7f54d10cdf08] vm_dump.c:683
/root/ruby/ruby(rb_bug_context+0xd0) [0x7f54d10c3170] error.c:502
/root/ruby/ruby(sigsegv+0x3e) [0x7f54d0fbcb4e] signal.c:907
/lib64/libpthread.so.0 [0x7f54d0a74370]
/root/ruby/ruby(vm_exec_core+0x3c96) [0x7f54d1036fb6] insns.def:1066
/root/ruby/ruby(vm_exec+0x9c) [0x7f54d1039c4c] vm.c:1705
/root/ruby/ruby(rb_yield+0x47e) [0x7f54d104434e] vm.c:962
/root/ruby/ruby(rb_str_scan+0x24e) [0x7f54d0fd415e] string.c:8587
/root/ruby/ruby(vm_call_cfunc+0x100) [0x7f54d1031420] vm_insnhelper.c:1829
/root/ruby/ruby(vm_exec_core+0x2f3e) [0x7f54d103625e] insns.def:967
/root/ruby/ruby(vm_exec+0x9c) [0x7f54d1039c4c] vm.c:1705
/root/ruby/ruby(rb_yield+0x47e) [0x7f54d104434e] vm.c:962
/root/ruby/ruby(rb_ary_collect+0x5d) [0x7f54d1058fed] array.c:2739
/root/ruby/ruby(vm_call_cfunc+0x100) [0x7f54d1031420] vm_insnhelper.c:1829
/root/ruby/ruby(vm_call_method+0xe3) [0x7f54d103bac3] vm_insnhelper.c:2369
/root/ruby/ruby(vm_exec_core+0x2f3e) [0x7f54d103625e] insns.def:967
/root/ruby/ruby(vm_exec+0x9c) [0x7f54d1039c4c] vm.c:1705
/root/ruby/ruby(ruby_exec_internal+0xad) [0x7f54d0ec866d] eval.c:244
/root/ruby/ruby(ruby_run_node+0x2d) [0x7f54d0ecbbfd] eval.c:308
/root/ruby/ruby(main+0x5f) [0x7f54d0ec7e3f] main.c:36

-- Other runtime information -----------------------------------------------

* Loaded script: ./bin/rdoc

* Loaded features:

    0 enumerator.so
    1 thread.rb
    2 rational.so
    3 complex.so
    4 /root/ruby/.ext/x86_64-linux/enc/encdb.so
    5 /root/ruby/.ext/x86_64-linux/enc/trans/transdb.so
    6 /root/ruby/lib/unicode_normalize.rb
    7 /root/ruby/lib/rdoc.rb
    8 /root/ruby/lib/find.rb
    9 /root/ruby/.ext/x86_64-linux/etc.so
   10 /root/ruby/lib/fileutils.rb
   11 /root/ruby/.ext/x86_64-linux/pathname.so
   12 /root/ruby/.ext/common/pathname.rb
   13 /root/ruby/.ext/x86_64-linux/date_core.so
   14 /root/ruby/.ext/common/date.rb
   15 /root/ruby/lib/time.rb
   16 /root/ruby/rbconfig.rb
   17 /root/ruby/lib/rubygems/compatibility.rb
   18 /root/ruby/lib/rubygems/defaults.rb
   19 /root/ruby/lib/rubygems/deprecate.rb
   20 /root/ruby/lib/rubygems/errors.rb
   21 /root/ruby/lib/rubygems/version.rb
   22 /root/ruby/lib/rubygems/requirement.rb
   23 /root/ruby/lib/rubygems/platform.rb
   24 /root/ruby/lib/rubygems/basic_specification.rb
   25 /root/ruby/lib/rubygems/stub_specification.rb
   26 /root/ruby/lib/rubygems/util/list.rb
   27 /root/ruby/.ext/x86_64-linux/stringio.so
   28 /root/ruby/lib/rubygems/specification.rb
   29 /root/ruby/lib/rubygems/exceptions.rb
   30 /root/ruby/lib/rubygems/core_ext/kernel_gem.rb
   31 /root/ruby/lib/monitor.rb
   32 /root/ruby/lib/rubygems/core_ext/kernel_require.rb
   33 /root/ruby/lib/rubygems.rb
   34 /root/ruby/lib/rubygems/path_support.rb
   35 /root/ruby/.ext/x86_64-linux/cgi/escape.so
   36 /root/ruby/lib/cgi/util.rb
   37 /root/ruby/.ext/x86_64-linux/strscan.so
   38 /root/ruby/lib/erb.rb
   39 /root/ruby/lib/rdoc/generator.rb
   40 /root/ruby/lib/rubygems/dependency.rb
   41 /root/ruby/lib/rdoc/markup.rb
   42 /root/ruby/lib/rdoc/markup/formatter.rb
   43 /root/ruby/lib/rdoc/markup/to_joined_paragraph.rb
   44 /root/ruby/lib/rdoc/markdown/entities.rb
   45 /root/ruby/lib/rdoc/markdown/literals.rb
   46 /root/ruby/lib/rdoc/markdown.rb
   47 /root/ruby/lib/rdoc/rd.rb
   48 /root/ruby/lib/rdoc/markup/parser.rb
   49 /root/ruby/lib/rdoc/markup/pre_process.rb
   50 /root/ruby/lib/rdoc/tom_doc.rb
   51 /root/ruby/lib/rdoc/text.rb
   52 /root/ruby/lib/rdoc/code_object.rb
   53 /root/ruby/lib/rdoc/method_attr.rb
   54 /root/ruby/lib/cgi/core.rb
   55 /root/ruby/lib/cgi/cookie.rb
   56 /root/ruby/lib/cgi.rb
   57 /root/ruby/lib/rdoc/context.rb
   58 /root/ruby/lib/rdoc/class_module.rb
   59 /root/ruby/lib/rdoc/context/section.rb
   60 /root/ruby/lib/rdoc/top_level.rb
   61 /root/ruby/lib/rdoc/generator/markup.rb
   62 /root/ruby/lib/rdoc/generator/darkfish.rb
   63 /root/ruby/lib/rdoc/generator/ri.rb
   64 /root/ruby/lib/rdoc/generator/pot.rb
   65 /root/ruby/lib/rdoc/rdoc.rb
   66 /root/ruby/lib/rdoc/store.rb
   67 /root/ruby/lib/optparse.rb
   68 /root/ruby/lib/rdoc/options.rb
   69 /root/ruby/lib/rdoc/parser/text.rb
   70 /root/ruby/lib/rdoc/parser/simple.rb
   71 /root/ruby/lib/tsort.rb
   72 /root/ruby/lib/rdoc/parser/c.rb
   73 /root/ruby/lib/rdoc/parser/changelog.rb
   74 /root/ruby/lib/rdoc/parser/markdown.rb
   75 /root/ruby/lib/rdoc/parser/rd.rb
   76 /root/ruby/lib/rdoc/ruby_token.rb
   77 /root/ruby/lib/rdoc/token_stream.rb
   78 /root/ruby/lib/rdoc/parser/ruby_tools.rb
   79 /root/ruby/lib/rdoc/parser/ruby.rb
   80 /root/ruby/lib/rdoc/parser.rb
   81 /root/ruby/lib/rdoc/ri.rb
   82 /root/ruby/lib/rdoc/ri/paths.rb
   83 /root/ruby/lib/rdoc/stats.rb
   84 /root/ruby/.ext/x86_64-linux/io/console.so
   85 /root/ruby/.ext/common/io/console/size.rb
   86 /root/ruby/lib/rdoc/stats/quiet.rb
   87 /root/ruby/lib/rdoc/stats/normal.rb
   88 /root/ruby/lib/rdoc/encoding.rb
   89 /root/ruby/lib/rdoc/comment.rb
   90 /root/ruby/lib/rdoc/markup/document.rb
   91 /root/ruby/lib/rdoc/markup/heading.rb
   92 /root/ruby/lib/rdoc/markup/blank_line.rb
   93 /root/ruby/lib/rdoc/markup/list.rb
   94 /root/ruby/lib/rdoc/markup/raw.rb
   95 /root/ruby/lib/rdoc/markup/paragraph.rb
   96 /root/ruby/lib/rdoc/markup/list_item.rb
   97 /root/ruby/lib/rdoc/known_classes.rb
   98 /root/ruby/lib/rdoc/normal_class.rb
   99 /root/ruby/lib/rdoc/any_method.rb

* Process memory map:

7f54c6f12000-7f54c7118000 r--s 00000000 fd:00 1242                       /usr/lib64/libc-2.17.so
7f54c7118000-7f54c71b6000 r--s 00000000 fd:00 50926939                   /usr/lib/debug/usr/lib64/libpthread-2.17.so.debug
7f54c71b6000-7f54c8146000 r--s 00000000 fd:00 34034897                   /root/ruby/ruby
7f54c8146000-7f54c815b000 r-xp 00000000 fd:00 84                         /usr/lib64/libgcc_s-4.8.5-20150702.so.1
7f54c815b000-7f54c835a000 ---p 00015000 fd:00 84                         /usr/lib64/libgcc_s-4.8.5-20150702.so.1
7f54c835a000-7f54c835b000 r--p 00014000 fd:00 84                         /usr/lib64/libgcc_s-4.8.5-20150702.so.1
7f54c835b000-7f54c835c000 rw-p 00015000 fd:00 84                         /usr/lib64/libgcc_s-4.8.5-20150702.so.1
7f54c835c000-7f54c8360000 r-xp 00000000 fd:00 16886103                   /root/ruby/.ext/x86_64-linux/io/console.so
7f54c8360000-7f54c8560000 ---p 00004000 fd:00 16886103                   /root/ruby/.ext/x86_64-linux/io/console.so
7f54c8560000-7f54c8561000 r--p 00004000 fd:00 16886103                   /root/ruby/.ext/x86_64-linux/io/console.so
7f54c8561000-7f54c8562000 rw-p 00005000 fd:00 16886103                   /root/ruby/.ext/x86_64-linux/io/console.so
7f54c8562000-7f54c8568000 r-xp 00000000 fd:00 50515921                   /root/ruby/.ext/x86_64-linux/strscan.so
7f54c8568000-7f54c8767000 ---p 00006000 fd:00 50515921                   /root/ruby/.ext/x86_64-linux/strscan.so
7f54c8767000-7f54c8768000 r--p 00005000 fd:00 50515921                   /root/ruby/.ext/x86_64-linux/strscan.so
7f54c8768000-7f54c8769000 rw-p 00006000 fd:00 50515921                   /root/ruby/.ext/x86_64-linux/strscan.so
7f54c8769000-7f54c876c000 r-xp 00000000 fd:00 921544                     /root/ruby/.ext/x86_64-linux/cgi/escape.so
7f54c876c000-7f54c896b000 ---p 00003000 fd:00 921544                     /root/ruby/.ext/x86_64-linux/cgi/escape.so
7f54c896b000-7f54c896c000 r--p 00002000 fd:00 921544                     /root/ruby/.ext/x86_64-linux/cgi/escape.so
7f54c896c000-7f54c896d000 rw-p 00003000 fd:00 921544                     /root/ruby/.ext/x86_64-linux/cgi/escape.so
7f54c896d000-7f54c8975000 r-xp 00000000 fd:00 50515920                   /root/ruby/.ext/x86_64-linux/stringio.so
7f54c8975000-7f54c8b74000 ---p 00008000 fd:00 50515920                   /root/ruby/.ext/x86_64-linux/stringio.so
7f54c8b74000-7f54c8b75000 r--p 00007000 fd:00 50515920                   /root/ruby/.ext/x86_64-linux/stringio.so
7f54c8b75000-7f54c8b76000 rw-p 00008000 fd:00 50515920                   /root/ruby/.ext/x86_64-linux/stringio.so
7f54c8b76000-7f54c8bab000 r-xp 00000000 fd:00 50425545                   /root/ruby/.ext/x86_64-linux/date_core.so
7f54c8bab000-7f54c8daa000 ---p 00035000 fd:00 50425545                   /root/ruby/.ext/x86_64-linux/date_core.so
7f54c8daa000-7f54c8dab000 r--p 00034000 fd:00 50425545                   /root/ruby/.ext/x86_64-linux/date_core.so
7f54c8dab000-7f54c8dac000 rw-p 00035000 fd:00 50425545                   /root/ruby/.ext/x86_64-linux/date_core.so
7f54c8dac000-7f54c8dae000 rw-p 00000000 00:00 0
7f54c8dae000-7f54c8db5000 r-xp 00000000 fd:00 50515908                   /root/ruby/.ext/x86_64-linux/pathname.so
7f54c8db5000-7f54c8fb4000 ---p 00007000 fd:00 50515908                   /root/ruby/.ext/x86_64-linux/pathname.so
7f54c8fb4000-7f54c8fb5000 r--p 00006000 fd:00 50515908                   /root/ruby/.ext/x86_64-linux/pathname.so
7f54c8fb5000-7f54c8fb6000 rw-p 00007000 fd:00 50515908                   /root/ruby/.ext/x86_64-linux/pathname.so
7f54c8fb6000-7f54c8fbc000 r-xp 00000000 fd:00 50425552                   /root/ruby/.ext/x86_64-linux/etc.so
7f54c8fbc000-7f54c91bb000 ---p 00006000 fd:00 50425552                   /root/ruby/.ext/x86_64-linux/etc.so
7f54c91bb000-7f54c91bc000 r--p 00005000 fd:00 50425552                   /root/ruby/.ext/x86_64-linux/etc.so
7f54c91bc000-7f54c91bd000 rw-p 00006000 fd:00 50425552                   /root/ruby/.ext/x86_64-linux/etc.so
7f54c91bd000-7f54c91c0000 r-xp 00000000 fd:00 17024646                   /root/ruby/.ext/x86_64-linux/enc/trans/transdb.so
7f54c91c0000-7f54c93bf000 ---p 00003000 fd:00 17024646                   /root/ruby/.ext/x86_64-linux/enc/trans/transdb.so
7f54c93bf000-7f54c93c0000 r--p 00002000 fd:00 17024646                   /root/ruby/.ext/x86_64-linux/enc/trans/transdb.so
7f54c93c0000-7f54c93c1000 rw-p 00003000 fd:00 17024646                   /root/ruby/.ext/x86_64-linux/enc/trans/transdb.so
7f54c93c1000-7f54c93c3000 r-xp 00000000 fd:00 1054116                    /root/ruby/.ext/x86_64-linux/enc/encdb.so
7f54c93c3000-7f54c95c2000 ---p 00002000 fd:00 1054116                    /root/ruby/.ext/x86_64-linux/enc/encdb.so
7f54c95c2000-7f54c95c3000 r--p 00001000 fd:00 1054116                    /root/ruby/.ext/x86_64-linux/enc/encdb.so
7f54c95c3000-7f54c95c4000 rw-p 00002000 fd:00 1054116                    /root/ruby/.ext/x86_64-linux/enc/encdb.so
7f54c95c4000-7f54cfaed000 r--p 00000000 fd:00 50333274                   /usr/lib/locale/locale-archive
7f54cfaed000-7f54cfaef000 r-xp 00000000 fd:00 1233                       /usr/lib64/libfreebl3.so
7f54cfaef000-7f54cfcee000 ---p 00002000 fd:00 1233                       /usr/lib64/libfreebl3.so
7f54cfcee000-7f54cfcef000 r--p 00001000 fd:00 1233                       /usr/lib64/libfreebl3.so
7f54cfcef000-7f54cfcf0000 rw-p 00002000 fd:00 1233                       /usr/lib64/libfreebl3.so
7f54cfcf0000-7f54cfea6000 r-xp 00000000 fd:00 1242                       /usr/lib64/libc-2.17.so
7f54cfea6000-7f54d00a6000 ---p 001b6000 fd:00 1242                       /usr/lib64/libc-2.17.so
7f54d00a6000-7f54d00aa000 r--p 001b6000 fd:00 1242                       /usr/lib64/libc-2.17.so
7f54d00aa000-7f54d00ac000 rw-p 001ba000 fd:00 1242                       /usr/lib64/libc-2.17.so
7f54d00ac000-7f54d00b1000 rw-p 00000000 00:00 0
7f54d00b1000-7f54d01b1000 r-xp 00000000 fd:00 3919                       /usr/lib64/libm-2.17.so
7f54d01b1000-7f54d03b1000 ---p 00100000 fd:00 3919                       /usr/lib64/libm-2.17.so
7f54d03b1000-7f54d03b2000 r--p 00100000 fd:00 3919                       /usr/lib64/libm-2.17.so
7f54d03b2000-7f54d03b3000 rw-p 00101000 fd:00 3919                       /usr/lib64/libm-2.17.so
7f54d03b3000-7f54d03bb000 r-xp 00000000 fd:00 3915                       /usr/lib64/libcrypt-2.17.so
7f54d03bb000-7f54d05ba000 ---p 00008000 fd:00 3915                       /usr/lib64/libcrypt-2.17.so
7f54d05ba000-7f54d05bb000 r--p 00007000 fd:00 3915                       /usr/lib64/libcrypt-2.17.so
7f54d05bb000-7f54d05bc000 rw-p 00008000 fd:00 3915                       /usr/lib64/libcrypt-2.17.so
7f54d05bc000-7f54d05ea000 rw-p 00000000 00:00 0
7f54d05ea000-7f54d05ec000 r-xp 00000000 fd:00 3917                       /usr/lib64/libdl-2.17.so
7f54d05ec000-7f54d07ec000 ---p 00002000 fd:00 3917                       /usr/lib64/libdl-2.17.so
7f54d07ec000-7f54d07ed000 r--p 00002000 fd:00 3917                       /usr/lib64/libdl-2.17.so
7f54d07ed000-7f54d07ee000 rw-p 00003000 fd:00 3917                       /usr/lib64/libdl-2.17.so
7f54d07ee000-7f54d0864000 r-xp 00000000 fd:00 1730                       /usr/lib64/libgmp.so.10.2.0
7f54d0864000-7f54d0a63000 ---p 00076000 fd:00 1730                       /usr/lib64/libgmp.so.10.2.0
7f54d0a63000-7f54d0a64000 r--p 00075000 fd:00 1730                       /usr/lib64/libgmp.so.10.2.0
7f54d0a64000-7f54d0a65000 rw-p 00076000 fd:00 1730                       /usr/lib64/libgmp.so.10.2.0
7f54d0a65000-7f54d0a7c000 r-xp 00000000 fd:00 1245                       /usr/lib64/libpthread-2.17.so
7f54d0a7c000-7f54d0c7b000 ---p 00017000 fd:00 1245                       /usr/lib64/libpthread-2.17.so
7f54d0c7b000-7f54d0c7c000 r--p 00016000 fd:00 1245                       /usr/lib64/libpthread-2.17.so
7f54d0c7c000-7f54d0c7d000 rw-p 00017000 fd:00 1245                       /usr/lib64/libpthread-2.17.so
7f54d0c7d000-7f54d0c81000 rw-p 00000000 00:00 0
7f54d0c81000-7f54d0ca1000 r-xp 00000000 fd:00 3911                       /usr/lib64/ld-2.17.so
7f54d0cc7000-7f54d0d59000 rw-p 00000000 00:00 0
7f54d0d66000-7f54d0d8a000 r--s 00000000 fd:00 1245                       /usr/lib64/libpthread-2.17.so
7f54d0d8a000-7f54d0e90000 rw-p 00000000 00:00 0
7f54d0e92000-7f54d0e94000 rw-p 00000000 00:00 0
7f54d0e94000-7f54d0e9b000 r--s 00000000 fd:00 16828441                   /usr/lib64/gconv/gconv-modules.cache
7f54d0e9b000-7f54d0e9c000 ---p 00000000 00:00 0
7f54d0e9c000-7f54d0ea0000 rw-p 00000000 00:00 0                          [stack:42915]
7f54d0ea0000-7f54d0ea1000 r--p 0001f000 fd:00 3911                       /usr/lib64/ld-2.17.so
7f54d0ea1000-7f54d0ea2000 rw-p 00020000 fd:00 3911                       /usr/lib64/ld-2.17.so
7f54d0ea2000-7f54d0ea3000 rw-p 00000000 00:00 0
7f54d0ea3000-7f54d11a7000 r-xp 00000000 fd:00 34034897                   /root/ruby/ruby
7f54d13a6000-7f54d13ab000 r--p 00303000 fd:00 34034897                   /root/ruby/ruby
7f54d13ab000-7f54d13ac000 rw-p 00308000 fd:00 34034897                   /root/ruby/ruby
7f54d13ac000-7f54d13be000 rw-p 00000000 00:00 0
7f54d2a07000-7f54da535000 rw-p 00000000 00:00 0                          [heap]
7fff76ef1000-7fff776f0000 rw-p 00000000 00:00 0
7fff777de000-7fff777e0000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]


[NOTE]
You may have encountered a bug in the Ruby interpreter or extension libraries.
Bug reports are welcome.
For details: http://www.ruby-lang.org/bugreport.html

make: *** [rdoc] Aborted (core dumped)
----------------------------------------

lib/rdoc/token_stream.rb は lib/rdoc/parser/c.rb から呼ばれているとのことなので、
以下のように add_token に渡す値を tk ではなく nil に差し替えてみたところ、最後の
ファイルまで処理した後でエラーが出るようになりました。

下記の出力は上記の出力よりは先の段階ですので、 tk を渡したことで NULL pointer
dereference になっているものと推測されます。下記の結果が出るまでは、パッチが
行っている処理の中で何かの手続きを忘れているものと考えていたのですが、下記の
結果からは、何らかの状態の引数を渡すとエラーになるようにも思えます。
何か手がかりになりそうでしょうか?

----------------------------------------
diff --git a/lib/rdoc/parser/c.rb b/lib/rdoc/parser/c.rb
index 087d56f..18a6304 100644
--- a/lib/rdoc/parser/c.rb
+++ b/lib/rdoc/parser/c.rb
@@ -668,7 +668,7 @@ def find_body class_name, meth_name, meth_obj, file_content, quiet = false
       meth_obj.start_collecting_tokens
       tk = RDoc::RubyToken::Token.new nil, 1, 1
       tk.set_text body
-      meth_obj.add_token tk
+      meth_obj.add_token nil #tk
       meth_obj.comment = comment
       meth_obj.offset  = offset
       meth_obj.line    = file_content[0, offset].count("\n") + 1
@@ -687,7 +687,7 @@ def find_body class_name, meth_name, meth_obj, file_content, quiet = false
       meth_obj.start_collecting_tokens
       tk = RDoc::RubyToken::Token.new nil, 1, 1
       tk.set_text body
-      meth_obj.add_token tk
+      meth_obj.add_token nil #tk
       meth_obj.comment = comment
       meth_obj.offset  = offset
       meth_obj.line    = file_content[0, offset].count("\n") + 1
----------------------------------------

----------------------------------------
Generating RDoc documentation
Parsing sources...
100% [895/895]  vsnprintf.c
uh-oh! RDoc had a problem:
stack level too deep

run with --debug for full backtrace
make: *** [rdoc] Error 1
----------------------------------------

In This Thread