在 Firefox 72 中使用监视点调试变量

Firefox Devtools 团队与代码贡献者社区一直在努力为 Firefox 72 添加大量改进。这篇文章介绍了现在可在 Firefox 开发者版 中使用的 监视点 功能!继续阅读以了解有关监视点以及如何使用它们的更多信息。

什么是监视点?为什么它们有用?

您是否曾经想了解在代码中对象上的属性在何处被读取或设置,而无需手动添加断点或日志语句?监视点是一种断点类型,可以回答此问题。

如果在对象上的属性上添加监视点,则每次使用该属性时,调试器都会在该位置暂停。监视点有两种类型:getsetget 监视点在每次读取属性时暂停,而 set 监视点在每次属性值更改时暂停。

当调试大型复杂代码库时,监视点功能特别有用。在这种环境中,可能并不容易预测在何处设置/读取属性。

监视点也适用于 Firefox 的 Visual Studio Code 扩展,在其中被称为“数据断点”。您可以从 VSCode 市场下载 Firefox 调试器扩展。然后,在 VSCode 的调试文档 中阅读有关如何使用 VSCode 的数据断点的更多信息。

入门

要设置监视点,请暂停调试器,在调试器的“范围”窗格中找到一个属性,然后右键单击它以查看菜单。显示菜单后,您可以选择添加 setget 监视点。这里我们要调试 obj.a,因此我们要在其上添加一个 set 监视点。

Screenshot of the 'Scopes' pane in the Debugger, with the menu showing where to add a set or get watchpoint

瞧,set 监视点已添加,属性右侧的蓝色监视点图标表示。在您的代码中,最简单的事情就是让调试器通知您何时设置属性。只需点击恢复 (或 F8),我们就开始了。

Screenshot of the debugger pane, once you've let the debugger inform you when properties are set.

调试器已在 obj.a 设置的第 7 行暂停。还要注意右上角的黄色暂停消息面板,它告诉我们由于 set 监视点而导致中断。

Screenshot of the debugger when it is paused for a set breakpoint

删除监视点就像删除常规断点一样 - 只需点击蓝色监视点图标即可。

就是这样!此功能使用起来很简单,但它在您的调试工具箱中非常强大。

实施

当您在属性上添加监视点时,会使用 JavaScript 的本机 Object.defineProperty 方法为该属性定义gettersetter 函数。这些 getter/setter 函数在每次使用您的属性时运行,并调用一个暂停调试器的函数。您可以 查看此功能的服务器代码

当我们构建监视点的实现时,我们面临着一个有趣的挑战。该团队需要确保我们使用 Object.defineProperty 对用户是透明的。出于这个原因,我们必须确保原始值而不是 getter/setter 函数出现在调试器中。

需要注意的一些事项

- 监视点不适用于 getter 和 setter。
- 当变量被 垃圾回收 时,它会将监视点也回收。

下一步

我们计划支持从控制台以及 DevTools 允许您检查对象的许多其他地方添加和查看监视点。此外,我们希望继续完善此功能,我们希望得到您的帮助!

Firefox 开发者版 72 中试用监视点,并请通过以下渠道之一向我们发送反馈

关于 Miriam Budayr

Miriam 是 Mozilla Firefox 的开源开发者,她在 Firefox 调试器中做出贡献。她的背景是古典钢琴/作曲,她对转行到编程很感兴趣。

Miriam Budayr 的更多文章…


一条评论

  1. C R

    这非常有用,谢谢!我发现自己很多次都在向编程之神祈祷这个功能。尤其是在具有多层间接的棘手代码中。

    2019 年 12 月 16 日 下午 4:31

本文评论已关闭。