2010-08-11 42 views
1

我已經運行到堆棧層次過深(SystemStackError)錯誤Ruby程序,在DataMapper的結局:調試堆棧深度過深,在Ruby中

from /usr/local/lib/ruby/gems/1.8/gems/dm-core-1.0.0/lib/dm-core/collection.rb:510:in `each' 
from /usr/local/lib/ruby/gems/1.8/gems/dm-core-1.0.0/lib/dm-core/query/conditions/comparison.rb:616:in `map' 
from /usr/local/lib/ruby/gems/1.8/gems/dm-core-1.0.0/lib/dm-core/query/conditions/comparison.rb:616:in `expected' 
from /usr/local/lib/ruby/gems/1.8/gems/dm-core-1.0.0/lib/dm-core/query/conditions/comparison.rb:461:in `matches?' 
from /usr/local/lib/ruby/gems/1.8/gems/dm-core-1.0.0/lib/dm-core/query/conditions/operation.rb:498:in `matches?' 
from /usr/local/lib/ruby/gems/1.8/gems/extlib-0.9.15/lib/extlib/inflection.rb:103:in `any?' 
from /usr/local/lib/ruby/gems/1.8/gems/dm-core-1.0.0/lib/dm-core/query/conditions/operation.rb:159:in `each' 
from /usr/local/lib/ruby/1.8/set.rb:195:in `each' 
... 5188 levels... 

有沒有辦法來調試嗎?就像查看隱藏的5188級別? Ruby的調試無法幫助我,並內建紅寶石探查與死「[致命]無法分配內存」

+2

如果你有5188個關卡,你可能會有某種無限遞歸。也稱爲堆棧溢出! – 2010-08-11 23:09:44

回答

5

的問題,除了尋找沒有註釋分析器,它可以處理棧溢出,被濫用的DataMapper lazyness

應用程序在另一個查詢(which is lazy as well)中查詢(也是懶惰)內部獲取文本屬性(which is lazy)。即使所有這些懶惰通常會將N + 1查詢轉換爲O(k)查詢(實際上通常意味着4個查詢),但事實證明這會導致堆棧溢出。

執行溢出測試作爲一個簡單的ruby腳本,在rake,rspec和netbeans環境之外,讓我更清楚地看到罪魁禍首。

仍然希望紅寶石輪廓儀可以幫助我。

+1

謝謝,至少我明白髮生了什麼事!想不到一個星期!非常感謝,謝謝。 – YogiZoli 2011-08-05 23:48:58