Welcome to MSDN Blogs Sign in | Join | Help

TechEd2008- .NET 應用程式除錯秘技系列(5) - 應用程式沒有回應(Busy Hang)

好久沒有更新了~因為之前休了2個星期的長假。回來又一堆事情等著處理,因此這TechEd 系列的最後一篇一直等到今天才有時間寫。由於在TechEd 2008上面的demo有點複雜,因此我寫了另一支簡化的程式來做為這個busy hang (CPU High)的範例,範例從這裏下載。

造成Busy的原因其實不少,包含無窮迴圈啦、過於頻繁的GC回收啦、memory leak...... 都可能會造成busy hang. 今天主要來談無窮迴圈(Infinite loop)所造成的busy hang.

可能很多人會說: 無窮迴圈還需要用到偵錯工具來分析嗎? 別笑死人了~ 看一下程式碼也知道哪裏有問題!!

但就我們support客戶的經驗來看,事實恐怕並非如此。以下狀況有可能會造成無窮迴圈(或是要算很久才會有結果):

1. While true ~ End While 迴圈 : 建議最好少用!

2. 同上, 但有判斷式,只是這個判斷式可能判斷得不是很周延,導致判斷式的結果恆成立或不成立,造成無窮迴圈

3. 使用遞迴(Recursion),但無法預估其深度,造成需要長時間計算或無窮迴圈。

當然還有更複雜的狀況所造成的無窮迴圈,而這些都是使用者始料未及的。 以下針對我們的範例先做一下說明:

 

  private void button1_Click(object sender, EventArgs e)
        {
            Infiniteloop();
        }
 
        void Infiniteloop()
        {
            while (true)
            {
                A();
            }
        }
 
        void A() { B(); }
 
        void B() {C();}
 
        void C() {D();}
 
        void D() { }

從以上的code 我們可以看到, 按下button1後,程式會呼叫 Infiniteloop, 之後會呼叫function A => funtion B => function C => function D ,不斷的重覆這樣的呼叫順序。面對這種狀況,我們怎麼找到哪一個funtion 才是造成無窮迴圈的元兇呢? 以下這兩張圖說明了程式執行的順序及troubleshooting的方式:

在Visual Studio中我們可以使用Step - In的方式單步執行我們的程式

036

針對此問題,由於我們會在hang的時候使用Visual Studio中斷我們的程式,程式有可能斷在Infiniteloop,function A,B,C,D其中一個function中,因此我們必須Step - out, 觀察程式退到哪一個function時會繼續執行程式,最後的那一個function便是造成無窮迴圈的funtion啦!!

037

 

以下為實際執行程式及偵錯的過程:

1. 執行程式,讓它High 起來,並且按下Beak All 按鈕讓程式斷下來!

038

2. 我們看到此程式斷在function B

039

3. 按一下Step-out後,程式退到function A

040

4. 再step -out一次, 程式退到Infiniteloop, 此時若再按一下step - out, 程式會離開中斷模式並繼續執行,因此我們可以斷定造成無窮迴圈的是InfiniteLoop函數

042

5. 再按一次Break All, 發現這次斷在 function D

041

重覆確認後,就可以找到元兇囉!!

總算把欠大家的文字說明寫完了~ 如果是沒來上過TechEd 的朋友可能還是看不太懂,因此接下來除了持續補充原先要在TechEd demo卻沒有demo的範例以外,也會從更基本的部份來跟各位分享!!

Published Monday, November 10, 2008 5:23 PM by Terry Lin
Filed under: ,

Comment Notification

If you would like to receive an email when updates are made to this post, please register here

Subscribe to this post's comments using RSS

Comments

Leave a Comment

(required) 
required 
(required) 

  
Enter Code Here: Required
 
Page view tracker