Відповіді:
Я не впевнений у Firefox, але у v8 / chrome ви можете використовувати метод у конструкторі помилок, який називається captureStackTrace
. ( Більше інформації тут )
Отже, хакерський спосіб отримати це буде:
var getStackTrace = function() {
var obj = {};
Error.captureStackTrace(obj, getStackTrace);
return obj.stack;
};
console.log(getStackTrace());
Зазвичай, getStackTrace
він потрапляє в стек, коли його захоплюють. Другий аргумент там виключає getStackTrace
включення в трасування стека.
Error().stack
. Хоча імена об'єктів і функцій втрачаються у Firefox, а ім'я об'єкта втрачається в chrome (те саме, що і Error.captureStackTrace
), Error().stack
працює в обох браузерах, і це дає мені достатньо інформації для налагодження.
Error.stack - це те, що вам потрібно. Це працює в Chrome і Firefox. Наприклад
try { var a = {}; a.debug(); } catch(ex) {console.log(ex.stack)}
дасть у 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)
та у 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
(new Error).stack
Це дасть трасування стека (як масив рядків) для сучасних Chrome, Firefox, Opera та 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);
}
Використання:
console.log(getStackTrace().join('\n'));
Він виключає зі стеку власний виклик, а також заголовок "Помилка", який використовується Chrome і Firefox (але не IE).
Він не повинен розбиватися на старих браузерах, а просто повертати порожній масив. Якщо вам потрібно більш універсальне рішення, загляньте на stacktrace.js . Список підтримуваних браузерів справді вражає, але, на мою думку, він дуже великий для того невеликого завдання, для якого він призначений: 37 Кб зменшеного тексту, включаючи всі залежності.
Існує бібліотека stacktrace.js, яка дає вам перехресні стеки браузера. Ви можете використовувати його, просто включивши сценарій і зателефонувавши в будь-який момент:
var trace = printStackTrace();
Це лише незначне вдосконалення чудового кодексу Костянтина. Це трохи скорочує за рахунок закидання і просто створює екземпляр стека Error:
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);
}
Я, як правило, бажаю певного рівня трасування стека (для мого користувальницького реєстратора), тому це також можливо при виклику:
getStackTrace()[2]; // get stack trace info 2 levels-deep
вам потрібно лише var stack = new Error().stack
. це спрощена версія відповіді @sgouros.
function foo() {
bar();
}
function bar() {
baz();
}
function baz() {
console.log(new Error().stack);
}
foo();
Можливо, це буде працювати не в кожному браузері (працює в Chrome).