在编写ruby时,我常常很难调试无限递归.有没有办法从SystemStackError中得到回溯,以找出无限循环到底发生在哪里?

实例

给定一些在循环中相互调用的方法foobarbaz:

def foo
  bar
end

def bar
  baz
end

def baz
  foo
end

foo

当我运行这段代码时,我只得到消息test.rb:6: stack level too deep (SystemStackError).至少得到堆栈的最后test.rb:6: stack level too deep (SystemStackError)行是有用的,所以我可以立即看到这是一个介于foobarbaz之间的循环,如下所示:

test.rb:6: stack level too deep (SystemStackError)
  test.rb:2:in `foo'
  test.rb:10:in `baz'
  test.rb:6:in `bar'
  test.rb:2:in `foo'
  test.rb:10:in `baz'
  test.rb:6:in `bar'
  test.rb:2:in `foo'
  [...]

有没有办法做到这一点?

EDIT:

从下面的答案可以看出,鲁宾尼乌斯可以做到.不幸的是,大约有rubinius bugs人阻止我将其与我想要调试的软件一起使用.确切地说,问题是:

How do I get a backtrace with MRI (the default ruby) 1.9?

推荐答案

显然,这被追踪为feature 6216,并在Ruby 2.2中修复.

$ ruby system-stack-error.rb
system-stack-error.rb:6:in `bar': stack level too deep (SystemStackError)
        from system-stack-error.rb:2:in `foo'
        from system-stack-error.rb:10:in `baz'
        from system-stack-error.rb:6:in `bar'
        from system-stack-error.rb:2:in `foo'
        from system-stack-error.rb:10:in `baz'
        from system-stack-error.rb:6:in `bar'
        from system-stack-error.rb:2:in `foo'
        from system-stack-error.rb:10:in `baz'
         ... 10067 levels...
        from system-stack-error.rb:10:in `baz'
        from system-stack-error.rb:6:in `bar'
        from system-stack-error.rb:2:in `foo'
        from system-stack-error.rb:13:in `<main>'

Ruby相关问答推荐

R10K模块在try 安装gem r10k时获得错误的Ruby版本

Sinatra 与 EventMachine WebSockets 一起工作是否成功?

Rspec:应该是(this or that)

在一组字符串中找到最长的公共起始子字符串

使用 Bundler 时,为什么要关心 RVM 的 Gemset 功能?

Ruby 在与源相同的目录中加载配置(yaml)文件

如何找到安装 Ruby Gem 的路径(即 Gem.lib_path c.f. Gem.bin_path)

删除 Ruby 数组中的 nil 和空白字符串

Ruby 模块 - 包括 do 结束块

YAML 每个缩进多少个空格?

动态设置 Ruby 对象的属性

无法在 Windows 上安装 Aptana Studio 3.6

Ruby,生成随机十六进制 colored颜色

Ruby - time.now UTC

在类方法中使用实例变量 - Ruby

使用正则表达式进行 Ruby Electron邮件验证

Ruby - 用另一个字符串替换第一次出现的子字符串

如何在 Ruby 中创建整数循环?

如何在 Ruby 循环的第一次迭代中采取不同的行动?

如何在 Mac OS Sierra 10.12 上安装 Nokogiri