2012-10-30 37 views
9

编辑:(解决),因为一个无限循环,实际上它可能升至红宝石堆栈层次过深的异常

我被编码并添加我得到这个方法后:

[email protected]_computer:/media/ECC3-C3B0/Prog/mts/src/mts$ rake test --trace 
** Invoke test (first_time) 
** Execute test 
/home/user_name/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36: stack level too deep (SystemStackError) 
rake aborted! 
Command failed with status (1): [/home/user_name/.rvm/rubies/ruby-1.9.3-p19...] 
/home/user_name/.rvm/gems/[email protected]/gems/rake-0.9.2.2/lib/rake/file_utils.rb:53:in `block in create_shell_runner' 
/home/user_name/.rvm/gems/[email protected]/gems/rake-0.9.2.2/lib/rake/file_utils.rb:45:in `call' 
/home/user_name/.rvm/gems/[email protected]/gems/rake-0.9.2.2/lib/rake/file_utils.rb:45:in `sh' 
/home/user_name/.rvm/gems/[email protected]/gems/rake-0.9.2.2/lib/rake/file_utils_ext.rb:39:in `sh' 
/home/user_name/.rvm/gems/[email protected]/gems/rake-0.9.2.2/lib/rake/file_utils.rb:82:in `ruby' 
/home/user_name/.rvm/gems/[email protected]/gems/rake-0.9.2.2/lib/rake/file_utils_ext.rb:39:in `ruby' 
/home/user_name/.rvm/gems/[email protected]/gems/rake-0.9.2.2/lib/rake/testtask.rb:99:in `block (2 levels) in define' 
/home/user_name/.rvm/gems/[email protected]/gems/rake-0.9.2.2/lib/rake/file_utils_ext.rb:60:in `verbose' 
/home/user_name/.rvm/gems/[email protected]/gems/rake-0.9.2.2/lib/rake/testtask.rb:98:in `block in define' 
/home/user_name/.rvm/gems/[email protected]/gems/rake-0.9.2.2/lib/rake/task.rb:205:in `call' 
/home/user_name/.rvm/gems/[email protected]/gems/rake-0.9.2.2/lib/rake/task.rb:205:in `block in execute' 
/home/user_name/.rvm/gems/[email protected]/gems/rake-0.9.2.2/lib/rake/task.rb:200:in `each' 
/home/user_name/.rvm/gems/[email protected]/gems/rake-0.9.2.2/lib/rake/task.rb:200:in `execute' 
/home/user_name/.rvm/gems/[email protected]/gems/rake-0.9.2.2/lib/rake/task.rb:158:in `block in invoke_with_call_chain' 
/home/user_name/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize' 
/home/user_name/.rvm/gems/[email protected]/gems/rake-0.9.2.2/lib/rake/task.rb:151:in `invoke_with_call_chain' 
/home/user_name/.rvm/gems/[email protected]/gems/rake-0.9.2.2/lib/rake/task.rb:144:in `invoke' 
/home/user_name/.rvm/gems/[email protected]/gems/rake-0.9.2.2/lib/rake/application.rb:116:in `invoke_task' 
/home/user_name/.rvm/gems/[email protected]/gems/rake-0.9.2.2/lib/rake/application.rb:94:in `block (2 levels) in top_level' 
/home/user_name/.rvm/gems/[email protected]/gems/rake-0.9.2.2/lib/rake/application.rb:94:in `each' 
/home/user_name/.rvm/gems/[email protected]/gems/rake-0.9.2.2/lib/rake/application.rb:94:in `block in top_level' 
/home/user_name/.rvm/gems/[email protected]/gems/rake-0.9.2.2/lib/rake/application.rb:133:in `standard_exception_handling' 
/home/user_name/.rvm/gems/[email protected]/gems/rake-0.9.2.2/lib/rake/application.rb:88:in `top_level' 
/home/user_name/.rvm/gems/[email protected]/gems/rake-0.9.2.2/lib/rake/application.rb:66:in `block in run' 
/home/user_name/.rvm/gems/[email protected]/gems/rake-0.9.2.2/lib/rake/application.rb:133:in `standard_exception_handling' 
/home/user_name/.rvm/gems/[email protected]/gems/rake-0.9.2.2/lib/rake/application.rb:63:in `run' 
/home/user_name/.rvm/gems/[email protected]/gems/rake-0.9.2.2/bin/rake:33:in `<top (required)>' 
/home/user_name/.rvm/gems/[email protected]/bin/rake:19:in `load' 
/home/user_name/.rvm/gems/[email protected]/bin/rake:19:in `<main>' 
/home/user_name/.rvm/gems/ruby-1.9.3-p194/bin/ruby_noexec_wrapper:14:in `eval' 
/home/user_name/.rvm/gems/ruby-1.9.3-p194/bin/ruby_noexec_wrapper:14:in `<main>' 
Tasks: TOP => test 

