From: Yusuke ENDOH Date: 2007-12-08T01:22:18+09:00 Subject: [ruby-dev:32487] Re: SEGV by test/ruby/test_fiber.rb 遠藤と申します。 07/12/07 に Tanaka Akira さんは書きました: > > test/ruby/test_fiber.rb ですが、以下のように insnhelper.ci > > 内の rb_ary_new4 呼び出しのところで GC を毎回起動するように > > すると数回に一度くらいの割合で SEGV するようになります。 vm_invoke_block 経由で vm_callee_setup_arg が呼ばれる時は sp が argv の先端を指しているようなのですが、 vm_setup_method 経由で vm_callee_setup_arg が呼ばれる時は sp が argv の終端 (の次) を指していると思います。 このため vm_setup_method 経由の場合、スタックの終端を超えた 範囲まで mark されてしまっているのではないかと思います。 (vm_callee_setup_arg 中で th->mark_stack_len = iseq->arg_size; しているため) 以下のパッチで rb_gc() を入れても症状が出なくなりました。 # reg_cfp と cfp の変数名の使い分けには意味があるんでしょうか。 Index: insnhelper.ci =================================================================== --- insnhelper.ci (revision 14130) +++ insnhelper.ci (working copy) @@ -429,7 +429,9 @@ /* TODO: eliminate it */ GetISeqPtr(iseqval, iseq); + cfp->sp -= argc; opt_pc = vm_callee_setup_arg(th, iseq, argc, rsp, &blockptr); + cfp->sp += argc; sp = rsp + iseq->arg_size; /* stack overflow check */ -- Yusuke ENDOH