【问题标题】:How to break on watch variables?如何打破手表变量?
【发布时间】:2015-04-02 11:24:35
【问题描述】:

我正在编写一个简单的命令行 Node.js 应用程序,其中 GLOBAL.thingies 神秘地以 undefined 结束。

我使用了节点检查器,我可以在任何给定的行设置断点,并且我为该变量设置了“监视表达式”,就像我在任何调试器中所做的那样。但是,我找不到该表达式何时变为undefined。如何在变量更改时设置断点?

节点检查器版本 0.9.2。

节点版本 0.12.2

Chrome 版本 41

【问题讨论】:

    标签: node.js node-inspector


    【解决方案1】:

    我不认为 node-inspector 具有您要求的功能。

    有一些典型的方法可以分析这样的问题并希望找出发生了什么。

    理论化你在寻找什么

    首先,列出GLOBAL.thingies 可能会如何突然以undefined 的形式返回的列表。在这个特殊的原因中,您不仅要寻找对GLOBAL.thingies 的分配,而且还可能用一个没有thingies 属性的新对象替换整个GLOBAL 对象。

    代码检查

    1. 对项目中涉及的所有代码执行 grep,并检查和研究任何能够更改变量的代码。你必须对你的 grep 有创意,以确保你包含所有可能的引用类型。在您的特定示例中,GLOBAL.thingiesGLOBAL["thingies"] 将是访问它的不同方式。在这种情况下,您可能只想搜索thingies 的任何可能用途,甚至可能希望包含对GLOBAL 的所有引用。

    2. 对代码的每个引用进行研究,并确定它是否可能导致您的问题。

    带断点的二分搜索

    1. 确定哪个高级操作导致变量更改为不希望的状态。
    2. 在调试器中进行设置,以便在变量更改之前的高级操作开始处有一个断点。
    3. 单步执行该高级操作中的顶级操作,以确定该操作中的哪个操作会导致变量发生变化。
    4. 重新启动以返回到变量更改之前在步骤 2 中的位置。在导致变量更改的顶级操作之前设置断点。运行到那个断点。
    5. 现在开始执行该操作。遍历麻烦操作中的每个顶级函数,直到找到导致变量更改的函数。
    6. 再次重复该过程,直到您最终找到导致变量更改的函数(不调用其他函数)。然后单步执行该函数中的每一行代码,找出它发生变化的地方。

    在某些情况下,您可以通过使用记录相关变量值的日志语句检测代码来简化二进制搜索的范围,这样您就可以更快地识别变量何时从好到坏以及哪些操作发生在 - 将二进制搜索的范围限制为该操作。如果您在可疑区域中有大量异步操作(这些操作更难跨越),则可能需要日志记录工具来帮助您将其缩小到问题发生的位置。

    【讨论】:

    • 感谢您的帮助。事实证明我在某个时候分配给thingies(没有GLOBAL。),它必须是同一个对象。
    猜你喜欢
    • 1970-01-01
    • 2018-08-12
    • 2019-03-20
    • 2013-04-25
    • 1970-01-01
    • 2014-12-05
    • 2015-07-25
    • 1970-01-01
    • 2011-10-08
    相关资源
    最近更新 更多