From: "tarui (Masaya Tarui)" Date: 2012-12-02T05:52:45+09:00 Subject: [ruby-dev:46679] [ruby-trunk - Bug #7468] GC_GUARD漏れもしくはmark漏れっぽいエラーが発生してます。 Issue #7468 has been updated by tarui (Masaya Tarui). Category set to core Assignee set to authorNari (Narihiro Nakamura) rb_threadptr_execute_interrupts経由でthread切替が起こる時、 machine_stack_endが正確にとれておらず、mark抜けが発生しています。 以下、アセンブラコードの抜粋 (gdb) disassemble Dump of assembler code for function rb_threadptr_execute_interrupts: 0x00002aab414e6c30 <+0>: push %r15 0x00002aab414e6c32 <+2>: mov %rsp,%rdx 0x00002aab414e6c40 <+16>: sub $0x98,%rsp 0x00002aab414e6c4b <+27>: mov %rdx,0x38(%rsp) 0x00002aab414e6f26 <+758>: callq 0x2aab414e69b0 0x00002aab414e6f2b <+763>: mov 0x38(%rsp),%rdx 0x00002aab414e6f30 <+768>: mov 0x8(%r12),%rdi 0x00002aab414e6f35 <+773>: mov %rdx,0x1b0(%r12) 0x00002aab414e6f3d <+781>: callq 0x2aab414e4730 のように実際のrspではなく、関数に入った当初のrspをmachine_stack_endとしてしまっています。 rb_thread_scheduleでは 0x00002aab414e8f40 <+48>: callq 0x2aab414e69b0 0x00002aab414e8f45 <+53>: mov 0x8(%rbx),%rdi 0x00002aab414e8f49 <+57>: mov %rsp,%rax 0x00002aab414e8f4c <+60>: mov %rax,0x1b0(%rbx) 0x00002aab414e8f53 <+67>: callq 0x2aab414e4730 のようにちゃんとrspを使ってるんですが、この辺の挙動はよくわからないですね。 gccのバグだったりするのかなとも。。 inline assemblerを使わずにrb_gc_set_stack_endを使うようにするか、 rb_thread_schedule_limitsが現在各関数へ展開されてるのを防げば、 発生しないようになるのですが、 具体的にどう手当するのかはnariさんにお任せしてよいでしょうか? ---------------------------------------- Bug #7468: GC_GUARD漏れもしくはmark漏れっぽいエラーが発生してます。 https://bugs.ruby-lang.org/issues/7468#change-34295 Author: tarui (Masaya Tarui) Status: Open Priority: High Assignee: authorNari (Narihiro Nakamura) Category: core Target version: 2.0.0 ruby -v: ruby -v: ruby 2.0.0dev (2012-11-30 trunk 37999) [x86_64-linux] いつからかtest-allで時々エラーが発生するようになってます。 make test-all TESTS="-qv -n /test_string\$$/" でsegvや 1) Error: test_string(DL::TestFunc): ArgumentError: assertion message must be String or Proc, but Thread::Backtrace was given. などと言われるようになりました。 GC.stress = true なのと、Thread::Backtraceが通常のpassでは入る事はないっぽいのでGC周りのバグだと思います。 -- http://bugs.ruby-lang.org/