¿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?


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.


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


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/...
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.