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
.
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
.
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
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.
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
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).
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
das funktioniert nicht in PhantomJS 🙁
– ekkis
17. Februar 2016 um 20:18 Uhr