【问题标题】:How to find a rare bug?如何找到一个罕见的错误?
【发布时间】:2012-03-11 10:14:59
【问题描述】:

我的应用程序包含一个错误,导致脚本运行时间无限长。当我强制脚本停止时,所有 jQuery UI 元素都不会响应我的操作,应用程序也不会响应按键。

如果我选择打开 Firebug,它需要重新加载页面并且所有当前的应用程序状态都会丢失。

问题是我无法重现这个错误,这有点让我发疯。如何找到并修复这种狡猾的错误?

更新。感谢大家的建议。但问题是我无法弄清楚错误何时发生,因此无法重现它。这就是为什么标准程序在我的情况下不起作用的原因。

我检查了每个 while 循环和递归函数调用,但还没有找出问题所在。

发布代码不是一个好主意——代码清单很大而且相当复杂(游戏)。

可能的解决方案。我将遵循已发布的提示之一,并尝试对可能导致问题的所有功能进行控制台记录。希望对您有所帮助。

【问题讨论】:

  • +1。太多的问题只是询问问题的解决方案,而不是如何调试它。
  • 请提供sscce.org :)
  • @MikeMcMahon -- 我认为这没有必要。如果 OP 要求解决方案,那么我们需要一些代码。但他问的是调试,我认为我们有足够的时间继续下去(即错误的一般类别——无限递归)。

标签: javascript jquery debugging firebug


【解决方案1】:

有两种主要的处理方法:

  1. Set break points 并单步调试您的代码
  2. 开始注释掉某些代码部分。注释掉消除错误的部分后,开始注释掉该部分的较小部分,直到到达导致问题的代码行。

了解您在寻找什么也可能会有所帮助。无限运行的脚本通常由以下两种情况之一产生:

  1. 永不终止的循环。
  2. 调用自身的函数

留意这些事情可能有助于调试过程更快一点。祝你好运!

【讨论】:

  • 如何在不打开 Firebug 并重新加载页面的情况下设置断点并单步执行代码?
  • 除非页面在加载时首先冻结。您加载页面,设置断点,然后刷新并调查导致错误行为的操作。
  • 正如@kontur 所说,您开始与页面交互之前设置断点(页面加载后立即)。
【解决方案2】:
  • 将您的代码分成块并确定哪一个会导致失败。例如,如果您有一个包含多个字段的表单,这些字段具有日期选择器和自动完成功能,请将它们一一拆开。归零是谁造成的。

  • 使用调试器时间线。使用记录您的页面性能的时间线浏览您的网站。您将在时间线中看到哪个任务花费的时间太长。当你发现错误时浏览器可能会崩溃,但你至少会看到发生了什么。

  • 尝试重新创建您的操作。做一些关于如何浏览的分步清单。这样,您可以在代码中跟踪您的脚本在您移动时所采用的可能路径。如果只有 JS 有类似 PHP 的回溯,这会更容易。

  • 尝试检查您的代码。诸如循环、递归甚至两个函数相互调用之类的事情都可能导致这个永无止境的循环。

  • 如果可以,请使用 SVN 或 GIT 等 VCS 工具。您可以轻松构建 n' 破坏您的代码,而不必担心丢失工作版本。如果您使用 VCS,您可以轻松恢复。

【讨论】:

    【解决方案3】:

    无限长,意味着,

    我认为某些函数被递归调用或某些事件被递归触发。要追踪它,

    1. 尝试将console.log 放入从window.onloaddocument.ready 调用的所有函数中(如果您使用的是jquery)。
    2. 使用 Firebug 的 profile,它会告诉您正在发生的每个函数调用。

    【讨论】:

    • Profile 将挂起无限循环/递归,几乎无济于事。
    【解决方案4】:

    我总是寻找可能被过于频繁调用的函数或永远不会停止循环的循环。然后,跟踪您的可疑函数/循环执行了多少次。示例:

        var runCount = 0;
        function guiltyLookingFunction(params)
        {
            runCount++; //increase by 1 every time this function runs
            if (runCount>1000) //if this has run some insane number of times
                alert("this function is the that's running wild!");
    
            //the rest of your function's code
    
            //same thing with loops within functions:
            var loopCount = 0;
            while (0!=1)  //this will always be true, so the loop won't stop!
            {
                loopCount++;
                if (loopCount>1000)
                    alert("this loop is to blame!");
    
                //the rest of your loop
            }
        }
    

    (如果您正在监视多个嫌疑人,请将“此函数/循环”替换为某些特定标识符)

    【讨论】:

      【解决方案5】:

      A) 使用 WebKit 的(Safari、Chrome、Chromium)检查器而不是 firebug - 不再重新加载,耶!

      B) 在此过程中设置一些调试输出,有助于将问题范围缩小到肇事者。

      【讨论】:

        【解决方案6】:

        萤火虫。重新加载?您没有尝试在 页面加载之前打开 Firebug 吗?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-08
          • 2017-12-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多