From: Tanaka Akira Date: 2008-02-08T14:00:35+09:00 Subject: [ruby-dev:33654] Re: Solaris で timeout.rb が Segmentation fault する。 In article <87r6foys1z.wl%fumiyas@osstech.jp>, SATOH Fumiyasu writes: > スタックトレースをとってみましたが、これでわかりますか? > ---- シグナルハンドラからシグナル 11 (SIGSEGV) で呼び出されました ------ > [7] _memcpy(0x18aec0, 0xffbfffe0, 0xa4, 0x0, 0x4, 0xfffffff8), 位置: 0xff150e38 > [8] rb_thread_save_context(th = 0x1237c8), 行 10234 "eval.c" 1.8.6-p111 の 10234行は以下なので、スタックの領域の判断が間 違ってる気がっている気がします。 MEMCPY(th->stk_ptr, th->stk_pos, VALUE, th->stk_len); ところで、Solaris/x86 での問題に対処するために年末に以下のよ うなパッチを入れたのですが、1.8 の先端だとどうでしょう? Mon Dec 17 13:43:15 2007 Tanaka Akira * gc.c (stack_end_address): use local variable address instead of __builtin_frame_address(0) to avoid SEGV on SunOS 5.11 on x86 with gcc (GCC) 3.4.3 (csl-sol210-3_4-20050802). stack_end_address returned a frame address of garbage_collect since stack_end_address doesn't create its own frame. So a VALUE stored in a callee saved register, %edi, pushed into the stack at the beginning of garbage_collect was not marked. SPARC じゃなくて x86 ですし、症状も微妙に違う気がしますが。 症状が変わらなかったら、次に怪しいのは gc.c にある、SPARC で 0x80 を加える次の怪しげなコードですかねぇ。 #if defined(sparc) || defined(__sparc__) # define STACK_LENGTH (rb_gc_stack_start - STACK_END + 0x80) -- [田中 哲][たなか あきら][Tanaka Akira]