web-dev-qa-db-fra.com

Comment imprimer une trace de pile dans Node.js?

Est-ce que quelqu'un sait comment imprimer une trace de pile dans Node.js?

470
mike.toString

Tout objet Error a un membre stack qui capture le point auquel il a été construit.

var stack = new Error().stack
console.log( stack )

ou plus simplement:

console.trace("Here I am!")
556
isaacs

Maintenant, il y a un fonction dédiée sur la console pour cela:

console.trace()
181
Mariusz Nowak

Comme déjà répondu, vous pouvez simplement utiliser la commande trace :

console.trace("I am here");

Cependant, , si vous rencontrez cette question en cherchant comment enregistrer la trace de pile d'une exception , vous pouvez simplement enregistrer l'objet Exception.

try {  
  // if something unexpected
  throw new Error("Something unexpected has occurred.");     

} catch (e) {
  console.error(e);
}

Il se connectera:

Erreur: Quelque chose d'inattendu s'est produit.
At main (c:\Users\Me\Documents\MyApp\app.js: 9: 15)
À Object. (c:\Users\Me\Documents\MyApp\app.js: 17: 1)
À Module._compile (module.js: 460: 26)
À Object.Module._extensions..js (module.js: 478: 10)
At Module.load (module.js: 355: 32)
At Function.Module._load (module.js: 310: 12)
À Function.Module.runMain (module.js: 501: 10)
Au démarrage (node.js: 129: 16)
À node.js: 814: 3


Si votre version de Node.js est <à 6.0.0 , la journalisation de l'objet Exception ne sera pas suffisante. Dans ce cas, il n’imprimera que:

[Erreur: Quelque chose d'inattendu s'est produit.]

Pour Node version <6, utilisez console.error(e.stack) au lieu de console.error(e) pour imprimer le message d'erreur ainsi que la pile complète, comme le fait la version Node actuelle.


Remarque: si l'exception est créée sous la forme d'une chaîne telle que throw "myException", il n'est pas possible de récupérer le suivi de la pile et la journalisation. e.stack donne non défini .

Pour être en sécurité, vous pouvez utiliser

console.error(e.stack || e);

et cela fonctionnera pour les anciennes et nouvelles versions de Node.js.

84
Zanon

Pour imprimer le tracé de pile de Error dans la console de manière plus lisible:

console.log(ex, ex.stack.split("\n"));

Exemple de résultat:

[Error] [ 'Error',
  '    at repl:1:7',
  '    at REPLServer.self.eval (repl.js:110:21)',
  '    at Interface.<anonymous> (repl.js:239:12)',
  '    at Interface.EventEmitter.emit (events.js:95:17)',
  '    at Interface._onLine (readline.js:202:10)',
  '    at Interface._line (readline.js:531:8)',
  '    at Interface._ttyWrite (readline.js:760:14)',
  '    at ReadStream.onkeypress (readline.js:99:10)',
  '    at ReadStream.EventEmitter.emit (events.js:98:17)',
  '    at emitKey (readline.js:1095:12)' ]
36
ruX

Avec un module Node facilement disponible, il est possible d’obtenir des traces de pile de longueur complète à partir de Node (avec toutefois une pénalité de performance mineure): http: // www .mattinsler.com/post/26396305882/advertizing-longjohn-long-stack-traces-for-node-js

9
Tim Boudreau

Essayez Error.captureStackTrace (targetObject [ constructorOpt]) .

const myObj = {};
function c() {
  // pass
}

function b() {
    Error.captureStackTrace(myObj)
    c()
} 

function a() {
    b()
}

a()

console.log(myObj.stack)

Les fonctions a et b sont capturées dans la pile d’erreurs et stockées dans myObj.

3
Zheeeng

Pour ce que je sais, imprimer la trace de pile complète dans nodejs n’est pas possible, vous pouvez simplement imprimer une trace de pile "partielle", vous ne pouvez pas voir d’où vous venez dans le code, juste où l’Exception se produit. C'est ce que Ryan Dahl explique dans cette vidéo sur youtube. http://youtu.be/jo_B4LTHi3I à min 56:30 pour être précis. J'espère que cela t'aides

3
ElHacker

Si vous souhaitez uniquement consigner la trace de la pile de l'erreur (et non le message d'erreur), Node 6 et supérieur inclut automatiquement le nom de l'erreur et le message dans la trace de la pile, ce qui est un peu gênant si vous souhaitez faire un peu de gestion des erreurs personnalisées:

console.log(error.stack.replace(error.message, ''))

Cette solution de contournement n'enregistrera que le nom de l'erreur et la trace de la pile (vous pourrez ainsi, par exemple, formater le message d'erreur et l'afficher comme bon vous semble ailleurs dans votre code).

L'exemple ci-dessus affiche uniquement le nom de l'erreur suivi de la trace de la pile, par exemple:

Error: 
    at /Users/cfisher/Git/squashed/execProcess.js:6:17
    at ChildProcess.exithandler (child_process.js:213:5)
    at emitTwo (events.js:106:13)
    at ChildProcess.emit (events.js:191:7)
    at maybeClose (internal/child_process.js:877:16)
    at Socket.<anonymous> (internal/child_process.js:334:11)
    at emitOne (events.js:96:13)
    at Socket.emit (events.js:188:7)
    at Pipe._handle.close [as _onclose] (net.js:498:12)

Au lieu de:

Error: Error: Command failed: sh ./commands/getBranchCommitCount.sh HEAD
git: 'rev-lists' is not a git command. See 'git --help'.

Did you mean this?
        rev-list

    at /Users/cfisher/Git/squashed/execProcess.js:6:17
    at ChildProcess.exithandler (child_process.js:213:5)
    at emitTwo (events.js:106:13)
    at ChildProcess.emit (events.js:191:7)
    at maybeClose (internal/child_process.js:877:16)
    at Socket.<anonymous> (internal/child_process.js:334:11)
    at emitOne (events.js:96:13)
    at Socket.emit (events.js:188:7)
    at Pipe._handle.close [as _onclose] (net.js:498:12)
2
GrayedFox

@ isaacs réponse est correcte, mais j'ai une réponse plus correcte. Cette réponse est inspirée du code source original de la classe Console au noeud js ( code source ):

function getStack() {
  var err = new Error();

  Error.captureStackTrace(err, getStack);

  return err.stack;
}
1

Si quelqu'un cherche toujours comme moi, alors il existe un module appelé "stack-trace". C'est vraiment populaire. NPM Link

Puis parcourez la trace.

  var stackTrace = require('stack-trace');
  .
  .
  .
  var trace = stackTrace.get();
  trace.map(function (item){ 
    console.log(new Date().toUTCString() + ' : ' +  item.toString() );  
  });

Ou simplement imprimez la trace:

var stackTrace = require('stack-trace');
.
.
.
var trace = stackTrace.get();
trace.toString();
1
Laszlo

vous pouvez utiliser le module node-stack-trace qui est un module d'alimentation complète permettant de suivre les piles d'appels.

0
Nitin9791