In article <4671E076.5010103 / atdot.net>, SASADA Koichi <ko1 / atdot.net> writes: > す。まぁ、今回の GC のバグは、発現した時点では潜在的に存在する > ものだったらしいという点、やっぱり GC のバグの特定は難しいとい > う点を鑑みて、もう少し待ってくだされば幸いです。いや、特定して > 頂けるともっとありがたいんですが。 先のパッチにも混ざってますが進めてはいます。 とりあえず RUBY_GC_STRESS= miniruby -e '' が動くようになったし。 > 自分ひとりですべての失敗を片づけるのは難しいので、たとえばラ > イブラリなどについて失敗の原因の絞り込みなどにご協力頂ければ幸 > いです。 脳味噌を使わなくても (寝ている間に) やれる、 RUBY_GC_STRESS= ../ruby runner.rb -v ruby/test_a* RUBY_GC_STRESS= ../ruby runner.rb -v ruby/test_b* RUBY_GC_STRESS= ../ruby runner.rb -v ruby/test_c* ... というようなところからやってますが、 test_fiber.rb は怪しいですね。 (test_continuation.rb も?) つーか、test_fiber.rb は RUBY_GC_STRESS を使わなくても SEGV する場合があって、 Thread.new { Fiber.new do throw :a end.yield}.join が無限ループするというのはそこから見付けたものです。 どうも _tag が cycle になるようで、以下のような assertion を 入れて試してますが、これって (スタックの伸長方向を x86 と等 しいと仮定して) 正しいですかね? Index: eval_intern.h =================================================================== --- eval_intern.h (revision 12537) +++ eval_intern.h (working copy) @@ -127,2 +127,4 @@ char *strrchr _((const char *, const cha +#include <assert.h> + #define TH_PUSH_TAG(th) do { \ @@ -132,2 +134,3 @@ char *strrchr _((const char *, const cha _tag.prev = _th->tag; \ + assert(_th->tag == 0 || &_tag < _th->tag); \ _th->tag = &_tag; -- [田中 哲][たなか あきら][Tanaka Akira]