From: SHIROYAMA Takayuki Date: 1997-09-29T01:30:02+09:00 Subject: [ruby-list:4706] Re: fact.rb (1.0-970919, nextstep) ども、白山@fortune.nest.or.jpです。 In <199709271304.WAA00281@isami.ppp.kcn.or.jp> , HYOUDOU Kouichi said... > 兵藤です > > fact.rb で217までの階乗は計算できるのですが272を計算できませんでした > > 環境は NEXTSTEP3.3J/Intel > > % ruby --version > ruby - version 1.0-970919 (i386-nextstep3) > % ruby sample/fact.rb 272 > Illegal instruction > > です > ええっと、NeXTSTEP 3.3J / Motorola で確認しました。 うちでは206で駄目です(X_X) (試行結果) > felicia> ruby fact.rb 205 > 27184173495719234955325497894285864609305174626188195953135712918872494022865 65268579683565349182459671024838923645620582292411934756863812323202364293762 38534988215561182258365562513399934316659033266225434322556090863917829118535 04332989559285563415796185985231527265635456153063023700776214292167300728160 81975410804788160129058996224000000000000000000000000000000000000000000000000 00 > felicia> ruby fact.rb 206 > Illegal instruction > felicia> ruby --version > ruby - version 1.0-970919 (m68k-nextstep3) > felicia> > GDBで確認した所、rb_eval()で落ちてます。 > (gdb) run sample/fact.rb 206 > Starting program: /private/tmp/O_ruby-1_0-970919/ruby-1.0-970919/ruby sample/fact.rb 206 > Program generated(1): Memory access exception on address 0x3f7ffb4 (invalid address). > 0xae4a in rb_eval () > (gdb) where > #0 0xae4a in rb_eval () > #1 0xb034 in rb_eval () > #2 0xafc2 in rb_eval () > #3 0xebfe in rb_call () > #4 0xbc0e in rb_eval () > #5 0xb9a8 in rb_eval () > #6 0xafc2 in rb_eval () > #7 0xebfe in rb_call () > #8 0xbc0e in rb_eval () > (中略) > #98 0xafc2 in rb_eval () > #99 0xebfe in rb_call () > (More stack frames follow...) > (gdb) > 個人的な感想ですが、NeXTの何らかの資源を使い果た したって気がします。 っというわけで、eval.cを -gオプション付きにして再度 rubyを構築、実験してみました。 > (gdb) run sample/fact.rb 206 > Starting program: /private/tmp/O_ruby-1_0-970919/ruby-1.0-970919/ruby sample/fact.rb 206 > Program generated(1): Memory access exception on address 0x3f7ffb4 (invalid address). > Reading in symbols for eval.c...done. > 0x803c in rb_eval (self=85190240, node=0x5134ef8) at eval.c:1220 > 1220 { > (gdb) where > #0 0x803c in rb_eval (self=85190240, node=0x5134ef8) at eval.c:1220 > #1 0x8226 in rb_eval (self=85190240, node=0x5134db8) at eval.c:1265 > #2 0x81b4 in rb_eval (self=85190240, node=0x5134d68) at eval.c:1236 > #3 0xbdf0 in rb_call (class=0x513ed18, recv=85190240, mid=7233, argc=0, argv=0x3f80978, scope=1) at eval.c:3052 > #4 0x8e00 in rb_eval (self=85190240, node=0x5134e1c) at eval.c:1562 > #5 0x8b9a in rb_eval (self=85190240, node=0x5134de0) at eval.c:1544 > #6 0x81b4 in rb_eval (self=85190240, node=0x5134d68) at eval.c:1236 > #7 0xbdf0 in rb_call (class=0x513ed18, recv=85190240, mid=7233, argc=0, argv=0x3f8134c, scope=1) at eval.c:3052 > > な・・・なんか、スタックあふれのような気が してならない(^^;) 次に、こんなプログラム作りました。 ------------------------------------------------------------- int main() { foo( 1 ); } foo(int i) { i++; foo( i ); } ------------------------------------------------------------- (試行結果) > (gdb) run > Starting program: /private/tmp/ti > Program generated(1): Memory access exception on address 0x3f7fffc (invalid address). > Reading in symbols for t.c...done. > foo (i=43599) at t.c:9 > 9 { > (gdb) p &i > $2 = (int *) 0x3f80008 > (gdb) p &foo > $3 = (int (*)()) 0x3eae > (gdb) p &main > $4 = (int (*)()) 0x3e9a
> (gdb) up > #1 0x3ec0 in foo (i=43598) at t.c:11 > 11 foo( i ); > (gdb) p &i > $5 = (int *) 0x3f80014 > (gdb) > ここから判断するに、どうも0x3f80000がスタックの 下限で、fact.rbでのエラーも、それを越えてしまった からというのが原因だと考えてよさそうですね。 ちなみに、この fact.rbを実行中の topの結果では・・・ > PID USERNAME STATE PRI NICE THR VSIZE RSIZE %MEM %CPU TIME COMMAND > 29820 psi R 2 0 2 85M 904K 0.92 76.50 0:03 ruby > 227 psi SW 16 0 2 30M 8472K 8.62 5.10 344:17 WindowServe > 239 root SW 16 0 2 10M 6864K 6.98 2.50 8:58 Terminal > 29812 root R 10 0 1 1720K 384K 0.39 0.60 0:03 top > 248 psi SW 10 0 1 1976K 728K 0.74 0.00 0:19 csh っとでてます。VSIZEとはいえ、85Mとは・・・(^^;) --- SHIROYAMA Takayuki : Psi@fortune.nest.or.jp 「奇跡は起きます、起こしてみせます!」(c) N.T. PS: こういうことって、ruby-MLじゃなくて ruby-dev?の方 でいった方がいいですかね・・・ごめんなさい。