[#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:30267] Re: coredump on Mac OS X

From: "Yoshinori Sano" <yoshinori.sano@...>
Date: 2007-02-05 16:03:35 UTC
List: ruby-dev #30267
さの よしのりです

07/02/05 に SASADA Koichi<ko1@atdot.net> さんは書きました:
>  ささだです。
>
> 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  <matz@ruby-lang.org>

    * eval.c (rb_frame_callee): check if prev_cfp can be accessible.
      a patch from Yoshinori Sano <yoshinori.sano at gmail.com> 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<ko1@atdot.net> さんは書きました:
> これに関しては,ご指摘の通りVMスタックの状態が不完全だから起きる,とい
> うことなのですが,解決としては,最初からきちんとスタックを作っておく,と
> いうことを考えていました.毎回チェックするのはなんか嫌ですので.

ささださん >
もしよろしければ、「最初からきちんとスタックを作っておく」という
アイデアをもう少し詳しく説明していただけないでしょうか?
(まだ理解できないかもしれませんが、興味があります。)



07/02/05 に SASADA Koichi<ko1@atdot.net> さんは書きました:
>  ささだです。
>
> Yoshinori Sano wrote:
> > YARV_PREVIOUS_CONTROL_FRAME(th->cfp)が、常に安全な
> > アドレスを指していることを保証するのは難しいような気がするのですが。。。
>
>  なぜでしょうか。出来ると思っていたので、こういう場合に無理、というのが
> あればご指摘ください。
>
> --
> // SASADA Koichi at atdot dot net
>
>
>


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

In This Thread