Ruby探查器堆栈级别太深错误



我的一个脚本上似乎总是出现这个错误:

/Users/amosng/.rvm/gems/ruby-1.9.3-p194/gems/ruby-prof-0.11.2/lib/ruby-prof/profile.rb:25: stack level too deep (SystemStackError)

以前有人遇到过这个错误吗?是什么导致了这种情况,我能做些什么来防止这种情况发生?

我使用命令运行我的ruby prof脚本

ruby-prof --printer=graph --file=profile.txt scraper.rb -- "fall 2012"

编辑如果重要的话,我在Mac OS X上。不幸的是,执行ulimit -s 64000似乎没有多大帮助。以下是ulimit -a给出的内容:

$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 256
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 64000
cpu time               (seconds, -t) unlimited
max user processes              (-u) 709
virtual memory          (kbytes, -v) unlimited

编辑2

Andrew Grimm的解决方案可以很好地防止ruby prof崩溃,但探查器似乎也有自己的问题,因为我看到一个进程所用总时间的百分比为679.50%。。。

一个解决方法是打开尾调用优化。

以下是一个在TCO打开时工作,但在TCO关闭时不工作的示例。

RubyVM::InstructionSequence.compile_option = {
  :tailcall_optimization => true,
  :trace_instruction => false
}
def countUpTo(current, final)
  puts current
  return nil if current == final
  countUpTo(current+1, final)
end
countUpTo(1, 10_000)

堆栈级别太深通常意味着一个无限循环。如果您查看发生错误的ruby-prof代码,您会发现它是一个在调用堆栈中检测递归的方法。

试着看看你使用递归的代码(你的代码中有多少地方可以使用递归?),看看是否有一个条件会导致它永远不会见底?

这也可能意味着你的系统堆栈不够大,无法处理你要做的事情。也许你正在递归地处理一个大数据集?您可以检查您的堆栈大小(unixy系统):

$ ulimit -a

并增加堆栈大小:

$ ulimit -s 16384

你也可以考虑调整你的算法。查看此堆栈溢出问题

我希望我不是在重新思考一个现有的问题。。。

在Ruby-prof中百分比超过100%是一个已知的错误,但现在应该修复。

相关内容

  • 没有找到相关文章

最新更新