From: WATANABE Tetsuya Date: 2007-05-20T13:15:51+09:00 Subject: [ruby-dev:30794] Re: 1.9 coredump 渡辺哲也です。 In message "[ruby-dev:30791] 1.9 coredump" on 07/05/18, WATANABE Tetsuya writes: |ruby 1.9.0 (2007-05-17 patchlevel 0) [i686-linux] | |上で core して落ちますので報告します。 の件ですが、スタックサイズの変更で対応(回避)できるようなのでお 知らせします。core の条件として扱うファイル量が関係していまし た。 ------------------------------ スタックオーバーフローのハンドリング(Stack Overflow Handling) http://www.nminoru.jp/~nminoru/programming/stackoverflow_handling.html ------------------------------ を読んでいたのですが、スタックサイズを倍、三倍にすることで扱う ファイル量を増やしても core しなくなることが確認できました。 確認したシステムは Vine Linux 4.1 になります。デフォルトでは 8MB です。 ------------------------------ $ ulimit -s 8192 ------------------------------ core する場合にはスタックサイズを増やすことが有効のようです。 以下は core した場合に ulimit -s でスタックサイズを増やして core を回避した経過です。ruby 1.9 のソースコードで試しています。 ------------------------------ $ rg.rb SIGV *.c zsh: 16153 segmentation fault rg.rb SIGV *.c $ ulimit -s 16384 $ rg.rb SIGV *.c signal.c:#ifdef SIGVTALRM signal.c: {"VTALRM", SIGVTALRM}, signal.c: sigdelset(&mask, SIGVTALRM); signal.c: if (sig == SIGVTALRM) { signal.c: rb_raise(rb_eArgError, "SIGVTALRM reserved for Thread; can't set handler"); rg.rb SIGV *.c 1.88s user 1.31s system 97% cpu 3.255 total $ rg.rb SIGV *.c *.h */*.c signal.c:#ifdef SIGVTALRM signal.c: {"VTALRM", SIGVTALRM}, signal.c: sigdelset(&mask, SIGVTALRM); signal.c: if (sig == SIGVTALRM) { signal.c: rb_raise(rb_eArgError, "SIGVTALRM reserved for Thread; can't set handler"); zsh: 16164 segmentation fault rg.rb SIGV *.c *.h */*.c $ ulimit -s 24576 $ rg.rb SIGV *.c *.h */*.c signal.c:#ifdef SIGVTALRM signal.c: {"VTALRM", SIGVTALRM}, signal.c: sigdelset(&mask, SIGVTALRM); signal.c: if (sig == SIGVTALRM) { signal.c: rb_raise(rb_eArgError, "SIGVTALRM reserved for Thread; can't set handler"); rg.rb SIGV *.c *.h */*.c 1.82s user 1.70s system 98% cpu 3.567 total ------------------------------