116 votes

Plus de 10 lignes dans une erreur de pile node.js ?

Existe-t-il un moyen d'obtenir plus de 10 lignes dans une erreur de pile 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);
}

montre :

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

Y a-t-il un moyen d'obtenir plus de 10 appels ?

0 votes

Un meilleur débogage est une priorité pour les futures versions de Node.JS.

0 votes

Dois-je comprendre de votre commentaire que cela ne peut pas encore être fait ?

0 votes

Non. Mais un meilleur débogage est sur la liste pour la .6 :)

171voto

Mariusz Nowak Points 5879

La solution la plus simple pour cela est de commencer votre code avec ce qui suit :

Error.stackTraceLimit = Infinity;

Si vous souhaitez voir la trace de la pile qui s'étend sur les appels setTimeout/setInterval, il faut utiliser une méthode plus sophistiquée. https://github.com/mattinsler/longjohn serait la meilleure solution.

2 votes

Error.stackTraceLimit n'a pas fonctionné pour moi la dernière fois que j'ai essayé.

0 votes

Notez que certains paquets peuvent changement stackTraceLimit . De plus, cela n'affecte que ce que vous obtenez dans Error.stack d'après ce que je peux voir. Le débogueur intégré affiche toujours la pile complète ( bt commande).

0 votes

Et apparemment, la trace de la pile ne suit pas les opérations asynchrones. En d'autres termes, dans le callback d'un appel asynchrone, votre pile repart de zéro (elle est fondamentalement vide).

82voto

jakub.g Points 3734

Vous pouvez passer la limite de trace de pile comme paramètre de ligne de commande à node :

node --stack-trace-limit=1000 debug.js // par défaut 10

BTW, une autre chose qui semble peu probable, mais qui vient de me faire perdre quelques heures de débogage, est la suivante la taille de la pile (qui est par défaut de 492 kB) . Vous pouvez avoir des erreurs très peu informatives si la pile est épuisée ( RangeError sans aucune information supplémentaire). Vous pouvez augmenter la taille de la pile avec :

node --stack-size=1024 debug.js // par défaut 492

Dans le monde des enchaînements callback-to-callback-to-callback, il est en fait très facile de dépasser la taille de la pile pour des entrées de grande taille, si le programme n'est pas écrit dans cette optique.

Pour voir toutes les options liées à la pile :

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

3 votes

--stack-trace-limit fonctionne toujours à partir de la 0.10.22, merci !

6 votes

Depuis la version 8.0.0 de Node.js, vous pouvez également définir ce paramètre dans le fichier de configuration de l'utilisateur. NODE_OPTIONS variable d'environnement, par exemple NODE_OPTIONS='--stack-trace-limit=10000' /path/to/some-script . Utile si vous n'invoquez pas node directement.

7voto

3rdEden Points 2697

4 votes

Espérons que Node.js finira par l'intégrer par défaut !

7voto

radrow Points 752

Vous pouvez définir la limite de trace dans NODE_OPTIONS variable :

$ NODE_OPTIONS=--stack-trace-limit=100 node debug.js
ReferenceError: dieInHell is not defined
    at a (/tmp/debug.js:1:16)
    at b (/tmp/debug.js:2:16)
    at c (/tmp/debug.js:3:16)
    at d (/tmp/debug.js:4:16)
    at e (/tmp/debug.js:5:16)
    at f (/tmp/debug.js:6:16)
    at g (/tmp/debug.js:7:16)
    at h (/tmp/debug.js:8:16)
    at i (/tmp/debug.js:9:16)
    at j (/tmp/debug.js:10:16)
    at k (/tmp/debug.js:11:16)
    at l (/tmp/debug.js:12:16)
    at m (/tmp/debug.js:13:16)
    at n (/tmp/debug.js:14:16)
    at o (/tmp/debug.js:15:16)
    at p (/tmp/debug.js:16:16)
    at q (/tmp/debug.js:17:16)
    at Object.<anonymous> (/tmp/debug.js:20:5)
    at Module._compile (node:internal/modules/cjs/loader:1108:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1137:10)
    at Module.load (node:internal/modules/cjs/loader:973:32)
    at Function.Module._load (node:internal/modules/cjs/loader:813:14)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:76:12)
    at node:internal/main/run_main_module:17:47

0voto

zbycz Points 75

Vous pouvez également utiliser débogueur intégré qui ouvre le débogueur familier dev-tools de Google Chrome. Il s'arrête sur toute erreur et vous pouvez parcourir toute la pile. Il suffit d'exécuter :

$ node --inspect debug.js

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X