From: Yoshinori Sano Date: 2007-02-06T01:03:35+09:00 Subject: [ruby-dev:30267] Re: coredump on Mac OS X さの よしのりです 07/02/05 に SASADA Koichi さんは書きました: >  ささだです。 > > Yoshinori Sano wrote: > > YARV_PREVIOUS_CONTROL_FRAME(th->cfp)が、常に安全な > > アドレスを指していることを保証するのは難しいような気がするのですが。。。 > >  なぜでしょうか。出来ると思っていたので、こういう場合に無理、というのが > あればご指摘ください。 すいません。直感でした。 よく考えると、スレッドスタックの利用開始位置を調整してやれば、 YARV_PREVIOUS_CONTROL_FRAME(th->cfp)が、常にスレッドスタック の中のアドレスを示すようにできそうですね。 以下の変更がされる一つ前のr11627で、スレッドスタックの 利用開始位置を調整する実験をしてみました。 Mon Feb 5 04:09:48 2007 Yukihiro Matsumoto * eval.c (rb_frame_callee): check if prev_cfp can be accessible. a patch from Yoshinori Sano in [ruby-dev:30252]. solves [ruby-dev:30200] and [ruby-core:9856]. 以下のように、スレッドスタックの利用開始位置を1フレーム分 マージンをとることで、YARV_PREVIOUS_CONTROL_FRAME(th->cfp) が不正なアドレスを示さないようにできました。 Index: yarvcore.c =================================================================== --- yarvcore.c (revision 11627) +++ yarvcore.c (working copy) @@ -390,7 +390,7 @@ th->stack_size = YARV_THREAD_STACK_SIZE; th->cfp = (void *)(th->stack + th->stack_size); - th->cfp--; + th->cfp -= 2; th->cfp->pc = 0; th->cfp->sp = th->stack; % ./ruby -v no_such_file.rb ruby 1.9.0 (2007-02-04 patchlevel 0) [i686-darwin8.8.1] ./ruby:1: No such file or directory -- no_such_file.rb (LoadError) % gdb -q ./ruby Reading symbols for shared libraries ... done (gdb) b rb_frame_callee Breakpoint 1 at 0x3305: file eval.c, line 1882. (gdb) run no_such_file.rb Starting program: /Users/ysano/ruby-trunk/ruby no_such_file.rb Reading symbols for shared libraries .... done Breakpoint 1, rb_frame_callee () at eval.c:1882 1882 return frame_func_id(GET_THREAD()->cfp + 1); (gdb) p *(yarvCurrentThread->cfp+1) $1 = { pc = 0x0, sp = 0x0, bp = 0x0, iseq = 0x0, magic = 0, self = 0, lfp = 0x0, dfp = 0x0, 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+2) Cannot access memory at address 0x685000 07/02/05 に SASADA Koichi さんは書きました: > これに関しては,ご指摘の通りVMスタックの状態が不完全だから起きる,とい > うことなのですが,解決としては,最初からきちんとスタックを作っておく,と > いうことを考えていました.毎回チェックするのはなんか嫌ですので. ささださん > もしよろしければ、「最初からきちんとスタックを作っておく」という アイデアをもう少し詳しく説明していただけないでしょうか? (まだ理解できないかもしれませんが、興味があります。) 07/02/05 に SASADA Koichi さんは書きました: >  ささだです。 > > Yoshinori Sano wrote: > > YARV_PREVIOUS_CONTROL_FRAME(th->cfp)が、常に安全な > > アドレスを指していることを保証するのは難しいような気がするのですが。。。 > >  なぜでしょうか。出来ると思っていたので、こういう場合に無理、というのが > あればご指摘ください。 > > -- > // SASADA Koichi at atdot dot net > > > -- Yoshinori Sano