如何找到罕见的错误?

问题描述:

我的应用程序包含一个错误,它使脚本无限期地运行。当我强制停止脚本时,所有jQuery UI元素都不会回应我的操作,也不会应用程序对按键的回答。如何找到罕见的错误?

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

事情是我不能再现这个bug,它有点让我发疯。如何找到并修复这样的浮动错误?

UPDATE。感谢你们所有人的建议。但问题是,我无法弄清楚错误何时发生,因此无法重现。这就是为什么标准程序不适用于我的情况。

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

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

可能的解决方案。我会遵循已发布的提示之一,并尝试对可能导致问题的所有功能进行操作。希望能帮助到你。

+2

你可以发布你的代码? – 2012-03-11 10:21:52

+2

+1。太多的问题只是要求问题的解决方案,而不是如何进行调试。 – maxedison 2012-03-11 10:24:19

+2

请提供http://sscce.org/ :) – 2012-03-11 10:31:38

无限长的时间,方式,

我觉得有些功能是越来越递归调用或一些事件得到递归激发。要跟踪下来,

  1. 尽量把console.log中的所有功能,都可以从window.onloaddocument.ready叫(如果你正在使用jQuery)。
  2. 使用Firebug的profile,它会告诉你正在发生的每个函数调用。
+0

'配置文件'将挂起无限循环/递归,几乎没有帮助。 – kirilloid 2012-03-11 10:46:22

有处理这种方法主要有两种:

  1. Set break points并通过您的代码
  2. 开始步骤注释掉的代码的某些部分。一旦您注销了一个消除该错误的部分,就可以开始评论该部分的较小部分,直到您到达导致该问题的代码行。

它也可能有助于知道你在找什么。一个无限的运行脚本通常会产生以下两种情况之一:

  1. 一个永不终止的循环。
  2. 一个自称

密切注意这些东西可以帮助调试过程赶快去多一点的功能。祝你好运!

+0

如何在不打开Firebug并重新加载页面的情况下设置断点并逐步执行代码? – 2012-03-11 10:43:14

+0

除非页面在加载时冻结第一件事。您加载页面,设置断点,然后刷新并调查导致错误行为的操作。 – kontur 2012-03-11 10:52:39

+0

正如@kontur所说的,在*开始与页面交互之前(在页面加载之后立即)设置断点*。 – maxedison 2012-03-11 11:06:54

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

  • 使用调试器时间轴。在时间线上记录您的网页表现,在您的网站周围巡游。你会在时间表中看到它花费的时间太长。浏览器可能会在您发现错误时崩溃,但您至少可以看到发生什么事的时间。

  • 尝试重新创建您的操作。做一些分步清单,了解你如何浏览。这样,您可以在代码中追踪脚本在执行移动时可能采用的路径。如果只有JS有像PHP这样的后台跟踪,这会更容易。

  • 尝试检查您的代码。像循环,递归或甚至两个互相调用的函数都可能导致这个永无止境的循环。

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

我一直在寻找可能被频繁调用的函数或永不停止循环的循环。然后,跟踪您怀疑的功能/循环执行的次数。例如:

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

(如果你正在监视多个犯罪嫌疑人与一些特定标识替换“这个功能/循环”)

A)使用WebKit的(Safari浏览器,铬,铬)检查,而不是萤火虫 - 无更多的重新加载,耶! B)沿着这种方式设置一些调试输出,这将有助于将问题缩小到犯罪者身上。

Firebug。重装?您是否尝试在页面加载之前打开Firebug