From: Yui NARUSE Date: 2011-08-03T11:43:40+09:00 Subject: [ruby-dev:44339] [Ruby 1.9 - Bug #5139] sigsegv のスタックオーバフロー Issue #5139 has been updated by Yui NARUSE. Tomoyuki Chikanaga wrote: > (A) の 32bit マシンでは最新版の trunk で直っていました。 > しかし (B) の x86_64 -O3 つきではやはり "C level backtrace information" まで表示して SEGV しています。 B) Red Hat Enterprise Linux ES release 4 (Nahant Update 8) って、r32751 より前ではきちんと動いてました? ---------------------------------------- Bug #5139: sigsegv のスタックオーバフロー http://redmine.ruby-lang.org/issues/5139 Author: Tomoyuki Chikanaga Status: Assigned Priority: Normal Assignee: Motohiro KOSAKI Category: core Target version: 1.9.3 ruby -v: - 現在の trunk が Linux で test_segv_test(TestRubyOptions) が Failure になります。 $ ruby -e 'Process.kill :SEGV, $$' のように実行すると表示されるはずのバックトレースや LOADED FEATURES の情報が表示されないためです。 おそらく r32751 からだと思うのですが、手元の環境(Ubuntu 10.4, Kernel 2.6.32-33-generic, gcc 4.4.3) では どうやら sigsegv() から呼ばれている rb_vm_bugreport() で sigaltstack で設定したシグナルハンドラ用スタックを オーバフローして、シグナルハンドラ内で再度 SEGV していると思います。 以下 gdb での実行の抜粋 (gdb) run -e 'Process.kill 11, $$' Program received signal SIGSEGV, Segmentation fault. 0x0012d422 in __kernel_vsyscall () (gdb) c Continuing. -e:1: [BUG] Segmentation fault ruby 1.9.4dev (2011-08-01 trunk 32793) [i686-linux] ------------ snip ----------- * Loaded features: Program received signal SIGSEGV, Segmentation fault. 0x08150864 in rb_vm_bugreport () at ../ruby/vm_dump.c:834 834 for (i=0; iloaded_features); i++) { (gdb) p ruby_current_thread->altstack $5 = (void *) 0x8221ab8 (gdb) p $esp $6 = (void *) 0x8220560 (gdb) p $esp - ruby_current_thread->altstack $7 = -5464 (gdb) up #1 0x08187095 in report_bug (file=0x82480b0 "-e", line=1, fmt=0x81c3bcb "Segmentation fault", args=0x8222714 "\263\063") at ../ruby/error.c:265 265 rb_vm_bugreport(); (gdb) p (char *)$esp - (char *)ruby_current_thread->altstack $15 = -5144 (gdb) up #2 0x08187121 in rb_bug (fmt=0x81c3bcb "Segmentation fault") at ../ruby/error.c:284 284 report_bug(file, line, fmt, args); (gdb) p (char *)$esp - (char *)ruby_current_thread->altstack $16 = 3112 $esp と ruby_current_thread->altstack の関係をみてオーバフローではないかと思ったのですがどうでしょう。 なお sigaltstack に渡しているスタックサイズは 4096 です。 -- http://redmine.ruby-lang.org