[#30408] Ruby 1.8.6 preview2 has been released — "Akinori MUSHA" <knu@...>

 Ruby 1.8.6 preview2 をリリースしました。

20 messages 2007/02/24
[#30414] fail to autoload at $SAFE==4 (Re: Ruby 1.8.6 preview2 has been released) — Hidetoshi NAGAI <nagai@...> 2007/02/25

永井@知能.九工大です.

[#30418] Re: fail to autoload at $SAFE==4 (Re: Ruby 1.8.6 preview2 has been released) — Nobuyoshi Nakada <nobu@...> 2007/02/25

なかだです。

[ruby-dev:30252] Re: coredump on Mac OS X

From: "Yoshinori Sano" <yoshinori.sano@...>
Date: 2007-02-04 09:52:20 UTC
List: ruby-dev #30252
さの よしのり です

> はじめまして、まるまる と申します。
> Mac OS X 10.4 でも [ruby-dev:30198] coredump on NetBSD と同様の症状が
> 見られましたので、ご報告致します。

以下の環境でもバグが再現することを確認しました。

% uname -a
Darwin MacBookPro.local 8.8.1 Darwin Kernel Version 8.8.1: Mon Sep 25
19:42:00 PDT 2006; root:xnu-792.13.8.obj~1/RELEASE_I386 i386 i386
% gcc --version
i686-apple-darwin8-gcc-4.0.1 (GCC) 4.0.1 (Apple Computer, Inc. build 5250)
Copyright (C) 2005 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


% cat no_such_file.rb
cat: no_such_file.rb: No such file or directory
% ./ruby no_such_file.rb
-- stack frame ------------
-- control frame ----------
c:0001 p:---- s:0000 b:-001 l:000000 d:000000 ------
---------------------------
[BUG] Segmentation fault
ruby 1.9.0 (2007-02-04) [i686-darwin8.8.1]

zsh: abort      ./ruby no_such_file.rb


GDBでこのバグを分析してみました。

% gdb --quiet ./ruby
Reading symbols for shared libraries ... done
(gdb) run no_such_file.rb
Starting program: /Users/ysano/ruby-trunk/ruby no_such_file.rb
Reading symbols for shared libraries .... done

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x0068500c
frame_func_id (cfp=0x685000) at eval.c:1861
1861        yarv_iseq_t *iseq = cfp->iseq;
(gdb) bt
#0  frame_func_id (cfp=0x685000) at eval.c:1861
#1  0x00003349 in error_pos () at eval_error.h:39
#2  0x00005f55 in error_print () at eval_error.h:100
#3  0x000063ab in error_handle (ex=893572) at eval_error.h:241
#4  0x0000643f in ruby_options (argc=2, argv=0xbffff0c0) at eval.c:146
#5  0x00001d6e in main (argc=2, argv=0xbffff0c0, envp=0xbffff0cc) at main.c:46
(gdb) f 0
#0  frame_func_id (cfp=0x685000) at eval.c:1861
1861        yarv_iseq_t *iseq = cfp->iseq;
(gdb) list
1856    }
1857
1858    static ID
1859    frame_func_id(yarv_control_frame_t *cfp)
1860    {
1861        yarv_iseq_t *iseq = cfp->iseq;
1862        if (!iseq) {
1863            return cfp->method_id;
1864        }
1865        else if (YARV_IFUNC_P(iseq)) {
(gdb) p *(yarvCurrentThread->cfp)
$2 = {
  pc = 0x0,
  sp = 0x605000,
  bp = 0x0,
  iseq = 0x0,
  magic = 0,
  self = 4,
  lfp = 0x605000,
  dfp = 0x605000,
  block_iseq = 0x0,
  proc = 0,
  callee_id = 0,
  method_id = 0,
  method_klass = 0,
  prof_time_self = 0,
  prof_time_chld = 0,
  dummy = 0
}

(gdb) p *(yarvCurrentThread->cfp+1)
Cannot access memory at address 0x685000
(gdb) p (yarvCurrentThread->stack)
$4 = (VALUE *) 0x605000
(gdb) p (yarvCurrentThread->stack + yarvCurrentThread->stack_size)
$5 = (VALUE *) 0x685000


この分析結果から、以下のパッチを作りました。
yarvCurrentThread->cfp+1が、yarvcore.cのth_init2()で確保されたスレッドスタック
の中にあるかどうかチェックするようにしました。

Index: eval.c
===================================================================
--- eval.c  (revision 11626)
+++ eval.c  (working copy)
@@ -1879,7 +1879,13 @@
 ID
 rb_frame_callee(void)
 {
-    return frame_func_id(GET_THREAD()->cfp + 1);
+    yarv_thread_t *th = GET_THREAD();
+    yarv_control_frame_t *prev_cfp = YARV_PREVIOUS_CONTROL_FRAME(th->cfp);
+    /* check if prev_cfp can be accessible */
+    if ((void *)(th->stack + th->stack_size) == (void *)(prev_cfp)) {
+        return 0;
+    }
+    return frame_func_id(prev_cfp);
 }


このパッチを適用すると、seg faultしなくなります。

% ./ruby no_such_file.rb
./ruby:1: No such file or directory -- no_such_file.rb (LoadError)


また、[ruby-core:9856] YARV segfault when reading from STDIN
で指摘されていた問題も、このパッチを適用すると解決できます。

http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/9856

(パッチ適用前)
%  ./ruby
(Ctrl+c)
-- stack frame ------------
-- control frame ----------
c:0001 p:---- s:0000 b:-001 l:000000 d:000000 ------
---------------------------
[BUG] Segmentation fault
ruby 1.9.0 (2007-02-04) [i686-darwin8.8.1]

zsh: abort      ./ruby

(パッチ適用後)
% ./ruby
(Ctrl+c)
./ruby:1: Interrupt


07/01/29 に T. Kanai<tin.k.gm@gmail.com> さんは書きました:
> はじめまして、まるまる と申します。
> Mac OS X 10.4 でも [ruby-dev:30198] coredump on NetBSD と同様の症状が
> 見られましたので、ご報告致します。
>
> ただし、OS X では Revision11540 以降ビルドできなくなっているため、
> ([riby-core:9958] rb_cProc and rb_cBinding defined twice in trunk)
> 以下の crash.log は Revision11540 のものです。
> (念のため、手元でソースを変更してビルドした ruby 1.9.0 (2007-01-28 patchlevel 0)
> でも同様でした。)
>
> $ ruby/11540/miniruby -v 0
> ruby 1.9.0 (2007-01-16 patchlevel 0) [powerpc-darwin8.8.0]
> -- stack frame ------------
> -- control frame ----------
> c:0001 p:---- s:0000 b:-001 l:000000 d:000000 ------
> ---------------------------
> [BUG] Segmentation fault
> ruby 1.9.0 (2007-01-16) [powerpc-darwin8.8.0]
>
> Abort trap
>
>
> --- ここから miniruby.crash.log抜粋 ---
> Exception:  EXC_BAD_ACCESS (0x0001)
> Codes:      KERN_INVALID_ADDRESS (0x0001) at 0x0068500c
>
> Thread 0 Crashed:
> 0   miniruby            0x00004434 frame_func_id + 4 (eval.c:1858)
> 1   miniruby            0x00004534 error_pos + 100 (eval_error.h:39)
> 2   miniruby            0x000075e4 error_print + 308 (eval_error.h:100)
> 3   miniruby            0x00007b9c error_handle + 364 (eval_error.h:241)
> 4   miniruby            0x00007c84 ruby_options + 148 (eval.c:149)
> 5   miniruby            0x00002590 main + 48 (eval_intern.h:303)
> 6   miniruby            0x0000217c _start + 760
> 7   miniruby            0x00001e80 start + 48
>
> Thread 1:
> 0   libSystem.B.dylib   0x90040978 mach_wait_until + 8
> 1   libSystem.B.dylib   0x90040744 nanosleep + 388
> 2   miniruby            0x0005f734 thread_timer + 100 (thread_pthread.ci:414)
> 3   libSystem.B.dylib   0x9002b508 _pthread_body + 96
>
> Thread 0 crashed with PPC Thread State 64:
>   srr0: 0x0000000000004434 srr1: 0x100000000000f030
>     vrsave: 0x0000000000000000
>     cr: 0x28000424          xer: 0x0000000000000000   lr:
> 0x0000000000004534  ctr: 0x00000000900015c0
>     r0: 0x0000000000004534   r1: 0x00000000bffff260   r2:
> 0x00000000000e7034   r3: 0x0000000000685000
>     r4: 0x00000000011220d1   r5: 0x000000000000754c   r6:
> 0x00000000bffff374   r7: 0x00000000000000ff
>     r8: 0x00000000bffff360   r9: 0x00000000002c5000  r10:
> 0x00000000000044a8  r11: 0x0000000000000000
>    r12: 0x00000000900015c0  r13: 0x0000000000000000  r14:
> 0x0000000000000000  r15: 0x0000000000000000
>    r16: 0x0000000000000000  r17: 0x0000000000000000  r18:
> 0x0000000000000000  r19: 0x0000000000000000
>    r20: 0x0000000000000000  r21: 0x0000000000000000  r22:
> 0x0000000000000000  r23: 0x0000000000000000
>    r24: 0x0000000000000000  r25: 0x0000000000000003  r26:
> 0x00000000bffffb98  r27: 0x0000000000000001
>    r28: 0x00000000000f3d4c  r29: 0x00000000000f3d50  r30:
> 0x00000000000e7034  r31: 0x00000000000044dc
>
> Binary Images Description:
>     0x1000 -    0xe6fff miniruby        /Users/marumaru/ruby/11540/miniruby
> 0x8fe00000 - 0x8fe51fff dyld 45.3       /usr/lib/dyld
> 0x90000000 - 0x901bcfff libSystem.B.dylib       /usr/lib/libSystem.B.dylib
> 0x90214000 - 0x90219fff libmathCommon.A.dylib
>         /usr/lib/system/libmathCommon.A.dylib
> 0x90a3a000 - 0x90abefff libobjc.A.dylib         /usr/lib/libobjc.A.dylib
> 0x90b6e000 - 0x90b80fff libauto.dylib   /usr/lib/libauto.dylib
> --- miniruby.crash.log ここまで ---
>
> 以上です。
> ---
> まるまる = T.Kanai
>
>


-- 
Yoshinori Sano <yoshinori.sano@gmail.com>

In This Thread