以编程方式捕获Chrome异步Javascript堆栈跟踪

以编程方式捕获Chrome异步Javascript堆栈跟踪,javascript,asynchronous,google-chrome-devtools,Javascript,Asynchronous,Google Chrome Devtools,我一直在努力为一个只在Chrome上运行的web应用程序添加一些更好的错误日志。本质上,我希望能够捕获和存储堆栈跟踪。对于同步代码,这很好,但是对于异步代码,我遇到了一些奇怪的事情。从本质上讲,Chrome似乎将记录附加信息作为其异步堆栈跟踪功能的一部分,但我还没有弄清楚如何捕获它 要在Chrome浏览器控制台中运行的代码: let e; let a = () => Promise.resolve(null) .then(() => (null).foo) .catch(err =&

我一直在努力为一个只在Chrome上运行的web应用程序添加一些更好的错误日志。本质上,我希望能够捕获和存储堆栈跟踪。对于同步代码,这很好,但是对于异步代码,我遇到了一些奇怪的事情。从本质上讲,Chrome似乎将记录附加信息作为其异步堆栈跟踪功能的一部分,但我还没有弄清楚如何捕获它

要在Chrome浏览器控制台中运行的代码:

let e;
let a = () => Promise.resolve(null)
.then(() => (null).foo)
.catch(err => {
  console.info(err); 
  console.error(err); 
  e = err;
})
let b = () => a();
let c = () => b();
c();
输出:

(info)
TypeError: Cannot read property 'foo' of null
    at <anonymous>:3:20

(error, after expanding)
TypeError: Cannot read property 'foo' of null
    at <anonymous>:3:20
(anonymous) @ VM1963:6
Promise.catch (async)
a @ VM1963:4
b @ VM1963:9
c @ VM1963:10
(anonymous) @ VM1963:11
(信息)
TypeError:无法读取null的属性“foo”
时间:3:20
(展开后出错)
TypeError:无法读取null的属性“foo”
时间:3:20
(匿名)@VM1963:6
Promise.catch(异步)
a@VM1963:4
b@VM1963:9
c@VM1963:10
(匿名)@VM1963:11
因此,
console.error
给了我一个贯穿调用堆栈的堆栈跟踪,大概是通过某种形式的Chrome引擎magick
console.info
提供存储在
err
上的实际堆栈跟踪。如果在这一切完成后,我尝试读取
e
的值,则其堆栈是我从
console.info
语句获得的两行,而不是
console.error
语句

我想问的是,当我调用
console.error

console.error()
似乎是为了方便起见调用
console.trace()
,是否有任何方法可以捕获和存储Chrome正在生成和使用的异步堆栈跟踪


它看起来不像是一个脚本可以像字符串以外的任何东西一样获取堆栈跟踪。例如,该字符串可以与
err.stack
一起使用。MDN提供了有关的文档。它不是规范的一部分,但似乎在所有平台上都受支持。

我尝试了它,我看到错误堆栈由chrome显示……它与在catch block中传递的错误对象没有任何关系。您是否考虑过使用
对象。defineProperty
覆盖
控制台
方法。或者类似地使用
代理
捕获
控制台
调用?更重要的是,还有一个包,能够将stringy stack转换为正确解析的列表,跨平台。问题是,
err.stack
不包含异步部分,而
console.trace
包含异步部分。节点具有该节点的
--async stack traces
标志。所以问题是,是否有任何方法可以在浏览器中获取异步堆栈跟踪,就像我们在devtools中看到的那样。是一个v8标志,因此也可能在Chrome中提供。不过,您可能也对它感兴趣,因为它基于
Error.stack
,它可能也不处理异步堆栈。是的,npm的
stacktrace js
也不包括异步部分。