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

IT技术 javascript firefox google-chrome console stack-trace
2021-03-16 18:10:36

console.trace()在控制台上输出其结果。
我想以字符串形式获取结果并将它们保存到文件中。

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

6个回答

我不确定 firefox,但在 v8/chrome 中,您可以在名为captureStackTrace. 更多信息在这里

所以获得它的一种hacky方法是:

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

console.log(getStackTrace());

通常,getStackTrace当它被捕获时会在堆栈上。那里的第二个参数排除getStackTrace在堆栈跟踪中。

与@Konstantin Smolyanin 的答案完全相同。结果同样有限的细节。
2021-05-02 18:10:36
感谢您的信息。这在 chrome 中有效,但在 Firefox 中无效。所以我再次搜索并找到了Error().stack虽然对象和函数名在Firefox丢失,对象名称中铬(同丢失Error.captureStackTrace),Error().stack工程浏览器和它给了我足够的信息来调试。
2021-05-04 18:10:36
这不应该是公认的答案。您在此处获得的堆栈是“缩减”的,仅包含“顶部”,而 console.trace() 将显示完整的堆栈。在此处查看堆栈深度为 30 的示例:stackoverflow.com/questions/62768598/...
2021-05-05 18:10:36

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
这应该在 a.debug() 上抛出异常——这是一种获取堆栈的昂贵方法,但应该有效。
2021-04-23 18:10:36
关于什么 (new Error).stack
2021-04-27 18:10:36
当试图从一些只能运行的代码(例如 PhantomJS 或类似的代码)中获取跟踪时,无论出于何种原因,这种方法也很方便。
2021-05-04 18:10:36
感谢您的回答。但这仅在发生异常时才有效。我需要毫无例外地获得堆栈跟踪。
2021-05-07 18:10:36

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

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

var trace = printStackTrace();
请注意,现在应该使用:github.com/stacktracejs/stacktrace.js/tree/stable?files=1(新版本尚未发布)
2021-05-08 18:10:36
我会查看github.com/stacktracejs/stacktrace.js,因为实现已更改为支持 ES6 Promise。
2021-05-13 18:10:36

这只是对 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