[ASP.NET Debugging BuggyBits讀書筆記] Lab01 Hang

原帖來自:http://blogs.msdn.com/b/tess/archive/2008/02/06/net-debugging-demos-lab-1-hang-review.aspx oop

1. 打開Tinyget執行  tinyget –srv:localhost –uri:\buggybits\FeaturedProducts.aspx –threads:30 –loop:50 ui

此時tiny將啓動30個線程對指定server的uri路徑發起50個請求。 命令行

2. 在命令行裏切換到WinDbg目錄,執行 adplus –hang –pn w3wp.exe –quiet 以後將會生成一個dump文件。 線程

3. 使用WinDbg打開抓到的.dmp文件。 debug

4. 執行 .loadby sos.dll mscorwks server

5. 執行 ~*e!clrstack (~表明線程,*表明全部,e表明execute,!clrstack表明託管命令clrstack。全部整個命令的意思是在全部線程上執行託管命令!clrstack查看call stack的狀況) 對象

image

能夠推測線程此時運行的狀況是: blog

void GetFeaturedProducts() 資源

{ get

        lock(obj)

        {

                DoSomething();

        }

}

程序pending在了lock這裏,等待獲取該同步塊。

能夠看到不少託管線程都pending在Monitor.Enter這個method這裏,所以懷疑是同步的問題。

5. 執行 !syncblk 查看sync塊:

image

可見這個Syncblk的對象是System.Object類型的,線程22擁有它,等待它的線程有有(47-1)/2=23個。Monitor Held字段裏,擁有的線程計數1,等待的線程計數2.

6. 執行 ~22s切換到該擁有同步塊的線程,查看其在幹什麼。執行 !clrstack

image

可見擁有該程序塊的線程進入了sleep狀態。

7. 查看源代碼,在App_Code裏的DataLayer.cs裏面的GetFeaturedProducts()方法裏有以下的代碼段:

image

20110216添加:

一. 如何斷定多是因爲資源搶佔致使的程序Hang住?

  1. CPU利用率不高 2. 同時打開的頁面越大,hang的狀況越嚴重

相關文章
相關標籤/搜索