Wie bekomme ich das Ergebnis von console.trace() als String in Javascript mit Chrome oder Firefox?

Lesezeit: 4 Minuten

console.trace() gibt sein Ergebnis auf der Konsole aus.
Ich möchte die Ergebnisse als Zeichenfolge erhalten und in einer Datei speichern.

Ich definiere keine Namen für Funktionen und kann ihre Namen auch nicht bekommen callee.caller.name.

  • das funktioniert nicht in PhantomJS 🙁

    – ekkis

    17. Februar 2016 um 20:18 Uhr

Ich bin mir bei Firefox nicht sicher, aber in v8/chrome können Sie eine Methode für den aufgerufenen Fehlerkonstruktor verwenden captureStackTrace. (Mehr Infos hier)

Ein hackiger Weg, es zu bekommen, wäre also:

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

console.log(getStackTrace());

Normalerweise, getStackTrace würde auf dem Stapel sein, wenn es erfasst wird. Das zweite Argument dort schließt aus getStackTrace nicht in den Stack-Trace aufgenommen werden.

  • Danke für Ihre Information. Das funktionierte in Chrome, aber nicht in Firefox. Also nochmal gesucht und gefunden Error().stack. Obwohl Objekt- und Funktionsnamen in Firefox verloren gehen und Objektname in Chrome verloren geht (wie Error.captureStackTrace), Error().stack funktioniert mit beiden Browsern und gibt mir genügend Informationen zum Debuggen.

    – js_

    17. Juli 2011 um 3:20 Uhr

  • Genau das gleiche Ergebnis wie die Antwort von @Konstantin Smolyanin. Als Ergebnis die gleichen begrenzten Details.

    – Codebeat

    4. September 2018 um 1:23 Uhr


  • Dies sollte nicht die akzeptierte Antwort sein. Der Stack, den Sie hier erhalten, ist “heruntergeschnitten” und enthält nur einen “oberen Teil”, während console.trace() den vollständigen Stack anzeigt. Sehen Sie hier ein Beispiel mit Stapeltiefe 30: stackoverflow.com/questions/62768598/…

    – MathekopfinWolken

    7. Juli 2020 um 6:10 Uhr

Benutzer-Avatar
Molekularer Mensch

Error.stack ist das, was Sie brauchen. Es funktioniert in Chrome und Firefox. Zum Beispiel

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

wird in Chrome geben:

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)

und im 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

  • Danke für deine Antwort. Aber das funktioniert nur, wenn eine Ausnahme aufgetreten ist. Ich muss ausnahmslos Stack-Trace erhalten.

    – js_

    17. Juli 2011 um 3:23 Uhr

  • Wie wäre es mit (new Error).stack

    – JasonSmith

    14. Dezember 2011 um 2:22 Uhr

  • Dies sollte eine Ausnahme auf a.debug() auslösen – es ist eine teure Methode, um den Stack zu erhalten, sollte aber funktionieren.

    – fijiaaron

    12. Juli 2012 um 20:02 Uhr

  • Dieser Ansatz ist auch praktisch, wenn Sie versuchen, einen Trace von Code zu erhalten, der nur auf ausgeführt werden kann, z. B. PhantomJS oder dergleichen, aus welchen Gründen auch immer.

    – Wachsspinne

    31. Dezember 2014 um 19:11 Uhr

Dies ergibt einen Stack-Trace (als Array von Strings) für modernes Chrome, Firefox, Opera und 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);
}

Verwendungszweck:

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

Es schließt seinen eigenen Aufruf sowie den Titel “Error”, der von Chrome und Firefox (aber nicht von IE) verwendet wird, aus dem Stack aus.

Es sollte bei älteren Browsern nicht abstürzen, sondern nur ein leeres Array zurückgeben. Wenn Sie eine universellere Lösung benötigen, schauen Sie sich an stacktrace.js. Die Liste der unterstützten Browser ist wirklich beeindruckend, aber meiner Meinung nach ist sie sehr groß für die kleine Aufgabe, für die sie gedacht ist: 37 KB verkleinerter Text einschließlich aller Abhängigkeiten.

Benutzer-Avatar
fijiaaron

Es gibt eine Bibliothek namens stacktrace.js das gibt Ihnen Cross-Browser-Stack-Traces. Sie können es einfach verwenden, indem Sie das Skript einbinden und an einer beliebigen Stelle aufrufen:

var trace = printStackTrace();

Dies ist nur eine geringfügige Verbesserung von Konstantins hervorragendem Code. Es reduziert die Kosten für das Werfen und Fangen ein wenig und instanziiert nur den Fehlerstapel:

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

Ich möchte normalerweise ein bestimmtes Stack-Trace-Level (für meinen benutzerdefinierten Logger), daher ist dies auch beim Aufrufen möglich:

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

Benutzer-Avatar
jkubisch

du brauchst nur var stack = new Error().stack. Dies ist eine vereinfachte Version von @sgouros answer.

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

foo();

Funktioniert wahrscheinlich nicht in jedem Browser (funktioniert in Chrome).

Benutzer-Avatar
Al Fahad

Ich habe versucht, Stack Trace als String-Variable in JavaScript auf NodeJS zu erhalten und Dies Tutorial hat mir geholfen. Dies funktioniert auch in Ihrem Szenario, außer dass der Stack-Trace über Error Object als gedruckt wird console.trace().

Code zum Drucken des Stack-Trace:

function add(x, y) {
    console.log(new Error().stack);
    return x+y;
}

  • Das ist genauer und plattformübergreifender, es funktioniert sogar bei nodejs.

    – Andrés Felipe

    25. Oktober 2021 um 19:38 Uhr

1246510cookie-checkWie bekomme ich das Ergebnis von console.trace() als String in Javascript mit Chrome oder Firefox?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy