2011-10-05 5 views
23

Ho un server che posso causare a morire con il seguente risultato:Debugging "Dimensione massima stack di chiamate superato"

events.js:38 
EventEmitter.prototype.emit = function(type) { 
           ^
RangeError: Maximum call stack size exceeded 

Tuttavia, senza un dump dello stack o traccia, non ho modo di trovare se questo è una ricorsione infinita o solo una catena leggermente troppo grande, figuriamoci dove si trova la funzione del problema.

L'esecuzione del nodo con l'opzione --trace ha comportato che i miei test non solo funzionino lentamente (come ci si aspetterebbe), ma che non riproducano il problema.

Qualcuno ha soluzioni o suggerimenti per arrivare a fondo di questo?

+0

Questo particolare problema è stato risolto confrontando diff prima e dopo questo è stato conosciuto per accadere, attaccando logging extra da ogni chiamata new/changed 'emit' e scoperta dell'errore di scoping che porta alla ricorsione congiunta su un evento' 'drain'' - da qui la sensibilità alla velocità. Assegnerò ancora una risposta accettata alla migliore strategia generale che avrebbe risolto anche questo. – OrangeDog

risposta

9

sembra che la risposta è attualmente: tenere duro e aspettare Node.js per l'aggiornamento a una versione più recente di V8, o costruire il proprio con the patch from this Chromium project bug report.

This archived thread from the v8-dev mailing list mostra una discussione nella quale

  • Dave Smith porta in primo piano questo tema e propone una patch
  • Yang Guo del progetto Chromium discute, i file di un bug di cromo nei confronti del problema, e si applica un correzione differente
  • Dave nota che il nodo (0.8 alla volta) utilizza V8 3.11 e chiede di eseguire il backport della patch. Yang risponde che la patch probabilmente finirà in V8 3.15 e non sarà backportata.

Si noti che Node.js v0.8 utilizzato V8 3.11; Node.js 0.10 sta attualmente utilizzando V8 3.14. Quindi la patch accettata da Chromium per questo problema è ancora "in futuro" per quanto riguarda Node.

(Questa risposta deve grazie alla @Coderoshi, dal momento che è seguendo il filo dalla sua risposta che ho imparato tutto questo.)

+0

Qualche notizia a riguardo? Ho lo stesso problema che devo eseguire il debug di un "RangeError: Maximum stack stack size exceeded". Il problema è che si verifica in un'applicazione web invariata da alcuni giorni e non so come cercare, quindi uno stacktrace sarebbe di grande aiuto. –

+0

Il nodo 0.11 sta usando una versione abbastanza nuova di V8 per mostrare tracce di stack in questa situazione. Se riesci a eseguire la tua webapp sotto il nodo 0.11, provalo. – metamatt

+1

Ho appena provato la v.0.11.6, anche se ero in grado di eseguire la webapp, le tracce dello stack non funzionavano. In ogni caso ho risolto il problema, ma ho pensato che questo commento potesse essere utile per le persone con bug simili alla ricerca di una traccia dello stack. Forse risparmia tempo a qualcuno, non per compilare la versione instabile ;-). –

4

La possibilità che si tratti di una "catena leggermente troppo grande" sembra improbabile.

Probabilmente è una funzione che chiama l'evento che si è attivato.

Quindi, se il rallentamento del codice sta facendo fermare la ricorsione infinita. La mia ipotesi sarebbe che si ha una coda e con la modalità più lenta non si ottiene riempito più velocemente.

Se questo non aiuta, penso di aver bisogno di maggiori informazioni. Forse qualcuno ha un ricettacolo per questo però.

2

Questa patch potrebbe aiutarti a trovare una soluzione. Si espande l'analisi dello stack tremendamente:

https://github.com/dizzyd/node/commit/40434019540ffc17e984ff0653500a3c5db87deb

+0

Questo sembra l'approccio giusto. Non descriverò questa patch come "espande tremendamente la traccia dello stack"; Lo descriverò come "cerca molto più difficile costruire una traccia stack per le eccezioni di overflow dello stack".A proposito, il codice modificato da questa patch contiene un riferimento a TODO (1240995); qualcuno sa a quale database di bug si riferisce? – metamatt

+0

Non ho trovato alcun errore 1240995 ma ho trovato quello che è diventato della patch di dizzyd; vedi http://stackoverflow.com/a/15664576/275581. – metamatt