[#46807] [ruby-trunk - Bug #7625][Open] Arrayを継承したオブジェクトのcompactがArrayを返す — "mogya@... (Daisuke Furukawa)" <mogya@...>

19 messages 2012/12/26

[#46822] [ruby-trunk - Feature #7639][Open] More freedom for location of comments — "sawa (Tsuyoshi Sawada)" <sawadatsuyoshi@...>

14 messages 2012/12/30

[ruby-dev:46679] [ruby-trunk - Bug #7468] GC_GUARD漏れもしくはmark漏れっぽいエラーが発生してます。

From: "tarui (Masaya Tarui)" <tarui@...>
Date: 2012-12-01 20:52:45 UTC
List: ruby-dev #46679
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 <rb_gc_save_machine_context>
   0x00002aab414e6f2b <+763>:   mov    0x38(%rsp),%rdx
   0x00002aab414e6f30 <+768>:   mov    0x8(%r12),%rdi
   0x00002aab414e6f35 <+773>:   mov    %rdx,0x1b0(%r12)
   0x00002aab414e6f3d <+781>:   callq  0x2aab414e4730 <gvl_yield>

のように実際のrspではなく、関数に入った当初のrspをmachine_stack_endとしてしまっています。
rb_thread_scheduleでは
   0x00002aab414e8f40 <+48>:    callq  0x2aab414e69b0 <rb_gc_save_machine_context>
   0x00002aab414e8f45 <+53>:    mov    0x8(%rbx),%rdi
   0x00002aab414e8f49 <+57>:    mov    %rsp,%rax
   0x00002aab414e8f4c <+60>:    mov    %rax,0x1b0(%rbx)
   0x00002aab414e8f53 <+67>:    callq  0x2aab414e4730 <gvl_yield>
のようにちゃんと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/

In This Thread