2011-10-05 24 views
23

Tengo un servidor que pueda causar a morir con el siguiente resultado:depuración "El tamaño máximo de pila de llamadas superado"

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

Sin embargo, sin un volcado de pila o huella, no tengo manera de encontrar si este es una recursión infinita o simplemente una cadena demasiado grande, y mucho menos donde está la función problema.

La ejecución del nodo con la opción --trace hizo que mis pruebas no solo se ejecuten lentamente (como era de esperar), sino que no reproduzca el problema.

¿Alguien tiene alguna solución o consejo para llegar al fondo de esto?

+0

Este tema en particular se resolvió mediante la comparación de las diferenciaciones antes y después de esto fue notorio a suceder, se pega registro extra por cada llamada 'emit' nueva/cambiada y descubriendo el error de scoping que lleva a la recursión conjunta en un evento' 'drain'' - de ahí la sensibilidad a la velocidad. Aún otorgaré la respuesta aceptada a la mejor estrategia general que también lo habría resuelto. – OrangeDog

Respuesta

9

Parece que la respuesta es actualmente: estar tranquilos y esperar a que Node.js para actualizar a una versión más reciente V8, o construir su propia con the patch from this Chromium project bug report.

This archived thread from the v8-dev mailing list muestra una discusión en la que

  • de Dave Smith nos lleva a esta misma cuestión y propone un parche
  • Yang Guo del proyecto Chromium lo discute, los archivos de un error de cromo contra el problema, y ​​se aplica una solución diferente
  • Dave nota que el nodo (0,8 en ese momento) está utilizando V8 3.11 y le pregunta sobre el backporting del parche. Yang responde que el parche probablemente aterrizará en V8 3.15 y no será retroportado.

Tenga en cuenta que Node.js v0.8 utilizó V8 3.11; Node.js 0.10 está usando actualmente V8 3.14. Entonces, el parche aceptado por Chromium para este problema todavía está "en el futuro" en lo que respecta a Node.

(Esta respuesta debe gracias a @Coderoshi, ya que es siguiendo el hilo de su respuesta que he aprendido de todo esto.)

+0

¿Alguna noticia sobre esto? Tengo el mismo problema que tengo que depurar un "RangeError: se excedió el tamaño máximo de la pila de llamadas". El problema es que se produce en una aplicación de Internet sin cambios desde hace unos días y no sé cómo buscar, por lo que una stacktrace sería de gran ayuda. –

+0

El nodo 0.11 está utilizando una versión suficientemente nueva de V8 para mostrar los rastros de pila en esta situación. Si puede ejecutar su aplicación web bajo el Nodo 0.11, intente eso. – metamatt

+1

Acabo de probar v.0.11.6, aunque pude ejecutar la aplicación web, los seguimientos de pila no funcionaron. De todos modos, arreglé el error, pero pensé que este comentario podría ser útil para personas con errores similares que buscan un seguimiento de la pila. Tal vez le ahorre tiempo a alguien, no para compilar la versión inestable ;-). –

4

Parece poco probable que sea una "cadena demasiado grande".

Probablemente sea una función que llame al evento que se activó.

Por lo tanto, si la ralentización del código hace que la recursión infinita se detenga. Supongo que tiene una cola y con el modo más lento no obtiene el lleno tan rápido.

Si esto no ayuda, entonces creo que necesito más información. Sin embargo, alguien tiene una razón para esto.

2

Este parche puede ayudarlo a encontrar una solución. Se amplía el seguimiento de la pila tremendamente:

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

+0

Esto parece ser el enfoque correcto. No describiría este parche porque "expande tremendamente el rastro de la pila"; Lo describiría como "intenta mucho más difícil construir un seguimiento de pila para excepciones de desbordamiento de pila".Por cierto, el código modificado por este parche contiene una referencia a TODO (1240995); Alguien sabe a qué base de datos de errores se está refiriendo? – metamatt

+0

No encontré ningún error 1240995 pero encontré qué pasó con el parche de dizzyd; ver http://stackoverflow.com/a/15664576/275581. – metamatt

Cuestiones relacionadas