我的一个脚本上似乎总是出现这个错误:
/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%是一个已知的错误,但现在应该修复。