0

我有一个使用来自 github vhochstein/master 的活动脚手架的 3.0.7 应用程序。我正在使用可用作供应商/插件的 3.x 兼容版本,而不需要安装 gem。

在生产中,它会遇到 ActionView::Template::Error(堆栈级别太深):。

beaumont@edouard:~/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 中,但它也发生在脚本/rails 服务器运行登录到服务器时。(这是我的beta测试机)

它总是在 Rendered vendor/plugins/active_scaffold/frontends/default/views/_list_pagination.html.erb(144.3ms 157) 中消失。我破解了 ActionView 来记录 Kernel.caller.count 以便我可以看到堆栈是否在增长,但我没有看到这一点。我确实看到堆栈深度高达 180。如果我 ulimit -s 在启动 rails 之前堆栈更大,这似乎并不重要,但也许有些东西会再次 ulimit 堆栈。

在_list_pagination.html.erb 中,它调用list_pagination_links。如果我注释掉那个调用,那么事情就不会失败。我试着让 list_pagination_links 什么都不做(里面没有代码!),但它仍然在那个渲染调用中死掉了。我想知道堆栈是否在渲染代码本身中是递归的,或者只是太大了。

这不会发生在我的笔记本电脑(debian sequeeze,32 位)的开发模式下,但会发生在我的测试版生产机器(XEN VM,32 位,debian 挤压)上。它有时确实发生在我的笔记本电脑上,但不是以可重复的方式发生,重新启动 rails “解决”了这些问题。我还没有在我的笔记本电脑上尝试过生产模式,我也怀疑它可能与数据有关!

4

2 回答 2

1

在处理完全相同的问题时,我发现对这些情况有用的绝望调试方法是内核的 set_trace_func 方法。

它基本上设置了在每个解释器“动作”之后调用的方法。如果你用它来打印一些信息,那么它会变得非常冗长,你的程序变得非常缓慢,但你可以确切地看到发生了什么。如果它真的是无限递归,那么你会在一秒钟内看到行为不端的函数的名称填满你的屏幕。

在您的情况下使用的一个示例是:

 <% 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%>

链接到 set_trace_func 文档

ps:我知道这不是真正意义上的答案,但是作为评论发布太长了

于 2012-03-24T12:46:03.913 回答
0

当我在 Active Scaffold 中调试无限分页问题时,我补充说:

require 'active_scaffold/extensions/paginator_extensions'

到我的代码。这条线似乎是原因。我不知道为什么。

git bisect 和逐行删除代码发现了这一点。

于 2012-03-24T16:35:13.520 回答