[ruby-dev:18323] Re: rubicon on EWS4800
From:
Koji Arai <JCA02266@...>
Date:
2002-09-21 07:44:57 UTC
List:
ruby-dev #18323
新井です。
以下の件、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 <JCA02266@nifty.ne.jp> 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<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 <repeats 32 times>}}, writefds = {__fds_bits = {
0 <repeats 32 times>}}, exceptfds = {__fds_bits = {
0 <repeats 32 times>}}, 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 <rb_thread_yield>,
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 <rb_thread_initialize>,
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 <rb_thread_s_new>,
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 <rb_f_send>, 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 <rb_ary_each>, 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)