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

js_*_*js_ 88 javascript console firefox google-chrome stack-trace

console.trace()在控制台上输出结果.
我想将结果作为字符串并将它们保存到文件中.

我没有为函数定义名称,我也无法得到它们的名字callee.caller.name.

chj*_*hjj 89

我不确定firefox,但是在v8/chrome中你可以使用一个名为Error构造函数的方法captureStackTrace.(更多信息在这里)

所以一个hacky方式得到它将是:

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

console.log(getStackTrace());
Run Code Online (Sandbox Code Playgroud)

通常情况下,getStackTrace捕获时会在堆栈中.那里的第二个参数不getStackTrace包括在堆栈跟踪中.

  • 感谢您的信息.这在chrome中起作用但在Firefox中没有用.所以我再次搜索并找到了`Error().stack`.虽然对象和函数名在firefox中丢失,对象名在chrome中丢失(与`Error.captureStackTrace`相同),`Error().stack`适用于两种浏览器,它为我提供了足够的调试信息. (18认同)
  • 这不应该是公认的答案。您在这里得到的堆栈是“削减”的,仅包含“顶部部分”,而 console.trace() 将显示完整的堆栈。请参阅此处堆栈深度 30 的示例:/sf/ask/4393801891/ (2认同)

Mol*_*Man 34

Error.stack是你需要的.它适用于Chrome和Firefox.例如

try { var a = {}; a.debug(); } catch(ex) {console.log(ex.stack)}
Run Code Online (Sandbox Code Playgroud)

将在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)
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

  • 怎么样`(新错误).stack` (8认同)
  • 感谢您的回答.但这只有在发生异常时才有效.我需要毫无例外地获得堆栈跟踪. (2认同)

Kon*_*nin 17

这将为现代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);
}
Run Code Online (Sandbox Code Playgroud)

用法:

console.log(getStackTrace().join('\n'));
Run Code Online (Sandbox Code Playgroud)

它从堆栈中排除了自己的调用以及Chrome和Firefox(但不是IE)使用的标题"错误".

它不应该在旧浏览器上崩溃,而只是返回空数组.如果您需要更多通用解决方案,请查看stacktrace.js.它支持的浏览器列表真的很令人印象深刻,但在我看来,这对于它的小任务非常重要:37Kb的缩小文本,包括所有依赖项.


fij*_*ron 13

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

var trace = printStackTrace();
Run Code Online (Sandbox Code Playgroud)


sgo*_*ros 9

这只是Konstantin优秀代码的一个小改进.它削减了一点点抛出捕获并只是实例化错误堆栈:

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);
}
Run Code Online (Sandbox Code Playgroud)

我通常需要特定级别的堆栈跟踪(对于我的自定义记录器),因此在调用时也可以这样做:

getStackTrace()[2]; // get stack trace info 2 levels-deep
Run Code Online (Sandbox Code Playgroud)


jcu*_*bic 9

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

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

foo();
Run Code Online (Sandbox Code Playgroud)

可能不适用于所有浏览器(适用于 Chrome)。


Al *_*had 7

我试图在 NodeJS 上的 JavaScript 中将堆栈跟踪作为字符串变量获取,教程对我有所帮助。这也适用于您的场景,除非堆栈跟踪是通过错误对象打印的console.trace()

打印堆栈跟踪的代码:

function add(x, y) {
    console.log(new Error().stack);
    return x+y;
}
Run Code Online (Sandbox Code Playgroud)