From: "U.Nakamura" Date: 2002-10-15T15:35:19+09:00 Subject: [ruby-dev:18517] Re: Segmentaion fault of miniruby こんにちは、なかむら(う)です。 In message "[ruby-dev:18515] Re: Segmentaion fault of miniruby" on Oct.13,2002 20:05:58, wrote: | >残念ながらcoreが生成されないので、何が悪いのかはっきりしたこ | >とはわかりませんが、適当にあたりをつけて調べてみたところ、 | >gc.cが1.106までなら問題なし、1.107以降だと落ちるということは | >わかりました。 | >なお、NetBSDではgc.cの1.107以降でもちゃんと最後まで通りまし | >た。 | 最新版(ruby-1.7.3 (2002-10-12))でコンパイルしてみましたが、問題ないよう | です。 | 環境は、 | WinXP Home SP2 | NMAKE 6.00.8168.0 | です。 | >win32/configure | >nmake | >nmake test | の手順で、全てパスしました。 うちの別環境でもやっぱり問題を再現できなかったりしたのですが、 GC絡みじゃよくあることか、と思い直して、再現できる環境で地道 にデバッグしてみました(必殺printfデバッグ ^^;)。 variable.cのrb_global_entry()内でALLOC()、つまりruby_xmalloc() を2回呼び出してるわけですが、2回目のALLOC()でmalloc_increase がmalloc_limitより大きくなった場合、またはmalloc()に失敗した 場合、rb_gc()が実行されます。 で、rb_gc() -> rb_gc_mark_global_tbl() -> st_foreach() -> mark_global_entry() と呼び出されるのですが、この時点ではvarが まだ存在しないので、var->marker()の呼び出しで落ちてしまう、と いうことだったようです。 というわけで、パッチ。 diff -u -1 -p -w -r1.71 variable.c --- variable.c 2002/09/26 00:48:33 1.71 +++ variable.c 2002/10/15 06:31:55 @@ -356,4 +356,4 @@ rb_global_entry(id) entry = ALLOC(struct global_entry); - st_add_direct(rb_global_tbl, id, entry); var = ALLOC(struct global_variable); + st_add_direct(rb_global_tbl, id, entry); entry->id = id; それでは。 -- U.Nakamura # わかっちゃえば簡単...