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


93

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);
}

spectacles :

$ 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-t-il un moyen de recevoir plus de 10 appels?


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

Dois-je déduire de votre commentaire que cela ne peut pas encore être fait?
Julien Genestoux

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

Réponses:


138

La solution la plus simple pour cela est de démarrer votre code avec les éléments suivants:

Error.stackTraceLimit = Infinity;

Si vous souhaitez voir une trace de pile qui s'étend sur les appels setTimeout / setInterval, alors https://github.com/mattinsler/longjohn plus sophistiqué serait la voie à suivre.


2
Error.stackTraceLimit ne l'a pas fait pour moi lors de ma dernière tentative.
BT

Notez que certains packages peuvent changer stackTraceLimit . De plus, cela n'affecte que ce que vous obtenez à Error.stackpartir de ce que je peux voir. Le débogueur intégré affiche toujours la pile complète ( btcommande).
x-yuri

Et apparemment, la trace de pile ne suit pas les opérations asynchrones. En d'autres termes, dans un rappel d'un appel asynchrone, votre pile commence à partir de zéro (elle est pratiquement vide).
x-yuri

L'équipe @ x-yuri Node.js y travaille ( github.com/nodejs/node/issues/11865 ) Sinon, la pile complète est visible dans le débogueur Chrome lorsque vous exécutez l'application Node avec la commande --inspector--inpect-brk
Mariusz Nowak

Omg ça me rendait fou. Merci pour cette info!
Kris Oye

65

Vous pouvez transmettre la limite de trace de pile en tant que paramètre de ligne de commande à node:

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

BTW, une autre chose qui semble improbable, mais qui a perdu quelques heures de mon temps pour le débogage, est la taille de la pile (qui par défaut est de 492 ko) . Vous pouvez avoir des erreurs très peu informatives si la pile est épuisée ( RangeErrorsans 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 chaînages callback-to-callback-to-callback, il est en fait très facile de dépasser la taille de la pile pour les grandes tailles d'entrée, si le programme n'est pas écrit dans cet esprit.

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

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


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

3
À partir de Node.js v8.0.0, vous pouvez également définir cela dans la NODE_OPTIONSvariable d'environnement, par exemple NODE_OPTIONS='--stack-trace-limit=10000' /path/to/some-script. Utile si vous n'invoquez pas nodedirectement.
Bluu


-1

Vous pouvez également utiliser le débogueur intégré , qui ouvre le débogueur familier des outils de développement de Google Chrome. Il s'arrête sur toute erreur et vous pouvez parcourir la pile entière. Exécutez simplement:

$ node --inspect debug.js

Debugger listening on port 9229.
To start debugging, open the following URL in Chrome: chrome-devtools://devtools/remote/serve_file/...
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.