Как получить результат console.trace () в виде строки в JavaScript с Chrome или Firefox? - PullRequest
85 голосов
/ 16 июля 2011

console.trace() выводит свой результат на консоль.
Я хочу получить результаты в виде строки и сохранить их в файл.

Я не определяю имена для функций, и я также не могу получить их имена с callee.caller.name.

Ответы [ 6 ]

86 голосов
/ 16 июля 2011

Я не уверен насчет firefox, но в v8 / chrome вы можете использовать метод конструктора Error, который называется captureStackTrace.( Больше информации здесь )

Таким образом, хакерский способ получить это будет:

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

console.log(getStackTrace());

Обычно, getStackTrace будет в стеке при захвате.Второй аргумент исключает getStackTrace из включения в трассировку стека.

31 голосов
/ 16 июля 2011

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
15 голосов
/ 23 января 2015

Это даст трассировку стека (в виде массива строк) для современных 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 Кбайт минимизированного текста, включая все зависимости.

13 голосов
/ 13 июля 2012

Существует библиотека с именем stacktrace.js , которая предоставляет перекрестные следы стека в браузере.Вы можете использовать его, просто включив скрипт и позвонив в любой момент:

var trace = printStackTrace();
8 голосов
/ 23 марта 2016

Это лишь незначительное улучшение отличного кода Константина.Это немного экономит за счет броска-перехвата и просто создает экземпляр стека ошибок:

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
0 голосов
/ 09 июня 2019

вам нужно только var stack = new Error().stack.это упрощенная версия ответа @sgouros.

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

foo();

Возможно, не будет работать во всех браузерах (работает в Chrome).

...