From: Koji Arai Date: 2002-09-21T16:44:57+09:00 Subject: [ruby-dev:18323] Re: rubicon on EWS4800 新井です。 以下の件、Linuxでも再現しました。(ruby 1.7.3 (2002-09-20) [i586-linux]) In message "[ruby-dev:18322] Re: rubicon on EWS4800" on 21 Sep 2002 15:26:50 +0900, Koji Arai wrote: > 新井です。 > あと、以下はこのメールの本題なのですが、2002-09-17 版で > rubicon の TestThread で SEGV することがあります。落ちる箇所 > 周辺にデバッグ出力を埋め込んで実行したところ > 落ちるのは MEMCPY のところです。上記の結果出力で、落ちる直前に > > | th->stk_ptr = 0, th->stk_len = 10261, th->stk_max = 11373 > > っとあるので、stk_ptr = 0 で、REALLOC_N() されない条件がある > ようです。 > > 以下の暫定対処で落ちなくなるのまでは確認しました。 > > --- ruby/eval.c Tue Sep 17 22:52:45 2002 > +++ ruby-1.7/eval.c Thu Sep 19 05:14:49 2002 > @@ -7598,7 +7598,11 @@ > th->stk_len = 0; > th->stk_pos = (rb_gc_stack_start :rb_gc_stack_start - len; > - if (len > th->stk_max) { > + if (th->stk_ptr == 0) { > + th->stk_ptr = ALLOC_N(VALUE, len); > + th->stk_max = len; > + } > + else if (len > th->stk_max) { > REALLOC_N(th->stk_ptr, VALUE, len); > th->stk_max = len; > } > 以下、再現したときの出力です。(rubicon は、CVS最新) 再現しないときもあります。 % ruby TestThread.rb -略- TestThread#test_s_abort_on_exception . TestThread#test_s_abort_on_exception= TestThread.rb:377:in `test_s_abort_on_exception=': boom (RuntimeError) from TestThread.rb:376:in `initialize' from TestThread.rb:376:in `new' from TestThread.rb:376:in `test_s_abort_on_exception=' from /usr/local/lib/ruby/site_ruby/1.7/runit/testcase.rb:64:in `send' from /usr/local/lib/ruby/site_ruby/1.7/runit/testcase.rb:64:in `run_bare' from /usr/local/lib/ruby/site_ruby/1.7/runit/testcase.rb:51:in `run' from /usr/local/lib/ruby/site_ruby/1.7/runit/testsuite.rb:16:in `run' from /usr/local/lib/ruby/site_ruby/1.7/runit/testsuite.rb:16:in `each' from /usr/local/lib/ruby/site_ruby/1.7/runit/testsuite.rb:17:in `run' from /usr/local/lib/ruby/site_ruby/1.7/runit/cui/testrunner.rb:26:in `run' from ./../rubicon_tests.rb:238:in `handleTests' from TestThread.rb:523 TestThread.rb:376: [BUG] Segmentation fault ruby 1.7.3 (2002-09-20) [i586-linux] zsh: abort (core dumped) ruby TestThread.rb % gdb ruby core (gdb) up 6 #6 0x08064aa6 in rb_thread_save_context (th=0x8197c68) at ../ruby-1.7/eval.c:7607 7607 MEMCPY(th->stk_ptr, th->stk_pos, VALUE, th->stk_len); (gdb) p *th $4 = {next = 0x811e5d8, prev = 0x818f048, context = {{__jmpbuf = {134641428, 135888740, -1073774100, -1073773828, -1073774360, 134635276}, __mask_was_saved = 0, __saved_mask = {__val = {134598624, 1075322320, 1075416768, 0, 0, 0, 1, 1, 1075871892, 0, 1075751772, 1075543348, 0, 1075481188, 1075322320, 1073818604, 3221222756, 3221221100, 3221220740, 134599093, 0, 0, 3221220932, 3221221732, 832, 831, 135460040, 3221220972, 1075416748, 16, 135214083, 2}}}}, result = 0, stk_len = 6646, stk_max = 7434, stk_ptr = 0x0, stk_pos = 0xbfff8d0c, frame = 0xbfff8ce4, scope = 0x401e5904, dyna_vars = 0x401e5738, block = 0x0, iter = 0xbfff8868, tag = 0xbfff8c1c, klass = 1075543328, wrapper = 0, cref = 0x401eb228, flags = 512, node = 0x4019d740, tracing = 0, errinfo = 4, last_status = 4, last_line = 0, last_match = 4, safe = 0, status = THREAD_KILLED, wait_for = 0, fd = 4, readfds = {__fds_bits = { 0 }}, writefds = {__fds_bits = { 0 }}, exceptfds = {__fds_bits = { 0 }}, select_value = 9, delay = 0, join = 0x0, abort = 0, priority = 0, gid = 0, locals = 0x0, thread = 1075730312} 以下スタックトレースも付けます。 (gdb) bt #0 0x40095581 in kill () from /lib/libc.so.6 #1 0x40095394 in raise () from /lib/libc.so.6 #2 0x400968d1 in abort () from /lib/libc.so.6 #3 0x080d8630 in rb_bug (fmt=0x80f0cd6 "Segmentation fault") at ../ruby-1.7/error.c:179 #4 0x080b55e7 in sigsegv (sig=11) at ../ruby-1.7/signal.c:412 #5 0x40095518 in sigaction () from /lib/libc.so.6 #6 0x08064aa6 in rb_thread_save_context (th=0x8197c68) at ../ruby-1.7/eval.c:7607 #7 0x08067d00 in rb_thread_raise (argc=1, argv=0xbfff8da8, th=0x811e5d8) at ../ruby-1.7/eval.c:9040 #8 0x08067539 in rb_thread_start_0 (fn=0x806759c , arg=0x401e5774, th_arg=0x8197c68) at ../ruby-1.7/eval.c:8771 #9 0x08067763 in rb_thread_initialize (thread=1075730312, args=1075730292) at ../ruby-1.7/eval.c:8840 #10 0x0805c572 in call_cfunc (func=0x8067714 , recv=1075730312, len=-2, argc=0, argv=0x0) at ../ruby-1.7/eval.c:4379 #11 0x0805cf03 in rb_call0 (klass=1075521088, recv=1075730312, id=2913, oid=2913, argc=0, argv=0x0, body=0x401b25dc, nosuper=1) at ../ruby-1.7/eval.c:4515 #12 0x0805d998 in rb_call (klass=1075521088, recv=1075730312, mid=2913, argc=0, argv=0x0, scope=1) at ../ruby-1.7/eval.c:4731 #13 0x0805dbca in rb_funcall2 (recv=1075730312, mid=2913, argc=0, argv=0x0) at ../ruby-1.7/eval.c:4814 #14 0x0806030c in rb_obj_call_init (obj=1075730312, argc=0, argv=0x0) at ../ruby-1.7/eval.c:5819 #15 0x080676c4 in rb_thread_s_new (argc=0, argv=0x0, klass=1075521088) at ../ruby-1.7/eval.c:8824 #16 0x0805c597 in call_cfunc (func=0x8067684 , recv=1075521088, len=-1, argc=0, argv=0x0) at ../ruby-1.7/eval.c:4382 #17 0x0805cf03 in rb_call0 (klass=1075521068, recv=1075521088, id=3289, oid=3289, argc=0, argv=0x0, body=0x401b2604, nosuper=1) at ../ruby-1.7/eval.c:4515 #18 0x0805d998 in rb_call (klass=1075521068, recv=1075521088, mid=3289, argc=0, argv=0x0, scope=0) at ../ruby-1.7/eval.c:4731 #19 0x08057523 in rb_eval (self=1075748192, n=0x4019d7a4) at ../ruby-1.7/eval.c:2728 #20 0x08056430 in rb_eval (self=1075748192, n=0x4019d6dc) at ../ruby-1.7/eval.c:2468 #21 0x080557f3 in rb_eval (self=1075748192, n=0x4019d664) at ../ruby-1.7/eval.c:2214 #22 0x08056a55 in rb_eval (self=1075748192, n=0x4019d538) at ../ruby-1.7/eval.c:2568 #23 0x080557f3 in rb_eval (self=1075748192, n=0x4019d524) at ../ruby-1.7/eval.c:2214 #24 0x0805d4c7 in rb_call0 (klass=1075753912, recv=1075748192, id=10020, oid=10020, argc=0, argv=0xbfffad88, body=0x4019d524, nosuper=0) at ../ruby-1.7/eval.c:4641 #25 0x0805d998 in rb_call (klass=1075753912, recv=1075748192, mid=10020, argc=0, argv=0xbfffad88, scope=1) at ../ruby-1.7/eval.c:4731 #26 0x0805dac3 in rb_f_send (argc=0, argv=0xbfffad88, recv=1075748192) at ../ruby-1.7/eval.c:4761 #27 0x0805c597 in call_cfunc (func=0x805da34 , recv=1075748192, len=-1, argc=1, argv=0xbfffad84) at ../ruby-1.7/eval.c:4382 #28 0x0805cf03 in rb_call0 (klass=1075543188, recv=1075748192, id=3937, oid=3937, argc=1, argv=0xbfffad84, body=0x401b5e44, nosuper=1) at ../ruby-1.7/eval.c:4515 #29 0x0805d998 in rb_call (klass=1075543188, recv=1075748192, mid=3937, argc=1, argv=0xbfffad84, scope=1) at ../ruby-1.7/eval.c:4731 #30 0x080577b2 in rb_eval (self=1075748192, n=0x40202ef0) at ../ruby-1.7/eval.c:2742 #31 0x08056ceb in rb_eval (self=1075748192, n=0x40202f7c) at ../ruby-1.7/eval.c:2608 #32 0x0805d4c7 in rb_call0 (klass=1075791352, recv=1075748192, id=11593, oid=11593, argc=0, argv=0x0, body=0x40202f7c, nosuper=0) at ../ruby-1.7/eval.c:4641 #33 0x0805d998 in rb_call (klass=1075791352, recv=1075748192, mid=11593, argc=0, argv=0x0, scope=2) at ../ruby-1.7/eval.c:4731 #34 0x0805780f in rb_eval (self=1075748192, n=0x40203454) at ../ruby-1.7/eval.c:2748 #35 0x08056a55 in rb_eval (self=1075748192, n=0x402031ac) at ../ruby-1.7/eval.c:2568 #36 0x080557f3 in rb_eval (self=1075748192, n=0x40203198) at ../ruby-1.7/eval.c:2214 #37 0x0805d4c7 in rb_call0 (klass=1075791352, recv=1075748192, id=5937, oid=5937, argc=0, argv=0xbfffc738, body=0x40203198, nosuper=0) at ../ruby-1.7/eval.c:4641 #38 0x0805d998 in rb_call (klass=1075791352, recv=1075748192, mid=5937, argc=1, argv=0xbfffc734, scope=0) at ../ruby-1.7/eval.c:4731 #39 0x08057523 in rb_eval (self=1075751712, n=0x402005d8) at ../ruby-1.7/eval.c:2728 #40 0x0805abe4 in rb_yield_0 (val=1075748192, self=1075751712, klass=0, pcall=0) at ../ruby-1.7/eval.c:3807 #41 0x0805aefd in rb_yield (val=1075748192) at ../ruby-1.7/eval.c:3875 #42 0x080caf2f in rb_ary_each (ary=1075751712) at ../ruby-1.7/array.c:753 #43 0x0805c5b4 in call_cfunc (func=0x80caef8 , recv=1075751712, len=0, argc=0, argv=0x0) at ../ruby-1.7/eval.c:4385 #44 0x0805cf03 in rb_call0 (klass=1075513888, recv=1075751712, id=3737, oid=3737, argc=0, argv=0x0, body=0x401b05fc, nosuper=1) at ../ruby-1.7/eval.c:4515 #45 0x0805d998 in rb_call (klass=1075513888, recv=1075751712, mid=3737, argc=0, argv=0x0, scope=1) at ../ruby-1.7/eval.c:4731 #46 0x080577b2 in rb_eval (self=1075751712, n=0x4020059c) at ../ruby-1.7/eval.c:2742 #47 0x08056430 in rb_eval (self=1075751712, n=0x4020054c) at ../ruby-1.7/eval.c:2468 #48 0x0805d4c7 in rb_call0 (klass=1075838072, recv=1075751712, id=5937, oid=5937, argc=0, argv=0xbfffd9e8, body=0x4020054c, nosuper=0) at ../ruby-1.7/eval.c:4641 #49 0x0805d998 in rb_call (klass=1075838072, recv=1075751712, mid=5937, argc=1, argv=0xbfffd9e4, scope=0) at ../ruby-1.7/eval.c:4731 #50 0x08057523 in rb_eval (self=1075751752, n=0x401f36a8) at ../ruby-1.7/eval.c:2728 #51 0x080557f3 in rb_eval (self=1075751752, n=0x401f3734) at ../ruby-1.7/eval.c:2214 #52 0x0805d4c7 in rb_call0 (klass=1075758712, recv=1075751752, id=5937, oid=5937, argc=0, argv=0xbfffe4a8, body=0x401f3734, nosuper=0) at ../ruby-1.7/eval.c:4641 #53 0x0805d998 in rb_call (klass=1075758712, recv=1075751752, mid=5937, argc=1, argv=0xbfffe4a4, scope=0) at ../ruby-1.7/eval.c:4731 #54 0x08057523 in rb_eval (self=1075857172, n=0x40207c48) at ../ruby-1.7/eval.c:2728 #55 0x080584c3 in rb_eval (self=1075857172, n=0x40207cd4) at ../ruby-1.7/eval.c:2901 #56 0x0805d4c7 in rb_call0 (klass=1075757072, recv=1075857172, id=10137, oid=10137, argc=0, argv=0xbfffef68, body=0x40207cd4, nosuper=0) at ../ruby-1.7/eval.c:4641 #57 0x0805d998 in rb_call (klass=1075757072, recv=1075857172, mid=10137, argc=1, argv=0xbfffef64, scope=0) at ../ruby-1.7/eval.c:4731 #58 0x08057523 in rb_eval (self=1075538548, n=0x401a8708) at ../ruby-1.7/eval.c:2728 #59 0x08052e62 in eval_node (self=1075538548, node=0x401a8708) at ../ruby-1.7/eval.c:1115 #60 0x08053400 in ruby_run () at ../ruby-1.7/eval.c:1260 #61 0x080514a3 in main (argc=2, argv=0xbffff564, envp=0xbffff570) at ../ruby-1.7/main.c:50 -- 新井康司 (Koji Arai)