web-dev-qa-db-fra.com

Comment obtenir le résultat de console.trace () sous forme de chaîne en javascript avec chrome ou firefox?)

console.trace() affiche son résultat sur la console.
Je veux obtenir les résultats sous forme de chaîne et les enregistrer dans un fichier.

Je ne définis pas les noms des fonctions et je ne peux pas non plus obtenir leurs noms avec callee.caller.name.

86
js_

Je ne suis pas sûr de Firefox, mais dans v8/chrome, vous pouvez utiliser une méthode du constructeur Error appelée captureStackTrace. ( Plus d'infos ici )

Donc, une façon simple de l'obtenir serait:

var getStackTrace = function() {
  var obj = {};
  Error.captureStackTrace(obj, getStackTrace);
  return obj.stack;
};

console.log(getStackTrace());

Normalement, getStackTrace serait sur la pile lorsqu'elle est capturée. Le deuxième argument exclut que getStackTrace soit inclus dans la trace de la pile.

87
chjj

Error.stack est ce dont vous avez besoin. Cela fonctionne dans Chrome et Firefox. Par exemple

try { var a = {}; a.debug(); } catch(ex) {console.log(ex.stack)}

donnera en Chrome:

TypeError: Object #<Object> has no method 'debug'
    at eval at <anonymous> (unknown source)
    at eval (native)
    at Object._evaluateOn (unknown source)
    at Object._evaluateAndWrap (unknown source)
    at Object.evaluate (unknown source)

et dans Firefox:

@http://www.google.com.ua/:87 _firebugInjectedEvaluate("with(_FirebugCommandLine){try { var a = {}; a.debug() } catch(ex) {console.log(ex.stack)}\n};")
@http://www.google.com.ua/:87 _firebugEvalEvent([object Event])
@http://www.google.com.ua/:67
32
Molecular Man

Cela donnera une trace de pile (sous forme de tableau de chaînes) pour Chrome moderne, Firefox, Opera et IE10 +

function getStackTrace () {

  var stack;

  try {
    throw new Error('');
  }
  catch (error) {
    stack = error.stack || '';
  }

  stack = stack.split('\n').map(function (line) { return line.trim(); });
  return stack.splice(stack[0] == 'Error' ? 2 : 1);
}

Usage:

console.log(getStackTrace().join('\n'));

Il exclut de la pile son propre appel ainsi que le titre "Erreur" utilisé par Chrome et Firefox (mais pas IE).

Il ne devrait pas planter sur les anciens navigateurs, mais simplement renvoyer un tableau vide. Si vous avez besoin d'une solution plus universelle, regardez stacktrace.js . Sa liste de navigateurs pris en charge est vraiment impressionnante, mais à mon sens, elle est très volumineuse pour cette petite tâche à laquelle elle est destinée: 37 Ko de texte minifié, y compris toutes les dépendances.

16

Il existe une bibliothèque appelée stacktrace.js qui vous donne des traces de pile entre navigateurs. Vous pouvez l'utiliser simplement en incluant le script et en appelant à n'importe quel moment:

var trace = printStackTrace();
13
fijiaaron

Ce n'est qu'une amélioration mineure de l'excellent code de Konstantin. Cela réduit un peu les frais de capture et d'instanciation de la pile d'erreur:

function getStackTrace () {
    let stack = new Error().stack || '';
    stack = stack.split('\n').map(function (line) { return line.trim(); });
    return stack.splice(stack[0] == 'Error' ? 2 : 1);
}

Je souhaite généralement un niveau spécifique de trace de pile (pour mon enregistreur personnalisé), ce qui est également possible lorsque vous appelez:

getStackTrace()[2]; // get stack trace info 2 levels-deep
8
sgouros

vous avez seulement besoin de var stack = new Error().stack. ceci est une version simplifiée de @sgouros answer.

function foo() {
  bar();
}
function bar() {
  baz();
}
function baz() {
  console.log(new Error().stack);
}

foo();

Ne fonctionnera probablement pas dans tous les navigateurs (fonctionne dans Chrome).

0
jcubic