Più di 10 righe in un errore di stack node.js?


93

C'è un modo per ottenere più di 10 righe in un errore di stack 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);
}

Spettacoli :

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

C'è un modo per ricevere più di 10 chiamate?


Un miglior debugging è una priorità per le future versioni di Node.JS
BRampersad

Capisco dal tuo commento che non è ancora possibile farlo?
Julien Genestoux

No. Ma un migliore debugging è sulla lista per .6 :)
BRampersad

Risposte:


138

La soluzione più semplice è iniziare il codice con quanto segue:

Error.stackTraceLimit = Infinity;

Se desideri vedere la traccia dello stack che si estende su chiamate setTimeout / setInterval, allora https://github.com/mattinsler/longjohn più sofisticato sarebbe la strada da percorrere.


2
Error.stackTraceLimit non l'ha fatto per me l'ultima volta che ho provato.
BT

Nota che alcuni pacchetti potrebbero cambiare stackTraceLimit . Inoltre, influisce solo su ciò che ottieni Error.stackda ciò che posso vedere. Il debugger integrato mostra sempre lo stack completo ( btcomando).
x-yuri

E a quanto pare, la traccia dello stack non segue le operazioni asincrone. In altre parole, in un callback di una chiamata asincrona il tuo stack inizia da zero (è praticamente vuoto).
x-yuri

@ x-yuri Il team di Node.js ci sta lavorando ( github.com/nodejs/node/issues/11865 ) In caso contrario, lo stack completo è visibile nel debugger di Chrome quando esegui l'applicazione Node con il comando --inspecto--inpect-brk
Mariusz Nowak

Omg questo mi stava facendo impazzire. Grazie per questa informazione!
Kris Oye

65

Puoi passare il limite di traccia dello stack come parametro della riga di comando a node:

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

A proposito, un'altra cosa che sembra improbabile che accada, ma ho appena sprecato alcune ore del mio tempo per il debug, è la dimensione dello stack (che è di default a 492 kB) . Puoi avere errori molto poco informativi se lo stack è esaurito ( RangeErrorsenza alcuna informazione aggiuntiva). Puoi aumentare la dimensione dello stack con :

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

Nel mondo delle concatenazioni callback-to-callback-to-callback, è in effetti molto facile superare la dimensione dello stack per grandi dimensioni di input, se il programma non è scritto in questo modo.

Per vedere tutte le opzioni relative allo stack:

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


3
--stack-trace-limit ancora funzionante a partire da 0.10.22, grazie!
Riplexus

3
A partire da Node.js v8.0.0, puoi anche impostarlo nella NODE_OPTIONSvariabile d'ambiente, ad es NODE_OPTIONS='--stack-trace-limit=10000' /path/to/some-script. Utile se non stai invocando nodedirettamente.
Bluu


-1

Inoltre puoi utilizzare il debugger integrato , che apre il familiare debugger degli strumenti di sviluppo di Google Chrome. Si ferma in caso di errore e puoi sfogliare l'intero stack. Corri:

$ node --inspect debug.js

Debugger listening on port 9229.
To start debugging, open the following URL in Chrome: chrome-devtools://devtools/remote/serve_file/...
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.