Mais de 10 linhas em um erro de pilha node.js?

93

Existe uma maneira de obter mais de 10 linhas em um erro de pilha 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);
}

mostra:

$ 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 uma maneira de receber mais de 10 chamadas?

Julien Genestoux
fonte
Melhor depuração é uma prioridade para as versões futuras do
Node.JS
Devo deduzir do seu comentário que isso ainda não pode ser feito?
Julien Genestoux,
Não. Mas uma depuração melhor está na lista para .6 :)
BRampersad

Respostas:

138

A solução mais fácil para isso é iniciar seu código com o seguinte:

Error.stackTraceLimit = Infinity;

Se você gostaria de ver o rastreamento de pilha que se estende por chamadas setTimeout / setInterval, então https://github.com/mattinsler/longjohn seria o caminho a percorrer.

Mariusz Nowak
fonte
2
Error.stackTraceLimit não fez isso por mim quando tentei pela última vez.
BT
Observe que alguns pacotes podem mudar stackTraceLimit . Além disso, afeta apenas o que você obtém Error.stackpelo que posso ver. O depurador integrado sempre exibe a pilha completa ( btcomando).
x-yuri
E, aparentemente, o rastreamento de pilha não segue operações assíncronas. Em outras palavras, em um retorno de chamada de uma chamada assíncrona, sua pilha começa do zero (está basicamente vazia).
x-yuri
@ x-yuri A equipe Node.js está trabalhando nisso ( github.com/nodejs/node/issues/11865 ) Caso contrário, a pilha completa será visível no depurador do Chrome quando você executar a aplicação Node com --inspectou --inpect-brkcomando
Mariusz Nowak
Meu Deus, isso estava me deixando louco. Obrigado por esta informação!
Kris Oye
65

Você pode passar o limite de rastreamento de pilha como um parâmetro de linha de comando para node:

node --stack-trace-limit=1000 debug.js // padrão 10

BTW, outra coisa que parece improvável de acontecer, mas apenas desperdicei algumas horas do meu tempo para depuração, é o tamanho da pilha (que o padrão é 492 kB) . Você pode ter erros muito pouco informativos se a pilha se esgotar ( RangeErrorsem qualquer informação adicional). Você pode aumentar o tamanho da pilha com :

node --stack-size=1024 debug.js // padrão 492

No mundo das cadeias de callback-to-callback-to-callback, é na verdade muito fácil exceder o tamanho da pilha para grandes tamanhos de entrada, se o programa não for escrito com isso em mente.

Para ver todas as opções relacionadas à pilha:

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

jakub.g
fonte
3
--stack-trace-limit ainda funcionando a partir de 0.10.22, obrigado!
Riplexus
3
A partir do Node.js v8.0.0, você também pode definir isso na NODE_OPTIONSvariável de ambiente, por exemplo NODE_OPTIONS='--stack-trace-limit=10000' /path/to/some-script. Útil se você não estiver invocando nodediretamente.
Bluu
-1

Além disso, você pode usar o depurador integrado , que abre o conhecido depurador de ferramentas de desenvolvimento do Google Chrome. Ele pára em qualquer erro e você pode navegar por toda a pilha. Apenas corra:

$ 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
fonte