From: "とみたまさひろ" Date: 2008-02-19T18:21:58+09:00 Subject: [ruby-dev:33857] Re: Solaris で timeout.rb が Segmentation fault する。 とみたです。 うちの会社の環境でも発生したので、調べてみました。 次のような簡単なサンプルで再現します。 $ env -i ./ruby -e 'Thread.new{}' SPARC Solaris 10 で試したのですが、Ruby 1.8.1〜1.8.6 のすべてのバージョ ンで発生します。 システムコールトレースを取ると、 setitimer(ITIMER_VIRTUAL, 0xFFBFEF98, 0x00000000) = 0 Incurred fault #6, FLTBOUNDS %pc = 0xFF150E50 siginfo: SIGSEGV SEGV_MAPERR addr=0xFFC00000 Received signal #11, SIGSEGV [caught] siginfo: SIGSEGV SEGV_MAPERR addr=0xFFC00000 で、apptrace は、 -> ruby -> libc.so.1:setitimer(0x1, 0xffbfef40, 0x0) ** NR -> ruby -> libc.so.1:void * realloc(void * = 0x0, size_t = 0x11ac) <- ruby -> libc.so.1:realloc() = 0x1476e8 -> ruby -> libc_psr.so.1:memcpy(0x1476e8, 0xffbfeed0, 0x11ac) ** NR なので、スタックの下限(上限?)の 0xFFC00000 を超えてメモリからデータを読 み込もうとしているのが原因だと思います。 On Fri, 8 Feb 2008 15:22:03 +0900 Tanaka Akira wrote: > 件の 0x80 を 0 にするのはどうですかねぇ。効かない気もします > が。 On Fri, 8 Feb 2008 14:00:35 +0900 Tanaka Akira wrote: > 症状が変わらなかったら、次に怪しいのは gc.c にある、SPARC で > 0x80 を加える次の怪しげなコードですかねぇ。 > > #if defined(sparc) || defined(__sparc__) > # define STACK_LENGTH (rb_gc_stack_start - STACK_END + 0x80) 効きました。落ちなくなりました。 何なんでしょうね、このコード…。 -- とみたまさひろ 3469 42CC 4D32 F53C AD98 65A5 8C37 FF09 69C1 6040