Как получить результат console.trace() как строку в javascript с помощью chrome или firefox?

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

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

Ответ 1

Я не уверен в firefox, но в v8/chrome вы можете использовать метод конструктора Error с именем captureStackTrace. (Подробнее здесь)

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

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

console.log(getStackTrace());

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

Ответ 2

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

Ответ 3

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

var trace = printStackTrace();

Ответ 4

Это даст трассировку стека (как массив строк) для современных 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. Его список поддерживаемых браузеров действительно впечатляет, но, на мой взгляд, он очень большой для этой маленькой задачи, предназначенной для: 37Kb сокращенного текста, включая все зависимости.

Ответ 5

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

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

Ответ 6

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

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

foo();