Issue #7468 has been reported by tarui (Masaya Tarui). ---------------------------------------- Bug #7468: GC_GUARD漏れもしくはmark漏れっぽいエラーが発生してます。 https://bugs.ruby-lang.org/issues/7468 Author: tarui (Masaya Tarui) Status: Open Priority: High Assignee: Category: 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周りのバグだと思います。
on 2012-11-29 19:32
on 2012-11-30 03:17
Issue #7468 has been updated by shugo (Shugo Maeda). Status changed from Open to Assigned Assignee set to tarui (Masaya Tarui) tarui (Masaya Tarui) wrote: > いつからか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周りのバグだと思います。 原因と思われるcommitをrevertしましたので、確認の上問題なければcloseいただけますか? ---------------------------------------- Bug #7468: GC_GUARD漏れもしくはmark漏れっぽいエラーが発生してます。 https://bugs.ruby-lang.org/issues/7468#change-34177 Author: tarui (Masaya Tarui) Status: Assigned Priority: High Assignee: tarui (Masaya Tarui) Category: 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周りのバグだと思います。
on 2012-11-30 03:35
Issue #7468 has been updated by tarui (Masaya Tarui). Status changed from Assigned to Open Assignee deleted (tarui (Masaya Tarui)) ruby 2.0.0dev (2012-11-30 trunk 38022) [x86_64-linux] でも残念ながらというか幸いというかsegvが起こります。 ので、shugoさんのpatchが原因ではないようです。 # あの後 r37990 で試してやはり発生してたのでその時に関係ないだろうという結論に達していました。お手数を取らせてすいません。 ささださんが軽く実験した結果としてはGCCのバージョンによって発生するので、 最適化が進んで、これまで隠れてた漏れが顕在化したのでは無いかと疑っています。 手元のバージョンは gcc (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1 です。 ---------------------------------------- Bug #7468: GC_GUARD漏れもしくはmark漏れっぽいエラーが発生してます。 https://bugs.ruby-lang.org/issues/7468#change-34181 Author: tarui (Masaya Tarui) Status: Open Priority: High Assignee: Category: 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周りのバグだと思います。
on 2012-12-01 21:53
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周りのバグだと思います。
on 2012-12-01 22:24
Issue #7468 has been updated by kosaki (Motohiro KOSAKI).
SET_MACHINE_STACK_ENDの実体が
#if defined(__x86_64__) && defined(__GNUC__) &&
!defined(__native_client__)
#define SET_MACHINE_STACK_END(p) __asm__ ("movq\t%%rsp, %0" : "=r"
(*(p)))
のように volatileなしasmで、かつオペランド制約にrspを使うということが一切記述されてないので
どういう最適化されても文句はいえないのではないでしょうか。
とりあえず r38134 で volatileつけときました。この結果アセンブリは
3f92: e8 00 00 00 00 callq 3f97
<rb_threadptr_execute_interrupts+0x317>
3f97: 48 89 e0 mov %rsp,%rax
3f9a: 49 8b 7c 24 08 mov 0x8(%r12),%rdi
3f9f: 49 89 84 24 b0 01 00 mov %rax,0x1b0(%r12)
3fa6: 00
3fa7: 4c 89 e6 mov %r12,%rsi
3faa: e8 c1 fa ff ff callq 3a70 <gvl_yield>
という感じになって、意図した通り gvl_yield()の直前に%rspをメモリに書いているように見えます。問題が再現出来る人がいれば
誰か確認お願いできませんか。
# たとえ直ってなくても r38134 は1.9.3にバックポート必要でしょうね。現状危なすぎる
----------------------------------------
Bug #7468: GC_GUARD漏れもしくはmark漏れっぽいエラーが発生してます。
https://bugs.ruby-lang.org/issues/7468#change-34296
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周りのバグだと思います。
on 2012-12-02 03:54
$B:GE,2=!)(B($B<j4V$,A}$($F$k$h$&$K8+$($k(B)$B$K$h$C$FA0$KHt$P$5$l$F$?$s$G$9$M!#(B $B$=$3$^$G5$$,2s$C$F$^$;$s$G$7$?!#:F8=$7$J$$;v$r3NG'$7$?$N$G(Bticket$B$rJD$8$^$7$?!#(B $B=$@5$"$j$,$H$&$4$6$$$^$9!#(B 2012$BG/(B12$B7n(B2$BF|(B 6:23 kosaki (Motohiro KOSAKI) <kosaki.motohiro@gmail.com>:
Please log in before posting. Registration is free and takes only a minute.
Existing account
(Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
Log in with Google account | Log in with Yahoo account
No account? Register here.