From: Hidetoshi NAGAI Date: 2004-03-02T13:28:07+09:00 Subject: [ruby-dev:23102] Re: pthread-enabled ruby receives SEGV when requiring a large library on gdb 永井@知能.九工大です. 結論から言うと, 「 Ruby 側の原因ではないのでどうしようもない 」 なのですが,他の人が同じような穴に落ちないように, 参考までにレポートしておきます. From: Hidetoshi NAGAI Subject: [ruby-dev:23074] pthread-enabled ruby receives SEGV when requiring a large library on gdb Date: Mon, 1 Mar 2004 00:23:30 +0900 Message-ID: <20040301.002328.71112369.nagai@ai.kyutech.ac.jp> > 表題の通り,pthread-enable な ruby を gdb 上で動かした際に > 大きなライブラリを require すると Segmentation fault で > 止ってしまいます. > gdb 上でなければ,そのライブラリは正常に読み込まれます. gdb から動かしたときに,gc.c の 360 行 -------------------------------------- heap_slots *= 1.8; -------------------------------------- の結果がおかしくなるのが原因のようです. この式の直前の heap_slots の値が 10000 (0x2710) の時, この式の直後に 18000 (0x4650) となるはずが 奇妙なことに -2147483648 (0x80000000) となってました. 念のため, -------------------------------------- heap_slots = (int)(heap_slots * 1.8); -------------------------------------- としても同じです. ところが,この行の直前に -------------------------------------- fprintf(stderr, "heap_slots %d * 1.8 = %d\n", heap_slots, (int)(heap_slots * 1.8)); -------------------------------------- という行を加えると,表示では -------------------------------------- heap_slots 10000 * 1.8 = -2147483648 -------------------------------------- などとなりますが,その後の heap_slots *= 1.8 の後の heap_slots の値は 18000 と正しい値になっています.(^_^; この fprintf の代りに -------------------------------------- { int tmp = (int)(heap_slots * 1.8); } -------------------------------------- を入れるなども試したのですが,print out しない限りはダメなようです. ゴミが出力されるのはうっとおしいですが,fprintf を追加することで 当座をしのいでおこうと思います. -- 永井 秀利 (九工大 知能情報) nagai@ai.kyutech.ac.jp