Depuración " Se supera el tamaño máximo de la pila de llamadas"


Tengo un servidor que puedo hacer morir con la siguiente salida:

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

Sin embargo, sin un volcado de pila o traza, no tengo forma de encontrar si esto es recursión infinita o simplemente una cadena un poco demasiado grande, y mucho menos dónde está la función problema.

Ejecutar el nodo con la opción --trace hizo que mis pruebas no solo se ejecutaran lentamente (como era de esperar), sino que no reprodujeran el problema.

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

Author: OrangeDog, 2011-10-05

3 answers

Parece que la respuesta es actualmente: esperar a Node.js para actualizar a una versión V8 más reciente, o construir la suya propia con el parche de este informe de error del proyecto Chromium.

Este hilo archivado de la lista de correo v8-dev muestra una discusión en la que

  • Dave Smith trae este mismo tema y propone un parche
  • Yang Guo del proyecto Chromium lo discute, presenta un error de Chromium contra el problema y aplica un fix
  • Dave señala que Node (0.8 en ese momento) está usando V8 3.11 y pregunta sobre la retroimportación del parche. Yang respuestas que el parche probablemente de la tierra en V8 3.15 y no será implementada.

Observe ese nodo.js v0.8 utilizó V8 3.11; Nodo.js 0.10 está utilizando actualmente V8 3.14. Por lo tanto, el parche aceptado por Chromium para este problema sigue siendo "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 aprendí todo esto.)

 9
Author: metamatt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-27 16:48:38

La posibilidad de que sea una "cadena ligeramente demasiado grande" parece poco probable.

Probablemente es una función que llama al evento que se activó a sí misma.

Así que si la ralentización del código está haciendo que la recursión infinita se detenga. Mi conjetura sería que usted tiene una cola y con el modo más lento no está consiguiendo se llenó tan rápido.

Si esto no ayuda, entonces creo que necesito más información. Tal vez alguien tiene una trampa para esto.

 4
Author: megakorre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-11 04:51:04

Este parche puede ayudarle a encontrar una solución. Expande la traza de la pila tremendamente:

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

 2
Author: Coderoshi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-02 20:59:59