如何使用chrome或firefox获取javascript中console.trace()的结果作为字符串?


98

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

我没有为函数定义名称,也无法使用来获取名称callee.caller.name


1
这在PhantomJS中不起作用:(
ekkis

Answers:


103

我不确定firefox,但是在v8 / chrome中,您可以在Error构造函数上使用一种称为的方法captureStackTrace。(更多信息在这里

因此,获取该漏洞的一种方法是:

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

console.log(getStackTrace());

通常,getStackTrace在捕获时将在堆栈中。那里的第二个参数排除getStackTrace在堆栈跟踪之外。


18
感谢您的信息。这适用于Chrome,但不适用于Firefox。于是我再次搜寻并找到了Error().stack。虽然在Firefox中对象和函数名称丢失,而在chrome中对象名称丢失(与相同Error.captureStackTrace),但Error().stack它们在两种浏览器上均可工作,并且为我提供了足够的信息来进行调试。
js_

结果与@Konstantin Smolyanin的答案完全相同。结果,相同的有限细节。
Codebeat

这不应该是公认的答案。您在此处获得的堆栈是“缩减的”,仅包含“顶部”,而console.trace()将显示完整的堆栈。看到与堆深度30在这里的一个示例:stackoverflow.com/questions/62768598/...
mathheadinclouds

34

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
感谢您的回答。但这仅在发生异常时有效。我需要无一例外地获取堆栈跟踪。
js_

8
怎么样(new Error).stack
JasonSmith 2011年

这应该在a.debug()上引发异常-这是获取堆栈的昂贵方法,但应该可以工作。
fijiaaron 2012年

当试图从某些只能运行的代码(例如PhantomJS等)中获取跟踪时,这种方法也很方便。
waxspin 2014年

18

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



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);
}

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

getStackTrace()[2]; // get stack trace info 2 levels-deep

5

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

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

foo();

可能不会在所有浏览器中都适用(在Chrome中可以使用)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.