如何找到一个罕见的bug?

时间:2012-03-11 10:14:59

标签: javascript jquery debugging firebug

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

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

事情是我无法重现这个错误,这有点让我发疯。如何找到并修复这种光滑的bug?

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

我已经检查了每个while循环和递归函数调用,但还没有弄清楚问题。

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

可能的解决方案。我将按照已发布的提示之一进行操作,并尝试对可能导致问题的所有功能进行控制日志记录。希望它有所帮助。

6 个答案:

答案 0 :(得分:6)

有两种主要方法可以解决这个问题:

  1. Set break points并逐步执行您的代码
  2. 开始评论某些代码段。一旦你注释掉了一个消除了这个bug的部分,就开始评论该部分的较小部分,直到你到达导致问题的代码行。
  3. 了解您的需求也可能有所帮助。无限运行的脚本通常来自两件事之一:

    1. 永不终止的循环。
    2. 自称为
    3. 的函数

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

答案 1 :(得分:2)

  • 将代码分成块并确定哪一个导致失败。例如,如果您的表单包含多个具有日期选择器和自动完成的字段,请将它们逐个分开。归零于谁。

  • 使用调试器时间轴。使用记录页面性能的时间线巡航您的网站。你会在时间轴上看到它花了太长时间的任务。当您发现错误时,浏览器可能会崩溃,但您至少会看到发生的情况。

  • 尝试重新创建您的操作。有关如何浏览的详细分步清单。这样,您可以在代码中跟踪脚本在移动时可能采用的路径。如果只有JS像PHP这样的反向跟踪,这会更容易。

  • 尝试检查您的代码。像循环,递归甚至两个相互调用的函数之类的东西会导致这种永无止境的循环。

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

答案 2 :(得分:0)

无限长时间,意味着,

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

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

答案 3 :(得分:0)

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

    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
        }
    }

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

答案 4 :(得分:0)

A)使用WebKit(Safari,Chrome,Chromium)检查员而不是萤火虫 - 不再重装,是的!

B)设置一些调试输出,以帮助将问题缩小到犯罪者。

答案 5 :(得分:0)

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