如何在带有chrome或firefox的javascript中将console.trace()的结果作为字符串?

时间:2011-07-16 05:34:35

标签: javascript firefox google-chrome console stack-trace

console.trace()在控制台上输出结果 我想将结果作为字符串并将它们保存到文件中
我没有为函数定义名称,也无法用callee.caller.name来命名。

8 个答案:

答案 0 :(得分:85)

我不确定firefox,但是在v8 / chrome中你可以在名为captureStackTrace的Error构造函数上使用一个方法。 (More info here

这样一个hacky方法就是:

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

console.log(getStackTrace());

通常情况下,getStackTrace会在捕获时出现在堆栈中。第二个参数排除了getStackTrace被包含在堆栈跟踪中。

答案 1 :(得分:31)

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

答案 2 :(得分:13)

有一个名为stacktrace.js的库可以为您提供跨浏览器堆栈跟踪。您可以通过包含脚本并随时调用来使用它:

var trace = printStackTrace();

答案 3 :(得分:12)

这将为现代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的缩小文本,包括所有依赖项。

答案 4 :(得分:8)

这只是对康斯坦丁优秀代码的一个小改进。它会减少抛出捕获的费用,并且只是实例化错误堆栈:

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

答案 5 :(得分:1)

console.trace包含异步操作。 new Error().stack没有。我还在等待更好的答案。

答案 6 :(得分:0)

您只需要var stack = new Error().stack。这是@sgouros答案的简化版本。

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

foo();

可能无法在所有浏览器中使用(在Chrome中可以使用)。

答案 7 :(得分:0)

我试图将Stack Trace作为NodeJS上JavaScript中的字符串变量获取,并且this教程对我有所帮助。除了通过console.trace()之外的Error Object打印堆栈跟踪信息之外,这也将在您的情况下起作用。

要打印堆栈跟踪的代码:

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