From: "H.Yamamoto" Date: 2005-12-19T12:09:21+09:00 Subject: [ruby-dev:28046] Re: ruby 1.8 dumps core 山本です。 >rb_funcall では甘いんじゃないですかね。 > >次のように ruby_xmalloc とかの garbage_collect 呼び出し条件 >を細工して常に GC させるようにすると、[ruby-dev:27905] のパッ >チを当てても yaml っぽい感じで落ちます。 完治は無理でも、直せるところは直しておこうと HEAD でいじってみた結果、 私の環境では RUBY_ALWAYS_GC で SEGV することはなくなりました。しかしながら、 1) Error: test_circular_references(YAML_Unit_Tests): TypeError: can't convert Hash into String E:/ruby-cvs/ruby/lib/yaml.rb:133:in `load' E:/ruby-cvs/ruby/test/yaml/test_yaml.rb:1226:in `test_circular_references' というエラーが毎回報告され、どうにも解消できません。(RUBY_ALWAYS_GC をつけずに 普通に testrb yaml すると報告されません) デバッガを追った感じでは、メンバ変数が 0 フィルされたような妙な SyckNode が syck_defaultresolver_node_import に渡ってきており、それが引き金になっている ようにも見えましたがよくわかりません。(解放済みのノード?) syck は rubyext.c 以外は python php などと共通で、ruby 固有の記述を持ち込めない というのが非常にデバッグしにくいです。本来なら VALUE を持ちまわして、必要なとき だけ生ポインタを取り出すのだと思いますが、それができません。 VALUE syck_scalar_value_set( self, val ) VALUE self, val; { SyckNode *node; Data_Get_Struct( self, SyckNode, node ); StringValue( val ); node->data.str->ptr = RSTRING(val)->ptr; node->data.str->len = RSTRING(val)->len; node->data.str->style = scalar_none; rb_iv_set( self, "@value", val ); return val; } というように、RString の内部ポインタを取り出して保存するのがいかにも 怪しい感じでしたがこれも直接の原因ではなく、 syck_parser_assign_io で port がどこでも mark されなくなってしまうのが 原因かと思い、いじっていると返ってエラーが増えたり、 rb_syck_load_handler で if (n->id > 0 && !NIL_P(obj)) { MEMCPY((void *)n->id, (void *)obj, RVALUE, 1); MEMZERO((void *)obj, RVALUE, 1); obj = n->id; } なんて RValue をコピーしているのがいかにも怪しげでしたがここは実行されて おらず・・・・ こんな状態ですが、1.8 へのバックポートについて検討していただければ幸いです。