From: Tanaka Akira Date: 2007-12-15T06:09:00+09:00 Subject: [ruby-dev:32604] stack overflow by GC in a thread 以下のようにすると SEGV します。 % ./ruby -v -rstringio -e 's = "a" 10000.times { s = "a".instance_eval { @a = StringIO.new(s); self } } Thread.new { GC.start }.join' ruby 1.9.0 (2007-12-15 patchlevel 0) [i686-linux] zsh: segmentation fault (core dumped) ./ruby -v -rstringio -e どうも GC の mark 時の再帰で stack overflow しているようです。 StringIO は T_DATA なので lev は効かなくて、スレッドのスタッ クサイズは検査されていないようで。 なお、最初に発見したのは StringIO じゃなくて ISeq の mark_ary や cref_stack による再帰でした。それのために IA64 で test-all が最後までいかなかったので倍に増やしたのですが、 これをどうにかすれば増やさなくてもいいのかも。 Program terminated with signal 11, Segmentation fault. #0 0x080629a5 in gc_mark_children (ptr=3082942460, lev=1) at gc.c:873 873 register RVALUE *obj = RANY(ptr); (gdb) bt #0 0x080629a5 in gc_mark_children (ptr=3082942460, lev=1) at gc.c:873 #1 0x08062950 in gc_mark (ptr=3082942460, lev=0) at gc.c:861 #2 0x0806299a in rb_gc_mark (ptr=3082942460) at gc.c:867 #3 0xb7cad47c in strio_mark (ptr=0x8408ec8) at stringio.c:54 #4 0x08062d8c in gc_mark_children (ptr=3082942320, lev=1) at gc.c:1069 #5 0x08062950 in gc_mark (ptr=3082942320, lev=0) at gc.c:861 #6 0x0806274a in mark_entry (key=9449, value=3082942320, lev=0) at gc.c:770 #7 0x080d1665 in st_foreach (table=0x8408ee0, func=0x8062732 , arg=0) at st.c:593 #8 0x08062777 in mark_tbl (tbl=0x8408ee0, lev=0) at gc.c:778 #9 0x08062792 in rb_mark_tbl (tbl=0x8408ee0) at gc.c:784 #10 0x080f1be8 in rb_mark_generic_ivar (obj=3082942380) at variable.c:864 #11 0x08062a27 in gc_mark_children (ptr=3082942380, lev=1) at gc.c:886 #12 0x08062950 in gc_mark (ptr=3082942380, lev=0) at gc.c:861 #13 0x0806299a in rb_gc_mark (ptr=3082942380) at gc.c:867 #14 0xb7cad47c in strio_mark (ptr=0x8408fe8) at stringio.c:54 #15 0x08062d8c in gc_mark_children (ptr=3082942240, lev=1) at gc.c:1069 #16 0x08062950 in gc_mark (ptr=3082942240, lev=0) at gc.c:861 #17 0x0806274a in mark_entry (key=9449, value=3082942240, lev=0) at gc.c:770 #18 0x080d1665 in st_foreach (table=0x8409000, func=0x8062732 , arg=0) at st.c:593 #19 0x08062777 in mark_tbl (tbl=0x8409000, lev=0) at gc.c:778 #20 0x08062792 in rb_mark_tbl (tbl=0x8409000) at gc.c:784 #21 0x080f1be8 in rb_mark_generic_ivar (obj=3082942300) at variable.c:864 #22 0x08062a27 in gc_mark_children (ptr=3082942300, lev=1) at gc.c:886 #23 0x08062950 in gc_mark (ptr=3082942300, lev=0) at gc.c:861 #24 0x0806299a in rb_gc_mark (ptr=3082942300) at gc.c:867 #25 0xb7cad47c in strio_mark (ptr=0x8409108) at stringio.c:54 #26 0x08062d8c in gc_mark_children (ptr=3082942160, lev=1) at gc.c:1069 #27 0x08062950 in gc_mark (ptr=3082942160, lev=0) at gc.c:861 #28 0x0806274a in mark_entry (key=9449, value=3082942160, lev=0) at gc.c:770 #29 0x080d1665 in st_foreach (table=0x8409120, func=0x8062732 , arg=0) at st.c:593 #30 0x08062777 in mark_tbl (tbl=0x8409120, lev=0) at gc.c:778 #31 0x08062792 in rb_mark_tbl (tbl=0x8409120) at gc.c:784 #32 0x080f1be8 in rb_mark_generic_ivar (obj=3082942220) at variable.c:864 #33 0x08062a27 in gc_mark_children (ptr=3082942220, lev=1) at gc.c:886 #34 0x08062950 in gc_mark (ptr=3082942220, lev=0) at gc.c:861 #35 0x0806299a in rb_gc_mark (ptr=3082942220) at gc.c:867 #36 0xb7cad47c in strio_mark (ptr=0x8409228) at stringio.c:54 #37 0x08062d8c in gc_mark_children (ptr=3082942080, lev=1) at gc.c:1069 #38 0x08062950 in gc_mark (ptr=3082942080, lev=0) at gc.c:861 #39 0x0806274a in mark_entry (key=9449, value=3082942080, lev=0) at gc.c:770 ... -- [田中 哲][たなか あきら][Tanaka Akira]