2012-03-11 131 views
6

我的應用程序包含一個錯誤,它使腳本無限期地運行。當我強制停止腳本時,所有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

回答

0

無限長的時間,方式,

我覺得有些功能是越來越遞歸調用或一些事件得到遞歸激發。要跟蹤下來,

  1. 儘量把console.log中的所有功能,都可以從window.onloaddocument.ready叫(如果你正在使用jQuery)。
  2. 使用Firebug的profile,它會告訴你正在發生的每個函數調用。
+0

'配置文件'將掛起無限循環/遞歸,幾乎沒有幫助。 – kirilloid 2012-03-11 10:46:22

6

有處理這種方法主要有兩種:

  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

2
  • 將代碼分解成塊並確定哪一個會導致失敗。例如,如果您的表單中包含具有日期選取器和自動完成的多個字段,請逐一將它們分開。零引入誰是它的原因。

  • 使用調試器時間軸。在時間線上記錄您的網頁表現,在您的網站周圍巡遊。你會在時間表中看到它花費的時間太長。瀏覽器可能會在您發現錯誤時崩潰,但您至少可以看到發生什麼事的時間。

  • 嘗試重新創建您的操作。做一些分步清單,瞭解你如何瀏覽。這樣,您可以在代碼中追蹤腳本在執行移動時可能採用的路徑。如果只有JS有像PHP這樣的後臺跟蹤,這會更容易。

  • 嘗試檢查您的代碼。像循環,遞歸或甚至兩個互相調用的函數都可能導致這個永無止境的循環。

  • 如果可以,請使用VCS工具,如SVN或GIT。您可以輕鬆構建n'破解代碼,而不用擔心丟失工作版本。如果您使用VCS,則可以輕鬆恢復。

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

(如果你正在監視多個犯罪嫌疑人與一些特定標識替換「這個功能/循環」)

0

A)使用WebKit的(Safari瀏覽器,鉻,鉻)檢查,而不是螢火蟲 - 無更多的重新加載,耶! B)沿着這種方式設置一些調試輸出,這將有助於將問題縮小到犯罪者身上。

0

Firebug。重裝?您是否嘗試在頁面加載之前打開Firebug