javascript - 检测大型 JS 程序中的任何变量何时设置为 NaN

标签 javascript debugging nan

我有一个庞大、困惑的 JS 代码库。有时,在使用应用程序时,变量会设置为 NaN。因为 x = 2 + NaN 导致 x 被设置为 NaN,所以 NaN 会像病毒一样传播。在某个时候,在它传播很远之后,用户会注意到到处都是 NaN,而且狗屎通常不再起作用了。从这种状态开始,我很难回溯并确定 NaN 的来源(很可能有多个来源)。

NaN 错误也不容易重现。尽管有数百人观察并向我报告,但没有人能告诉我导致 NaN 出现的一组步骤。也许这是一种罕见的比赛条件或其他什么。但这绝对是罕见的,而且来源不明。

我该如何修复这个错误?有什么想法吗?

我想到的两个愚蠢的想法,可能不可行:

  1. 编写某种预处理器,在每次使用任何变量之前插入 isNaN 检查并记录第一次出现的 NaN。我认为以前没有这样做过,我不知道这会有多难。如有任何建议,我们将不胜感激。

  2. 在 JS 引擎中运行我的代码,该引擎能够在任何变量设置为 NaN 时设置断点。我不认为开箱即用的任何东西,但将它添加到 Firefox 或 Chrome 有多难?

我觉得我一定不是第一个遇到这种问题的人,但我找不到其他人谈论它。

最佳答案

您的问题可能没有解决方案,又名:中断,只要任何变量设置为 NaN。相反,您可以尝试像这样观察您的变量:

  • 前面已经说过,Chrome 调试器提供了条件断点。但是,它也支持观看表情。在 Watch-Expressions 菜单中,您可以设置中断条件,只要变量设置为特定值。

  • Object.observe是一种观察对象变化的方法。您可以监听对象的所有更改,并在任何变量设置为 NaN 时调用 debug。例如,您可以观察窗口对象的所有变化。每当窗口对象上的任何变量设置为 NaN 时,您都会调用 debug。请注意,Object.observe 非常先进,并非所有浏览器都支持(在这种情况下请查看 polyfill)。

  • 借此机会为代码中的每个函数编写一个测试用例。执行 random testing并找到可以创建 NaN 值的代码行。

您的另一个问题可能是如何重现此错误。一遍又一遍地重新加载您的网页没有多大意义。您可以查看所谓的 headless 浏览器:它会启动一个浏览器实例而不显示它。它可以用来在网站上执行自动测试,点击一些按钮,做一些事情。也许您可以以最终重现您的错误的方式编写脚本。这样做的好处是您不必重新加载网页数百次。 headless 浏览器有多种实现。 PhantomJS真的很好,在我看来。您还可以使用它启动 Chrome 调试控制台(您需要一些插件:remote debugger)。

此外,请注意 NaN is never equal to NaN .如果你最终能够重现错误,但你的断点不起作用,那将是一个遗憾。

关于javascript - 检测大型 JS 程序中的任何变量何时设置为 NaN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26563329/

相关文章:

debugging - 如何调试包含在 libtool 脚本中的程序?

c - Eclipse CDT 中的调试问题

Android 调试 DDMS 无法连接 Windows 8

javascript - 如果输入为 NaN,如何使提示重复

python-3.x - 用组的现有值替换 NaN

javascript - ajax GET 方法中未调用成功函数

javascript - jquery-mobile:关闭桌面主题

javascript - 使用 $http.get 显示 json 文件中的一个数组项

java - float .NaN == float .NaN

javascript - Superscrollorame 到达某个 div 时播放声音