From: "H.Yamamoto" Date: 2005-11-30T21:06:50+09:00 Subject: [ruby-dev:27895] Re: ruby 1.8 dumps core 山本です。 >> test/yaml/test_yaml.rb を実行してメモリ解析ソフトを走らせたところ、怪しげなエラーが >> 出ていました。まだよくわかりませんが、これが原因かもしれません。 > >試さずに述べるのでなんですが、GC が起こりうる全てのタイミン >グで GC が起こるように ruby を細工して yaml をテストするとど >うなるでしょう? rb_funcall で GC が走るようにしたところ、私の環境でも test/yaml が 落ちるようになりました。逆に、GC を無効にするとメモリエラーも出なく なります。 Index: eval.c =================================================================== RCS file: /src/ruby/eval.c,v retrieving revision 1.846 diff -u -r1.846 eval.c --- eval.c 11 Nov 2005 17:11:05 -0000 1.846 +++ eval.c 30 Nov 2005 11:26:48 -0000 @@ -5871,6 +5871,12 @@ { VALUE *argv; va_list ar; + + if (ruby_running && getenv("DEBUG_RUBY")) { + puts("run gc...."); + rb_gc(); + } + va_start(ar, n); if (n > 0) { Index: signal.c =================================================================== RCS file: /src/ruby/signal.c,v retrieving revision 1.70 diff -u -r1.70 signal.c --- signal.c 8 Nov 2005 08:49:45 -0000 1.70 +++ signal.c 30 Nov 2005 11:33:58 -0000 @@ -947,7 +947,7 @@ install_sighandler(SIGBUS, sigbus); #endif #ifdef SIGSEGV - install_sighandler(SIGSEGV, sigsegv); +// install_sighandler(SIGSEGV, sigsegv); #endif #ifdef SIGPIPE install_sighandler(SIGPIPE, sigpipe); で、調べてみたのですが、syck ってかなり mark し忘れがありますね。 あんまり多くて、まだ動くところまで至っていません。少なくともこれは 要るんじゃないかと思いますが、他にも怪しい部分がたくさんあります。--;; Index: rubyext.c =================================================================== RCS file: /src/ruby/ext/syck/rubyext.c,v retrieving revision 1.54 diff -u -r1.54 rubyext.c --- rubyext.c 1 Nov 2005 13:04:33 -0000 1.54 +++ rubyext.c 30 Nov 2005 11:56:34 -0000 @@ -718,6 +718,7 @@ bonus = (struct parser_xtra *)parser->bonus; rb_gc_mark( bonus->data ); rb_gc_mark( bonus->proc ); + rb_gc_mark( bonus->resolver ); } } @@ -1946,6 +1947,7 @@ if ( emitter->bonus != NULL ) { bonus = (struct emitter_xtra *)emitter->bonus; + rb_gc_mark( bonus->oid ); rb_gc_mark( bonus->data ); rb_gc_mark( bonus->port ); }