From: Yoshinori Sano Date: 2007-02-04T18:52:20+09:00 Subject: [ruby-dev:30252] Re: coredump on Mac OS X さの よしのり です > はじめまして、まるまる と申します。 > 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 さんは書きました: > はじめまして、まるまる と申します。 > 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