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

时间:2019-05-14 17:52:44

标签: javascript asynchronous google-chrome-devtools

我一直在努力向仅在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

所以console.error给了我一个堆栈跟踪,该跟踪一直贯穿整个调用栈,大概是某种形式的Chrome引擎magick。 console.info为我提供了存储在err上的实际堆栈跟踪。如果完成所有操作后,我尝试读取e的值,则其堆栈是从console.info语句获得的两行,而不是console.error语句。

我要问的是,有什么方法可以捕获和存储我调用console.error时Chrome正在生成和使用的异步堆栈跟踪吗?

1 个答案:

答案 0 :(得分:2)

console.error()似乎为了方便起见调用了console.trace()

除了字符串以外,脚本似乎无法获得堆栈跟踪。该字符串可以与err.stack一起使用。 MDN具有stack property of Error的文档。它不是规范的一部分,但似乎在所有平台上都受支持。