2012-10-30 68 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

非常感謝解釋,我認爲初始化變量在執行過程中被存儲在別的地方。你是對的(在這之前你還有其他人),我可能在覈心類重定義方面做了太多的調整,因此我找不到錯誤的根源。問題解決了(現在) –

相關問題