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?


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.


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


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/...
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.