2012-05-03 16 views
8

Obtengo el SystemStackError en una aplicación de Rails 3.Nivel de pila demasiado profundo en callbacks de soporte de actives

Toda la información que tengo es inútil una línea de un StackTrace (tomado del registro):

SystemStackError (stack level too deep): 
    activesupport (3.2.3) lib/active_support/callbacks.rb:409 

Así que la pregunta es ¿cómo puedo ver la traza completa?

NOTA: No me importa sobre qué esto sucede, todo lo que quiero es ver es donde de que suceda.

Uso: Rails 3.2.3, Unicorn.

Gracias.

+0

Encontrado [esta página] (https://github.com/collectiveidea/delayed_job/issues/349). No estoy seguro de si ayuda. –

+0

Una compañía que aparece con frecuencia en la barra lateral de Careers 2.0 [afirma dar una buena visibilidad de los detalles de las aplicaciones que se están ejecutando] (http://newrelic.com/ruby) - quizás tengan herramientas que puedan descargar periódicamente rastros de pila y atrapar uno profundo "en acción" antes de que conduzca a un error? – sarnold

+0

@Riateche ese problema ocurre en Rails <3.2.3. Estoy en 3.2.3. –

Respuesta

3

Eso es bastante complejo código en lib/active_support/callbacks.rb, pero parece que se está aplicando diversas devoluciones de llamada:: antes ,: después,: alrededor, para ser precisos.

Puede tratar de colocar un antiguo "puts before # {name}" antes de la línea 426 y ver lo que obtienes.

Igualmente, podría ser que todo el seguimiento de la pila se encuentre dentro de la pila de rieles, y está siendo filtrado por el filtro de rastreo predeterminado. Configurar ese backtrace_filter podría permitirle ver la pila y obtener una pista de depuración. Ver config/initializers/backtrace_silencers.rb y descomentar:

Rails.backtrace_cleaner.remove_silencers!

0

Esto es un tiro en el dardo pero golpear algo como esto una vez cuando yo tenía referencias circulares en mis validates_associated 's

+1

Sí, es el tiro en la oscuridad. Y no, nada que ver con la validación. Sé lo que lo causa. No me importa * POR QUÉ * sucede. Quiero saber * donde * (así que quiero ver la pila de llamadas). –

5

Si actualiza un registro activo en su before_save o after_save, que se mantendrá en el bucle. ... Además, si tiene validates_associated en ambos extremos de una asociación.

Aquí es un ejemplo de cómo una devolución de llamada before_save puede crear un bucle:

class Foo < ActiveRecord::Base 
    def before_save 
    self.update_attribute(:bar, 'badidea') 
    end 
end 
+0

Hola Andrew, ¿te importaría dar un ejemplo de cómo exactamente puedes "actualizar un registro activo en su before_save"? ¡Gracias! – Alexandra

+0

Un poco difícil en un comentario para poner en el código, algo como esto: clase Foo

0

Tuve un problema similar. Acciones controladoras que saltarse antes/después de filtros acabarían error con el error

SystemStackError (stack level too deep): 
    activesupport (3.2.13) lib/active_support/callbacks.rb:409 

mejor que se me ocurre es que la forma rieles agrega/quita métodos de devolución de llamada a la pila crearía un error bajo cargas pesadas.

Estas son llamadas API, por lo que las moví a un controlador separado que heredó de ActionController :: Base, eliminando la necesidad de omitir filtros. Esto resolvió mi problema. ApplicationController :: Metal puede ser una mejor opción dependiendo de las características que necesita.

Sé que el asker no estaba preocupado por el motivo, pero creo que otros desarrolladores de Rails podrían encontrarse con el mismo problema, y ​​ninguna de las sugerencias anteriores de registro me devolvió un seguimiento de pila válido.

1

Para aquellos que pueden actualizar a Ruby 2.2, debería obtener un seguimiento de pila mucho más descriptivo como resultado del trabajo realizado por Nobu en MRI (https://bugs.ruby-lang.org/issues/6216). Cambiar a JRuby también daría una pila mucho más profunda.

Cuestiones relacionadas