2012-05-03 14 views
8

Ricevo il SystemStackError in un'app Rails 3.Livello di stack troppo profondo nelle callback di supporto attivo

Tutte le informazioni che ho è inutile una riga di uno stacktrace (tratto dal registro):

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

Quindi la domanda è come faccio vedere l'intero stack trace?

NOTA: Non mi preoccupo perché questo accade, tutto quello che voglio è vedere è dove accade.

Utilizzo: Rails 3.2.3, Unicorno.

Grazie.

+0

Trovato [questa pagina] (https://github.com/collectiveidea/delayed_job/issues/349). Non sono sicuro che sia d'aiuto. –

+0

Una società frequentemente presente nella barra laterale di Careers 2.0 [afferma di dare una buona visibilità sui dettagli delle applicazioni in esecuzione] (http://newrelic.com/ruby) - forse hanno strumenti che possono scaricare periodicamente tracce di stack per te e prendere un profondo "in azione" prima che porti ad un errore? – sarnold

+0

@Riateche quel problema si verifica in Rails <3.2.3. Sono al 3.2.3. –

risposta

3

Questo è il codice piuttosto complessa in lib/active_support/callbacks.rb, ma sembra che sta applicando vari callback:: prima ,: after,: around, per essere precisi.

Si potrebbe provare a mettere un "vecchio stile prima di # {nome}" prima della riga 426 e vedere ciò che si ottiene.

Allo stesso modo, è possibile che l'intera traccia dello stack si trovi all'interno dello stack di rails e che venga filtrata dal backtrace_filter predefinito. L'impostazione di backtrace_filter potrebbe consentire di vedere lo stack e ottenere un indizio di debug. Vedi config/initializers/backtrace_silencers.rb e non commentato:

Rails.backtrace_cleaner.remove_silencers!

0

Questo è un colpo nel dardo ma mi ha colpito una cosa del genere una volta quando ho avuto i riferimenti circolari in

+1

Sì, è lo sparo al buio. E no, niente a che fare con la convalida. So cosa lo causa. Non mi interessa per * WHY * succede. Voglio sapere * dove * (voglio vedere il callstack). –

5

Se si aggiorna un record attivo nella sua before_save o after_save, si continueranno a loop 's miei validates_associated. ... Inoltre, se avete validati_associato su entrambe le estremità di un'associazione.

Ecco un esempio di come un callback before_save può creare un ciclo:

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

Ciao Andrew, ti dispiacerebbe dare un esempio di come esattamente "puoi aggiornare un record attivo nel suo before_save"? Grazie! – Alexandra

+0

Un po 'difficile in un commento per inserire il codice, qualcosa come questo: class Foo

0

Ho avuto un problema simile. Azioni di controllo che sono stati Skipping prima/dopo i filtri sarebbero eventualmente errore fuori con l'errore

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

migliore che riesco a capire è che il modo Rails aggiunge/rimuove metodi alla pila di callback creerebbe un errore sotto stress pesante.

Queste sono chiamate API, quindi le ho spostate su un controller separato ereditato da ActionController :: Base, eliminando la necessità di saltare i filtri. Questo ha risolto il mio problema. ApplicationController :: Metal può essere una scelta migliore in base alle funzionalità di cui hai bisogno.

So che il richiedente non era interessato al perché, ma immagino che altri Rails Developers potrebbero eseguire lo stesso problema e nessuno dei suggerimenti di registrazione sopra riportati ha restituito una traccia di stack valida per me.

1

Per coloro che sono in grado di eseguire l'aggiornamento a Ruby 2.2, si dovrebbe ottenere una traccia dello stack molto più descrittiva come risultato del lavoro svolto da Nobu su MRI (https://bugs.ruby-lang.org/issues/6216). Passare a JRuby darebbe anche uno stack molto più profondo.

Problemi correlati