From: Satoshi Shiba Date: 2010-09-03T15:30:39+09:00 Subject: [ruby-dev:42175] Re: [Ruby 1.9-Bug#3781][Open] FIBER_USE_NATIVE が有効だと落ちるスクリプトがある 芝と申します。 Makoto Kishimoto wrote: > Bug #3781: FIBER_USE_NATIVE が有効だと落ちるスクリプトがある > http://redmine.ruby-lang.org/issues/show/3781 > > 起票者: Makoto Kishimoto > ステータス: Open, 優先度: Normal > カテゴリ: core, Target version: 1.9.3 > ruby -v: ruby 1.9.3dev (2010-09-01 trunk 29159) [x86_64-freebsd8.0] > > 手元のスクリプト(再現る最小のケースを絞り込むのが無理そうなので、そのまま添付します)が、FIBER_USE_NATIVE が有効な ruby で落ちます。 > > x86-64 FreeBSD と i686 Linux で落ちかたは違いました。ruby の吐くメッセージとバックトレースを以下そぞれ付けます。 落ちる原因を調べたので、ご報告いたします。 i686 Linux 環境で調べたところ、gc 中に C のスタックオーバーフローを起こ すことが原因のようです。 [BUG] object allocation during garbage collection phase というメッセージは、gc 中に C のスタックオーバーフローが発生し、それに対 するバックトレースを生成しようとして吐いているみたいです。 きしもとさんからのご報告にあったバックトレースを見れば分かるように、gc 時に C のスタックが結構な勢いで伸びているため(これぐらい普通なのか な)、C のスタック領域を64KBしか確保しない現在の Fiber の実装だと C のス タック領域が GC 中に足りなくなってしまっているようです。 下のパッチのように Fiber に対して割り当てる C のスタックサイズを増やせ ば、(根本的な解決には全くなっていませんが)きしもとさんからのご報告に添 付されていた reduct.rb で落ちることはなくなりました。 GC 中にスタックオーバーフローが発生しそうなときって今はどう対応してるん でしょう? gc.c 内の stack_check() の返り値が 1 になっても特に例外を吐く ようなことはしていないみたいなんですが。 Index: cont.c =================================================================== --- cont.c (revision 29154) +++ cont.c (working copy) @@ -45,7 +45,7 @@ #define RB_PAGE_SIZE (pagesize) #define RB_PAGE_MASK (~(RB_PAGE_SIZE - 1)) static long pagesize; -#define FIBER_MACHINE_STACK_ALLOCATION_SIZE (0x10000 / sizeof(VALUE)) +#define FIBER_MACHINE_STACK_ALLOCATION_SIZE (0x50000 / sizeof(VALUE)) #endif #define CAPTURE_JUST_VALID_VM_STACK 1