https://redmine.ruby-lang.org/
https://redmine.ruby-lang.org/favicon.ico?1711330511
2008-12-31T17:06:41Z
Ruby Issue Tracking System
Ruby master - Bug #953: 深い入れ子の配列の取り扱いで落ちる
https://redmine.ruby-lang.org/issues/953?journal_id=2475
2008-12-31T17:06:41Z
mame (Yusuke Endoh)
mame@ruby-lang.org
<ul></ul><p>=begin<br>
遠藤です。</p>
<blockquote>
<p>以下のスクリプトを実行すると Segmentation fault で落ちました。</p>
<p>$ cat ./nest.rb<br>
a = [0]<br>
10000.times do<br>
a = [a]<br>
end<br>
p a</p>
</blockquote>
<p>どうも、C 関数の再帰が多すぎてマシンスタックが壊れてるような気がします。<br>
なので仕様といわれれば仕様なのかもしれません。</p>
<p>しかし p が動かないのは不便なので、再帰が 100 回以上になったら Fiber を<br>
使ってマシンスタックを伸びなくするパッチを書いてみました。<br>
make test-all は通ったみたいです。再帰が 100 回を超えた場合はそれなりに<br>
遅くなると思いますが、そんな場合はあんまりないかと思います。</p>
<a name="Index-threadc"></a>
<h1 >Index: thread.c<a href="#Index-threadc" class="wiki-anchor">¶</a></h1>
<p>--- thread.c (revision 21208)<br>
+++ thread.c (working copy)<br>
@@ -3191,13 +3191,13 @@<br>
static ID recursive_key;</p>
<p>static VALUE<br>
-recursive_check(VALUE hash, VALUE obj)<br>
+recursive_check(VALUE hash, VALUE obj, VALUE sym)<br>
{<br>
if (NIL_P(hash) || TYPE(hash) != T_HASH) {<br>
return Qfalse;<br>
}<br>
else {</p>
<ul>
<li>VALUE list = rb_hash_aref(hash, ID2SYM(rb_frame_this_func()));</li>
</ul>
<ul>
<li>
<p>VALUE list = rb_hash_aref(hash, sym);</p>
<p>if (NIL_P(list) || TYPE(list) != T_HASH)<br>
return Qfalse;<br>
@@ -3208,11 +3208,10 @@<br>
}</p>
</li>
</ul>
<p>static VALUE<br>
-recursive_push(VALUE hash, VALUE obj)<br>
+recursive_push(VALUE hash, VALUE obj, VALUE sym)<br>
{</p>
<ul>
<li>VALUE list, sym;</li>
</ul>
<ul>
<li>VALUE list;</li>
</ul>
<ul>
<li>sym = ID2SYM(rb_frame_this_func());<br>
if (NIL_P(hash) || TYPE(hash) != T_HASH) {<br>
hash = rb_hash_new();<br>
rb_thread_local_aset(rb_thread_current(), recursive_key, hash);<br>
@@ -3230,11 +3229,10 @@<br>
}</li>
</ul>
<p>static void<br>
-recursive_pop(VALUE hash, VALUE obj)<br>
+recursive_pop(VALUE hash, VALUE obj, VALUE sym)<br>
{</p>
<ul>
<li>VALUE list, sym;</li>
</ul>
<ul>
<li>VALUE list;</li>
</ul>
<ul>
<li>sym = ID2SYM(rb_frame_this_func());<br>
if (NIL_P(hash) || TYPE(hash) != T_HASH) {<br>
VALUE symname;<br>
VALUE thrname;<br>
@@ -3254,32 +3252,145 @@<br>
rb_hash_delete(list, obj);<br>
}</li>
</ul>
<p>-VALUE<br>
-rb_exec_recursive(VALUE (*func) (VALUE, VALUE, int), VALUE obj, VALUE arg)<br>
+static long<br>
+recursive_count(VALUE hash, VALUE sym)<br>
{</p>
<ul>
<li>if (NIL_P(hash) || TYPE(hash) != T_HASH) {</li>
<li>return 0;</li>
<li>}</li>
<li>else {</li>
<li>VALUE list = rb_hash_aref(hash, sym);</li>
<li>
<li>if (NIL_P(list) || TYPE(list) != T_HASH)</li>
<li>
<pre><code> return 0;
</code></pre>
</li>
<li>
<li>if (!RHASH(list)->ntbl)</li>
<li>
<pre><code> return 0;
</code></pre>
</li>
<li>return RHASH(list)->ntbl->num_entries;</li>
<li>}<br>
+}</li>
<li>
</ul>
<p>+static VALUE<br>
+exec_recursive_call(VALUE (*func) (VALUE, VALUE, int), VALUE obj, VALUE arg, VALUE sym)<br>
+{<br>
VALUE hash = rb_thread_local_aref(rb_thread_current(), recursive_key);<br>
VALUE objid = rb_obj_id(obj);</p>
<ul>
<li>if (recursive_check(hash, objid)) {</li>
</ul>
<ul>
<li>if (recursive_check(hash, objid, sym)) {<br>
return (*func) (obj, arg, Qtrue);<br>
}<br>
else {<br>
VALUE result = Qundef;<br>
int state;</li>
</ul>
<ul>
<li>hash = recursive_push(hash, objid);</li>
</ul>
<ul>
<li>hash = recursive_push(hash, objid, sym);<br>
PUSH_TAG();<br>
if ((state = EXEC_TAG()) == 0) {<br>
result = (*func) (obj, arg, Qfalse);<br>
}<br>
POP_TAG();</li>
</ul>
<ul>
<li>recursive_pop(hash, objid);</li>
</ul>
<ul>
<li>recursive_pop(hash, objid, sym);<br>
if (state)<br>
JUMP_TAG(state);<br>
return result;<br>
}<br>
}</li>
</ul>
<p>+static VALUE<br>
+exec_recursive_i(VALUE ctn, VALUE data)<br>
+{</p>
<ul>
<li>VALUE fiber = RARRAY_PTR(ctn)[0];</li>
<li>VALUE obj = RARRAY_PTR(ctn)[1];</li>
<li>VALUE arg = RARRAY_PTR(ctn)[2];</li>
<li>VALUE (*func) (VALUE, VALUE, int);</li>
<li>VALUE sym, hash, ret = Qundef;</li>
<li>int state;</li>
<li>
<li>sym = RARRAY_PTR(data)[0];</li>
<li>func = GC_GUARDED_PTR_REF(RARRAY_PTR(data)[1]);</li>
<li>hash = RARRAY_PTR(data)[2];</li>
<li>
<li>rb_thread_local_aset(rb_thread_current(), recursive_key, hash);</li>
<li>
<li>if (NIL_P(fiber)) {</li>
<li>return exec_recursive_call(func, obj, arg, sym);</li>
<li>}</li>
<li>
<li>PUSH_TAG();</li>
<li>if ((state = EXEC_TAG()) == 0) {</li>
<li>ret = exec_recursive_call(func, obj, arg, sym);</li>
<li>}</li>
<li>POP_TAG();</li>
<li>ret = ret == Qundef ? rb_ary_new3(2, INT2FIX(state), rb_errinfo()) : rb_ary_new3(1, ret);</li>
<li>return rb_fiber_resume(fiber, 1, &ret);<br>
+}</li>
<li>
</ul>
<p>+#define EXEC_RECURSIVE_CUTOFF 100<br>
+#define EXEC_RECURSIVE_UNIT 30<br>
+<br>
+VALUE<br>
+rb_exec_recursive(VALUE (*func) (VALUE, VALUE, int), VALUE obj, VALUE arg)<br>
+{</p>
<ul>
<li>VALUE hash = rb_thread_local_aref(rb_thread_current(), recursive_key);</li>
<li>VALUE sym = ID2SYM(rb_frame_this_func());</li>
<li>int count = recursive_count(hash, sym);</li>
<li>
<li>if (count == EXEC_RECURSIVE_CUTOFF) {</li>
<li>/* recursive call depth is too deep; detach machine stack by using fibers */</li>
<li>VALUE ctn = rb_ary_new3(3, Qnil, obj, arg); /* initial continuation */</li>
<li>VALUE data = rb_ary_new3(3, sym, GC_GUARDED_PTR(func), hash);</li>
<li>int state;</li>
<li>VALUE result = Qundef;</li>
<li>
<li>PUSH_TAG();</li>
<li>if ((state = EXEC_TAG()) == 0) {</li>
<li>
<pre><code> while (1) {
</code></pre>
</li>
<li>
<pre><code> VALUE fiber = rb_fiber_new(exec_recursive_i, data);
</code></pre>
</li>
<li>
<pre><code> VALUE val = rb_fiber_resume(fiber, 1, &ctn);
</code></pre>
</li>
<li>
<pre><code> if (RBASIC(val)->klass == 0) {
</code></pre>
</li>
<li>
<pre><code> /* next continuation is returned */
</code></pre>
</li>
<li>
<pre><code> ctn = rb_ary_new3(3, fiber, RARRAY_PTR(val)[0], RARRAY_PTR(val)[1]);
</code></pre>
</li>
<li>
<pre><code> }
</code></pre>
</li>
<li>
<pre><code> else {
</code></pre>
</li>
<li>
<pre><code> /* all calls are completed */
</code></pre>
</li>
<li>
<pre><code> result = val;
</code></pre>
</li>
<li>
<pre><code> break;
</code></pre>
</li>
<li>
<pre><code> }
</code></pre>
</li>
<li>
<pre><code> }
</code></pre>
</li>
<li>}</li>
<li>POP_TAG();</li>
<li>if (state) {</li>
<li>
<pre><code> /* propagate exception throwing */
</code></pre>
</li>
<li>
<pre><code> VALUE mesg = rb_errinfo();
</code></pre>
</li>
<li>
<pre><code> VALUE rb_make_backtrace(void);
</code></pre>
</li>
<li>
<pre><code> VALUE bt = rb_make_backtrace();
</code></pre>
</li>
<li>
<pre><code> if (OBJ_FROZEN(mesg)) {
</code></pre>
</li>
<li>
<pre><code> mesg = rb_obj_dup(mesg);
</code></pre>
</li>
<li>
<pre><code> }
</code></pre>
</li>
<li>
<pre><code> rb_funcall(mesg, rb_intern("set_backtrace"), 1, bt);
</code></pre>
</li>
<li>
<pre><code> GET_THREAD()->errinfo = mesg;
</code></pre>
</li>
<li>
<pre><code> JUMP_TAG(state);
</code></pre>
</li>
<li>}</li>
<li>return result;</li>
<li>}</li>
<li>else if (count < EXEC_RECURSIVE_CUTOFF || count % EXEC_RECURSIVE_UNIT != 0) {</li>
<li>/* normal recursive call */</li>
<li>return exec_recursive_call(func, obj, arg, sym);</li>
<li>}</li>
<li>else {</li>
<li>/* call depth of the fiber is too deep; yield continuation into main fiber */</li>
<li>VALUE ctn = rb_ary_new3(2, obj, arg);</li>
<li>VALUE ret;</li>
<li>RBASIC(ctn)->klass = 0;</li>
<li>ret = rb_fiber_yield(1, &ctn);</li>
<li>if (RARRAY_LEN(ret) == 0) {</li>
<li>
<pre><code> return RARRAY_PTR(ret)[0];
</code></pre>
</li>
<li>}</li>
<li>GET_THREAD()->errinfo = RARRAY_PTR(ret)[1];</li>
<li>JUMP_TAG(FIX2INT(RARRAY_PTR(ret)[0]));</li>
<li>}<br>
+}</li>
<li>
</ul>
<p>/* tracer */</p>
<p>static rb_event_hook_t *</p>
<p>--<br>
Yusuke ENDOH <a href="mailto:mame@tsg.ne.jp" class="email">mame@tsg.ne.jp</a></p>
<p>=end</p>
Ruby master - Bug #953: 深い入れ子の配列の取り扱いで落ちる
https://redmine.ruby-lang.org/issues/953?journal_id=2938
2009-02-03T10:15:09Z
shyouhei (Shyouhei Urabe)
shyouhei@ruby-lang.org
<ul><li><strong>Assignee</strong> set to <i>ko1 (Koichi Sasada)</i></li><li><strong>ruby -v</strong> set to <i>ruby 1.9.1 (2008-12-30 patchlevel-5000 trunk 21202) [i686-linux]</i></li></ul><p>=begin</p>
<p>=end</p>
Ruby master - Bug #953: 深い入れ子の配列の取り扱いで落ちる
https://redmine.ruby-lang.org/issues/953?journal_id=9279
2010-03-25T02:22:20Z
mame (Yusuke Endoh)
mame@ruby-lang.org
<ul><li><strong>Status</strong> changed from <i>Open</i> to <i>Closed</i></li></ul><p>=begin<br>
遠藤です。</p>
<blockquote>
<p>以下のスクリプトを実行すると Segmentation fault で落ちました。</p>
<p>$ cat ./nest.rb<br>
a = [0]<br>
10000.times do<br>
a = [a]<br>
end<br>
p a</p>
</blockquote>
<p>現在はもう落ちないようなので、close します。</p>
<p>rb_exec_recursive のあたりはたぶん結構いろいろ変わっているので、<br>
何のおかげで落ちなくなったのかはよくわかりません。すみません。</p>
<p>まだ再現するようなら reopen してください。</p>
<p>--<br>
Yusuke Endoh <a href="mailto:mame@tsg.ne.jp" class="email">mame@tsg.ne.jp</a><br>
=end</p>
Ruby master - Bug #953: 深い入れ子の配列の取り扱いで落ちる
https://redmine.ruby-lang.org/issues/953?journal_id=24281
2012-03-04T11:31:01Z
ktsj (Kazuki Tsujimoto)
kazuki@callcc.net
<ul><li><strong>Status</strong> changed from <i>Closed</i> to <i>Open</i></li><li><strong>Assignee</strong> deleted (<del><i>ko1 (Koichi Sasada)</i></del>)</li><li><strong>Target version</strong> set to <i>2.0.0</i></li></ul><p>=begin<br>
辻本です。</p>
<p>trunkで再現するようになっているのでreopenしておきます。</p>
<p>$ ./ruby -v ./nest.rb<br>
ruby 2.0.0dev (2012-03-03 trunk 34892) [x86_64-linux]<br>
./nest.rb:5: [BUG] Segmentation fault<br>
=end</p>
Ruby master - Bug #953: 深い入れ子の配列の取り扱いで落ちる
https://redmine.ruby-lang.org/issues/953?journal_id=24399
2012-03-11T15:07:22Z
ko1 (Koichi Sasada)
<ul><li><strong>Assignee</strong> set to <i>ko1 (Koichi Sasada)</i></li></ul><p>頑張ります.</p>
Ruby master - Bug #953: 深い入れ子の配列の取り扱いで落ちる
https://redmine.ruby-lang.org/issues/953?journal_id=24851
2012-03-18T18:46:38Z
shyouhei (Shyouhei Urabe)
shyouhei@ruby-lang.org
<ul><li><strong>Status</strong> changed from <i>Open</i> to <i>Assigned</i></li></ul>
Ruby master - Bug #953: 深い入れ子の配列の取り扱いで落ちる
https://redmine.ruby-lang.org/issues/953?journal_id=25789
2012-04-10T17:19:17Z
ko1 (Koichi Sasada)
<ul><li><strong>Status</strong> changed from <i>Assigned</i> to <i>Feedback</i></li></ul><p>随分前のチケットに対してすみません.<br>
こちら,まだ再現するでしょうか.手元の環境では,<br>
動いちゃったり,stack level too deep (SystemStackError)<br>
だったりで,それなりにちゃんと動いているような気がしております.</p>
Ruby master - Bug #953: 深い入れ子の配列の取り扱いで落ちる
https://redmine.ruby-lang.org/issues/953?journal_id=25811
2012-04-11T03:46:36Z
naruse (Yui NARUSE)
naruse@airemix.jp
<ul></ul><p>わたしの FreeBSD 9.0 amd64 や Ubuntu 10.04 x64 では再現しますね</p>
Ruby master - Bug #953: 深い入れ子の配列の取り扱いで落ちる
https://redmine.ruby-lang.org/issues/953?journal_id=25910
2012-04-15T11:57:53Z
ktsj (Kazuki Tsujimoto)
kazuki@callcc.net
<ul></ul><p>手元のUbuntu 10.04 x64ではr35333でも再現しました。</p>
<p>ですが、一からOSをインストールし直した環境では正常に動作しているので<br>
正確な再現条件は不明です。</p>
Ruby master - Bug #953: 深い入れ子の配列の取り扱いで落ちる
https://redmine.ruby-lang.org/issues/953?journal_id=25912
2012-04-15T21:07:37Z
ktsj (Kazuki Tsujimoto)
kazuki@callcc.net
<ul></ul><p>ulimit -s 4096とすることで、Ubuntu {10.04,11.10} {x86,x64}で再現できましたが<br>
どうでしょうか。</p>
Ruby master - Bug #953: 深い入れ子の配列の取り扱いで落ちる
https://redmine.ruby-lang.org/issues/953?journal_id=33892
2012-11-26T08:59:40Z
ko1 (Koichi Sasada)
<ul><li><strong>Target version</strong> changed from <i>2.0.0</i> to <i>2.6</i></li></ul><p>タイムアップとして次に回します.</p>
Ruby master - Bug #953: 深い入れ子の配列の取り扱いで落ちる
https://redmine.ruby-lang.org/issues/953?journal_id=34558
2012-12-09T21:27:35Z
mame (Yusuke Endoh)
mame@ruby-lang.org
<ul><li><strong>Status</strong> changed from <i>Feedback</i> to <i>Assigned</i></li><li><strong>Target version</strong> changed from <i>2.6</i> to <i>2.0.0</i></li></ul><p>ulimit -s 4096 で Ubuntu 12.10 x64 で再現できませんでしたが、<br>
たぶん特に状況は変わってないんですよね。</p>
<p>再現性のある SEGV ということで、2.0.0 で直したほうがいいと思います。</p>
<p>ささださんが修正方針を示して、再現環境のある成瀬さんや ktsj さんが<br>
パッチを作るのいいかも知れない?</p>
<p>--<br>
Yusuke Endoh <a href="mailto:mame@tsg.ne.jp" class="email">mame@tsg.ne.jp</a></p>
Ruby master - Bug #953: 深い入れ子の配列の取り扱いで落ちる
https://redmine.ruby-lang.org/issues/953?journal_id=34583
2012-12-10T17:17:44Z
ktsj (Kazuki Tsujimoto)
kazuki@callcc.net
<ul></ul><p>=begin<br>
ulimit -s 4096 / Ubuntu 12.04 x64 でtrunk(r38279)で追試してみたところ、<br>
状況が変わっていて、SystemStackErrorにはなるものの<br>
MALLOC_CHECK_で落ちるようになっています。</p>
<p>$ ./ruby nest.rb<br>
nest.rb:5: stack level too deep (SystemStackError)<br>
*** glibc detected *** ./ruby: munmap_chunk(): invalid pointer: 0x0000555555a55f40 ***<br>
======= Backtrace: =========<br>
/lib/x86_64-linux-gnu/libc.so.6(+0x7e626)[0x7ffff6f3f626]<br>
./ruby(+0x1af3e0)[0x5555557033e0]<br>
./ruby(ruby_vm_destruct+0x75)[0x555555702c56]<br>
./ruby(ruby_cleanup+0x382)[0x5555555b29c2]<br>
./ruby(ruby_run_node+0x45)[0x5555555b2b7b]<br>
./ruby(+0x20f09)[0x555555574f09]<br>
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x7ffff6ee276d]<br>
./ruby(+0x20dd9)[0x555555574dd9]</p>
<p>この際のバックトレースは以下の通りです。</p>
<p>Program received signal SIGABRT, Aborted.<br>
0x00007ffff6ef7445 in raise () from /lib/x86_64-linux-gnu/libc.so.6<br>
(gdb) bt<br>
#0 0x00007ffff6ef7445 in raise () from /lib/x86_64-linux-gnu/libc.so.6<br>
#1 0x00007ffff6efabab in abort () from /lib/x86_64-linux-gnu/libc.so.6<br>
#2 0x00007ffff6f34e2e in ?? () from /lib/x86_64-linux-gnu/libc.so.6<br>
#3 0x00007ffff6f3f626 in ?? () from /lib/x86_64-linux-gnu/libc.so.6<br>
#4 0x000055555570344d in thread_free (ptr=0x5555559ee570) at vm.c:1762<br>
#5 0x0000555555702cc3 in ruby_vm_destruct (vm=0x5555559edf20) at vm.c:1570<br>
<a class="issue tracker-1 status-5 priority-4 priority-default closed behind-schedule" title="Bug: sprintf() of %f on Windows(MSVCRT) (Closed)" href="https://redmine.ruby-lang.org/issues/6">#6</a> 0x00005555555b29c2 in ruby_cleanup (ex=1) at eval.c:233<br>
#7 0x00005555555b2b7b in ruby_run_node (n=0x555555dbd030) at eval.c:307<br>
#8 0x0000555555574f09 in main (argc=5, argv=0x7fffffffe018) at main.c:36<br>
(gdb) fr 4<br>
#4 0x000055555570344d in thread_free (ptr=0x5555559ee570) at vm.c:1762<br>
1762 free(th->altstack);<br>
(gdb) p th->altstack<br>
$3 = (void *) 0x555555a55f40</p>
<p>これは[Bug <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: ALT_STACK_SIZE is not enough (Closed)" href="https://redmine.ruby-lang.org/issues/7141">#7141</a>]と同件のようなので、まずはそちらの対応待ちということでどうでしょうか。</p>
<ul>
<li>「altstackの周りをmprotectして確認」するパッチを当てるとSEGVするようになる。</li>
<li>「ALT_STACK_SIZEを5倍くらいする」パッチを当てると、単にSystemStackErrorで終わるようになる。(MALLOC_CHECK_にもかからない)<br>
=end</li>
</ul>
Ruby master - Bug #953: 深い入れ子の配列の取り扱いで落ちる
https://redmine.ruby-lang.org/issues/953?journal_id=34773
2012-12-16T10:35:15Z
ktsj (Kazuki Tsujimoto)
kazuki@callcc.net
<ul><li><strong>Status</strong> changed from <i>Assigned</i> to <i>Closed</i></li></ul><p>r38409にて問題が修正されたことを確認できたのでクローズしておきます。(Ubuntu 11.10/12.06 x64)</p>
<p>成瀬さんの環境で直っていないようであれば、再オープンしていただけますか。</p>
Ruby master - Bug #953: 深い入れ子の配列の取り扱いで落ちる
https://redmine.ruby-lang.org/issues/953?journal_id=34776
2012-12-16T23:11:23Z
kosaki (Motohiro KOSAKI)
kosaki.motohiro@gmail.com
<ul></ul><p>うーん、r38409はSIGSEGVが起きた「後」、もう一回SIGSEGしてしまってバックトレースが正しく採取できない問題に対するパッチなのでSIGSEGVを起きなくさせる効果はないはずなんですが・・・・</p>
Ruby master - Bug #953: 深い入れ子の配列の取り扱いで落ちる
https://redmine.ruby-lang.org/issues/953?journal_id=34777
2012-12-16T23:56:00Z
ktsj (Kazuki Tsujimoto)
kazuki@callcc.net
<ul></ul><p><a href="/issues/953">[ruby-dev:46721]</a>の詳細は以下のようになります。</p>
<ol>
<li>
<p>rb_exec_recursive等により一回マシンスタックを突き破ってSIGSEGVが発生。<br>
(ちなみに、このときのメモリレイアウトを<a href="https://gist.github.com/4249318%E3%81%AE%E3%80%8C#953%E3%81%AEnest.rb%E5%AE%9F%E8%A1%8C%E6%99%82%E3%81%ABSystemStackError%E3%81%A8%E3%81%AA%E3%81%A3%E3%81%9F%E9%9A%9B%E3%81%AE%E4%BE%8B%E3%80%8D%E3%81%AB%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99" class="external">https://gist.github.com/4249318の「#953のnest.rb実行時にSystemStackErrorとなった際の例」にまとめています</a>)</p>
</li>
<li>
<p>sigsegv関数が呼ばれるがその処理の中でaltstackを突き破っておそらくmalloc headerを破壊。</p>
</li>
</ol>
<pre><code>Hardware watchpoint 5: *(((char*)(0x555555a55f40))-3)
Old value = 0 '\000'
New value = 85 'U'
GET_THREAD () at vm_core.h:839
(gdb) i f
Stack level 0, frame at 0x555555a55f40:
rip = 0x55555567d91b in GET_THREAD (vm_core.h:839); saved rip 0x55555567d93c
called by frame at 0x555555a55f50
source language c.
Arglist at 0x555555a55f30, args:
Locals at 0x555555a55f30, Previous frame's sp is 0x555555a55f40
Saved registers:
rip at 0x555555a55f38
(gdb) p ruby_current_thread->altstack
$31 = (void *) 0x555555a55f40
(gdb) bt
#0 GET_THREAD () at vm_core.h:839
#1 0x000055555567d93c in rb_safe_level () at safe.c:30
#2 0x000055555569296e in str_modifiable (str=93824999742280) at string.c:1313
#3 0x00005555556929ab in str_independent (str=93824999742280) at string.c:1320
#4 0x0000555555694949 in rb_str_resize (str=93824999742280, len=120) at string.c:1835
#5 0x0000555555686c82 in ruby__sfvwrite (fp=0x555555a566b0, uio=0x555555a56150) at sprintf.c:1168
#6 0x0000555555683c6b in BSD__sprint (fp=0x555555a566b0, uio=0x555555a56150) at vsnprintf.c:333
#7 0x00005555556865cb in BSD_vfprintf (fp=0x555555a566b0, fmt0=0x55555571d379 "%s:%d", ap=0x555555a56720) at vsnprintf.c:1194
#8 0x000055555568705e in rb_enc_vsprintf (enc=0x5555559f3a80, fmt=0x55555571d379 "%s:%d", ap=0x555555a56720) at sprintf.c:1242
#9 0x0000555555687158 in rb_enc_sprintf (enc=0x5555559f3a80, format=0x55555571d379 "%s:%d") at sprintf.c:1257
#10 0x00005555555b2f1d in setup_exception (th=0x5555559ee570, tag=6, mesg=93824997401520) at eval.c:447
#11 0x00005555555b3456 in rb_longjmp (tag=6, mesg=93824997401520) at eval.c:519
#12 0x00005555555b34bb in rb_exc_raise (mesg=93824997401520) at eval.c:532
#13 0x000055555570f174 in ruby_thread_stack_overflow (th=0x5555559ee570) at thread.c:1937
#14 0x000055555567e650 in sigsegv (sig=11, info=0x555555a56b30, ctx=0x555555a56a00) at signal.c:618
#15 <signal handler called>
#16 0x0000555555712d89 in exec_recursive (func=<error reading variable: Cannot access memory at address 0x7fffffbfefe8>, obj=<error reading variable: Cannot access memory at address 0x7fffffbfefe0>,
pairid=<error reading variable: Cannot access memory at address 0x7fffffbfefd8>, arg=<error reading variable: Cannot access memory at address 0x7fffffbfefd0>,
outer=<error reading variable: Cannot access memory at address 0x7fffffbfefcc>) at thread.c:4710
</code></pre>
<ol start="3">
<li>この時点では動作に直接的な影響は起きず、SystemStackError扱いのままプロセスの終了処理へ。</li>
<li>altstackのfree時にmalloc headerが壊れているためabort。</li>
</ol>
<p>r38409にて2.が起こらなくなったので、きれいにSystemStackErrorで終了するようになったものと理解しています。</p>
<p>なお、<a href="/issues/953">[ruby-dev:45515]</a>で報告した際にはそもそもSystemStackErrorにすらならなかったので<br>
そのときに起きていた問題に対しr38409は有効ではない、というのはその通りだと思います。<br>
こちらは詳細を追っていないので原因は分かっていません。</p>
<a name="何か勘違いしてますかね"></a>
<h1 >何か勘違いしてますかね?<a href="#何か勘違いしてますかね" class="wiki-anchor">¶</a></h1>
Ruby master - Bug #953: 深い入れ子の配列の取り扱いで落ちる
https://redmine.ruby-lang.org/issues/953?journal_id=38445
2013-04-11T21:18:32Z
naruse (Yui NARUSE)
naruse@airemix.jp
<ul></ul><p>SystemStackError になることを確認しました</p>
<p>% ./ruby -v nest.rb<br>
ruby 2.1.0dev (2013-04-11 trunk 40238) [x86_64-freebsd9.1]<br>
nest.rb:5: stack level too deep (SystemStackError)</p>