2012-03-24 52 views
0

我有一個3.0.7應用程序使用主動腳手架從github vhochstein/master。我正在使用可用作供應商/插件的3.x兼容版本,而不需要進行寶石安裝。ActiveScaffold給堆疊太深的錯誤;找不到任何遞歸

在生產中它擊中了ActionView :: Template :: Error(堆棧級別太深):.

[email protected]:~/beaumont/current$ script/rails server -p 4000 
ActionView::Template::Error (stack level too deep): 
    8: depth = Kernel.caller.count 
    9: logger.info "pagination: #{@page} #{depth}" 
    10: %> 
    11:  <%= render :partial => 'list_pagination_links', :locals => { :current_page => @page } if @page.pager.infinite? || @page.pager.number_of_pages > 1 %> 
    12: </div> 
    13: <br clear="both" /><%# a hack for the Rico Corner problem %> 
    14: </div> 

我開始在我的代碼中尋找一些遞歸,然後在我的數據模型中循環使用了AS。它首先發生在mod_passenger上,但它也發生在運行登錄到服務器的script/rails服務器上。 (這是我的beta測試機器)

它總是死在呈現供應商/插件/ active_scaffold /前端/默認/ views/_list_pagination.html.erb(144.3ms 157)。 我篡改了ActionView來記錄Kernel.caller.count,這樣我就可以看到一個堆棧正在增長和增長,但我沒有看到這個。我確實看到堆棧深度高達180. 在啓動rails之前,如果ulimit -s的堆棧更大,似乎並不重要,但也許有些東西會將堆棧再次限制回來。

在_list_pagination.html.erb中,它調用list_pagination_links。如果我評論這些電話,那麼事情就不會失敗。我試着讓list_pagination_links什麼都不做(沒有編碼!),但它仍然在那個渲染調用中死亡。我想知道是否在渲染代碼本身中,堆棧要麼遞歸,要麼只是太大。

這在我的筆記本電腦(debian sequeeze,32-bit)上沒有發生在開發模式中,但在我的測試版生產機器上發生(XEN VM,32位debian squeeze)。它確實發生在我的筆記本電腦上,但不是以可重複的方式發生,並且重新啓動軌道「解決」了問題。 我還沒有試過我的筆記本電腦上的生產模式,我也懷疑它可能是數據依賴!

回答

1

對於我在處理完全相同的問題時發現的這些情況有用的絕望調試方法是內核的set_trace_func方法。

它基本上設置了每個解釋器「動作」後調用的方法。如果tou使用它來打印一些信息,那麼它可能會變得非常冗長,你的程序變得煩人地很慢,但你可以看到究竟發生了什麼。如果它實際上是一個無限遞歸,那麼你會在一秒鐘內看到錯誤操作的函數的名字。

在你的情況下使用的一個例子是:

<% set_trace_func proc { |event, file, line, id, binding, classname| 
     printf "%8s %s:%-2d %10s %8s\n", event, file, line, id, classname 
     } %> 
<%= render :partial => 'list_pagination_links', :locals => { :current_page => @page } if @page.pager.infinite? || @page.pager.number_of_pages > 1 %> 
<% set_trace_func nil # disables tracing%> 

Link to the set_trace_func doc

PS:我知道,這不是真正意義上的答案,但它是太長崗位作爲評論

0

當我調試在活動腳手架無限尋呼問題,我補充說:

require 'active_scaffold/extensions/paginator_extensions' 

我的代碼。這條線似乎是原因。我不知道爲什麼。

git bisect並逐行刪除代碼找到了這個。