¿Más de 10 líneas en un error de pila de node.js?

93

¿Hay alguna manera de obtener más de 10 líneas en un error de pila de node.js?

function a() { dieInHell(); }
function b() { a(); }
function c() { b(); }
function d() { c(); }
function e() { d(); }
function f() { e(); }
function g() { f(); }
function h() { g(); }
function i() { h(); }
function j() { i(); }
function k() { j(); }
function l() { k(); }
function m() { l(); }
function n() { m(); }
function o() { n(); }
function p() { o(); }
function q() { p(); }

try {
    q();
}
catch(e) {
    console.log(e.stack);
}

muestra:

$ node debug.js 
ReferenceError: dieInHell is not defined
    at a (/Users/julien/tmp/debug.js:2:5)
    at b (/Users/julien/tmp/debug.js:6:5)
    at c (/Users/julien/tmp/debug.js:10:5)
    at d (/Users/julien/tmp/debug.js:14:5)
    at e (/Users/julien/tmp/debug.js:18:5)
    at f (/Users/julien/tmp/debug.js:22:5)
    at g (/Users/julien/tmp/debug.js:26:5)
    at h (/Users/julien/tmp/debug.js:30:5)
    at i (/Users/julien/tmp/debug.js:34:5)
    at j (/Users/julien/tmp/debug.js:38:5)

¿Existe alguna forma de recibir más de 10 llamadas?

Julien Genestoux
fuente
Una mejor depuración es una prioridad para las futuras versiones de Node.JS
BRampersad
¿Debo deducir de su comentario que esto todavía no se puede hacer?
Julien Genestoux
No Pero una mejor depuración está en la lista para .6 :)
BRampersad

Respuestas:

138

La solución más fácil para eso es iniciar su código con lo siguiente:

Error.stackTraceLimit = Infinity;

Si desea ver el seguimiento de la pila que abarca las llamadas setTimeout / setInterval, entonces https://github.com/mattinsler/longjohn más sofisticado sería el camino a seguir.

Mariusz Nowak
fuente
2
Error.stackTraceLimit no lo hizo por mí cuando lo intenté por última vez.
BT
Tenga en cuenta que algunos paquetes pueden cambiar stackTraceLimit . Además, afecta solo lo que entras Error.stackpor lo que puedo ver. El depurador incorporado siempre muestra la pila completa ( btcomando).
x-yuri
Y aparentemente, el seguimiento de la pila no sigue las operaciones asíncronas. En otras palabras, en una devolución de llamada de una llamada asincrónica, su pila comienza desde cero (básicamente está vacía).
x-yuri
@ x-yuri El equipo de Node.js está trabajando en eso ( github.com/nodejs/node/issues/11865 ) De lo contrario, la pila completa es visible en el depurador de Chrome cuando ejecuta la aplicación Node con el comando --inspecto--inpect-brk
Mariusz Nowak
Dios mío, esto me estaba volviendo loco. ¡Gracias por esta información!
Kris Oye
65

Puede pasar el límite de seguimiento de la pila como un parámetro de línea de comando a node:

node --stack-trace-limit=1000 debug.js // predeterminado 10

Por cierto, otra cosa que parece poco probable que suceda, pero que solo desperdicié algunas horas de mi tiempo para depurar, es el tamaño de la pila (que por defecto es 492 kB) . Puede tener errores muy poco informativos si la pila está agotada ( RangeErrorsin información adicional). Puede aumentar el tamaño de la pila con :

node --stack-size=1024 debug.js // predeterminado 492

En el mundo de los encadenamientos de devolución de llamada a devolución de llamada a devolución de llamada, de hecho es muy fácil exceder el tamaño de la pila para tamaños de entrada grandes, si el programa no está escrito en esto en mente.

Para ver todas las opciones relacionadas con la pila:

node --v8-options | grep -B0 -A1 stack

jakub.g
fuente
3
--stack-trace-limit sigue funcionando a partir de 0.10.22, ¡gracias!
Riplexus
3
A partir de Node.js v8.0.0, también puede configurar esto en la NODE_OPTIONSvariable de entorno, por ejemplo NODE_OPTIONS='--stack-trace-limit=10000' /path/to/some-script. Útil si no está invocando nodedirectamente.
Bluu
-1

También puede usar el depurador incorporado , que abre el conocido depurador de herramientas de desarrollo de Google Chrome. Se detiene ante cualquier error y puede navegar por toda la pila. Solo corre:

$ node --inspect debug.js

Debugger listening on port 9229.
To start debugging, open the following URL in Chrome: chrome-devtools://devtools/remote/serve_file/...
zbycz
fuente