我很确定没有涉及无限递归循环。

该代码现在以某种方式gemified,但我也有错误直接运行ruby文件。

感谢您对如何(获得一些信息,运行一些测试)解决问题,如果可能的话而不必重写整个事情的任何帮助......

环境:

  • 红宝石1.9.3p194 /导轨3.2.8,通过RVM安装
  • 在此阶段程序只使用轨道串拐点功能
  • 操作系统:Linux的kubuntu I386
  • 存储器4GO
  • '的ulimit -s':8192(堆栈大小(KB))

我曾尝试什么:

  • 除去在异常最初提出的代码块,但它仍然上调在运行时稍后一点
  • 用命令行'ulimit -s 20000','ulimit -s unlimited'设置堆栈大小。同样的错误,显然是在同一个地方(这让我想到的堆栈大小实际上并没有改变)
  • 降级到ruby1.9.2/rails3.1.3,得到了相同的消息
  • 同样的错误的Windows

应用程序上下文:

我正在写一个应用程序,大量使用红宝石混搭。

除此之外,我创建了一堆生成mixins(其他类包含的实例/类方法模块)的类。

因此,总而言之,我最终生成了一些具有一些自定义生成代码的生成命名模块,以及具有许多祖先的类。

但是,当我编写位于该lib之上的程序时(这是该计划),最终应该为我节省相当多的痛苦。

资源我用:

编辑:直到一些代码可用于显示/测试,让抽象的,我的问题到这一个:除了传统的程序执行树太深的情况之外,是否还有其他一些提升堆栈级别太深的异常的情况(交叉手指很清楚并且意味着一些东西......)?

+0

非常好的风格和格式。 –

+7

什么是代码?如果你没有代码显示,很难提供帮助。 – vgoff

+1

您可能正在递归调用没有终止条件的相同方法。来自Profiler的报告可能会有所帮助https://github.com/rdp/ruby-prof – Tombart

回答

3

除了传统的程序执行树太深的情况之外,是否还有其他一些会引发堆栈级别太深的异常?

是的。由于堆栈不深入衡量,而是以字节为单位,存储在堆栈上的任何东西,将填补它迟早:

def recurse(depth=0) 
    recurse depth+1 
rescue SystemStackError 
    depth 
end 
=> nil 
recurse 
=> 8717 

def recurse(depth=0) 
    a,b,c = 1,2,3 
    recurse depth+1 
rescue SystemStackError 
    depth 
end 
=> nil 
recurse 
=> 7264 

def recurse(depth=0) 
    a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z = *(0..25) 
    recurse depth+1 
rescue SystemStackError 
    depth 
end 
=> nil 
recurse 
=> 3187 

在这个例子中,只有一个变量的函数可以去几千个电话深失败之前,并且增加三个变量很少;但是增加26个变量会将堆栈大小放大到只有大约3000个级别可用的点。

这当然会取决于ruby的实现以及它运行的系统。但我相信它将始终作为一般规则。

但是,我仍然认为递归很可能是您的问题,因为在小的调用链长度上发生这种情况所需的变量数量是巨大的。

+1

oops。犯了一个错误,导致呼叫链比以前显得更短。纠正。 –

+0

非常感谢解释,我认为初始化变量在执行过程中被存储在别的地方。你是对的(在这之前你还有其他人),我可能在核心类重定义方面做了太多的调整,因此我找不到错误的根源。问题解决了(现在) –

相关问题