在我的脚本中,似乎总是会出现这样的错误:
/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上,如果这重要的话。不幸的是,做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的解决方案可以很好地防止ruby prof崩溃,但是分析器似乎也有自己的问题,因为我看到大约679.50%的时间用于一个过程.
发布于 2012-07-31 23:23:51
解决办法之一是启动尾呼叫优化。
下面是一个示例,它与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)发布于 2012-07-27 17:57:39
堆栈级别太深通常意味着无限循环。如果您查看发生错误的ruby-prof代码,您将看到它是一种检测调用堆栈中递归的方法。
尝试查看您正在使用递归的代码(您的代码中有多少地方可以使用递归?)看看是否有什么条件会让它永远不会跌到谷底?
这也可能意味着您的系统堆栈不够大,无法处理您想要做的事情。也许您正在递归地处理一个大型数据集?您可以检查堆栈大小(unixy系统):
$ ulimit -a
和增加堆栈大小
$ ulimit -s 16384
您还可以考虑调整算法。参见此堆栈溢出队列。
我希望我不是在重提一个现存的问题.
发布于 2013-02-11 21:40:22
在Ruby中,百分比超过100%的是已知的臭虫,但现在应该修复。
https://stackoverflow.com/questions/11692559
复制相似问题