Issue #6216 has been updated by thedarkone (Vit Z).


=begin
I'm not sure @matz/@ko1 understood what @postmodern was trying to describe.

Given an (({overlfow.rb})) ruby program:

  200.times do |i|
    eval <<-RUBY_EVAL, nil, __FILE__, __LINE__ + 1
      def foo_#{i}(&block)
        foo_#{i+1}(&block)
      end
    RUBY_EVAL
  
    def foo_200
      yield
    end
  end
  
  def bar
    foo_0 { bar }
  end
  
  bar

When run on ruby 2.0, this is the output:

  vit@localhost ~> ruby -v overflow.rb
  ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin12.2.0]
  overflow.rb:4: stack level too deep (SystemStackError)

As can be seen, only a single line of backtrace data is provided, thus the only thing that is known - is the stack was blown while executing a (({foo_x})) method, but none of the (({foo_x})) methods are recursive (the real culprit is the (({bar})) method). Debugging an error like that is nigh impossible on Ruby 2.0.

Contrast this with other VMs:

rbx:

  vit@localhost ~> ruby -v overflow.rb
  rubinius 2.0.0.rc1 (1.9.3 release yyyy-mm-dd JI) [x86_64-apple-darwin12.2.0]
  An exception occurred running overflow.rb
      SystemStackError (SystemStackError)
  
  Backtrace:
                      Object#foo_141 at overflow.rb:7
                      Object#foo_140 at overflow.rb:8
                      Object#foo_139 at overflow.rb:8
                            [ snip ... ]
                      Object#foo_1 at overflow.rb:8
                      Object#foo_0 at overflow.rb:8
                        Object#bar at overflow.rb:14
                 Object#__script__ at overflow.rb:17
  Rubinius::CodeLoader#load_script at kernel/delta/codeloader.rb:68
  Rubinius::CodeLoader.load_script at kernel/delta/codeloader.rb:119
           Rubinius::Loader#script at kernel/loader.rb:620
             Rubinius::Loader#main at kernel/loader.rb:821

MRI 1.8:

  vit@localhost ~> ruby -v overflow.rb
  ruby 1.8.7 (2012-02-08 MBARI 8/0x6770 on patchlevel 358) [i686-darwin12.2.0], MBARI 0x6770, Ruby Enterprise Edition 2012.02
  overflow.rb:4:in `foo_44': stack level too deep (SystemStackError)
  	from overflow.rb:4:in `foo_43'
  	from overflow.rb:4:in `foo_42'
  	from overflow.rb:4:in `foo_41'
  	from overflow.rb:4:in `foo_40'
  	from overflow.rb:4:in `foo_39'
  	from overflow.rb:4:in `foo_38'
  	from overflow.rb:4:in `foo_37'
  	from overflow.rb:4:in `foo_36'
  	 ... 5312 levels...
  	from overflow.rb:4:in `foo_1'
  	from overflow.rb:4:in `foo_0'
  	from overflow.rb:14:in `bar'
  	from overflow.rb:17
=end
----------------------------------------
Feature #6216: SystemStackError backtraces should not be reduced to one line
https://bugs.ruby-lang.org/issues/6216#change-41339

Author: postmodern (Hal Brodigan)
Status: Assigned
Priority: Normal
Assignee: ko1 (Koichi Sasada)
Category: core
Target version: next minor


When debugging "SystemStackError: stack level too deep" exceptions, it is not helpful that the backtrace is reduced to one single line. Most of the time Ruby incorrectly identifies where cycles begin, resulting in an unrelated "file:line" as the backtrace. A more useful behaviour would be to print the last 30 lines of the backtrace, and have the developer identify which "file:line" is causing the cycle. This is similar to how JRuby handles SystemStackError backtraces.


-- 
http://bugs.ruby-lang.org/