博客 / 詳情

返回

使用WinDbg調試.net3.5(基於.net2.0)的iis網站程序CPU過高及內存過高的問題

遇到一個用.net3.5(基於.net2.0)版本開發的應用網站,網站啓動後不久,CPU就陷入持續99%-100%的問題。而且一旦開始就停不了,一直這樣。
使用任務管理器生成了內存快照的轉儲文件w3wp.dmp,但使用Visual Studio打開這個轉儲文件,發現不能進行託管代碼(C#代碼)進行調試,也就無法看到C#代碼的調用堆棧,無法分析原因。
最後通過WinDbg成功解決了問題。具體步驟如下:

1、安裝WinDbg。如下:
image.png
image.png
2、啓動要安裝與待調試程序一致的x64或x32版本。
3、File > Open Crash Dump,打開w3wp.dmp文件。
4、在底部運行命令:
.load C:\Windows\Microsoft.NET\Framework64\v2.0.50727\SOS.dll
啓用託管代碼調試。
5、運行命令:
.loadby sos mscorwks
加載.net3.5的運行模塊mscorwks。
6、運行命令:
~*e!dumpstack
查看所有線程棧。

此時就可以看到所以線程當前的運行堆棧了。
然後我發現好幾個線程都停在這:
image.png
根據堆棧分析代碼後,發現是因為沒有加鎖,導致多個線程同時操作了同一個Dictionary對象。.net的Dictionary對象是線程不安全的,很容易導致併發問題,導致在內部死循環,從而Cpu飆滿。

另外補充下,如果是內存佔用過大,可以這樣分析:
前面5步一樣。然後執行!dumpheap -stat可以列舉所有的對象及數目:
image.png
然後執行!dumpheap -min 8196 -mt 000007fe8ca30da8可以查看大小最少為8196的所有String對象,這裏的000007fe8ca30da8對應上圖中的倒數第2行內存地址。
image.png
然後執行!do 00000001bfa6c530 (同樣00000001bfa6c530也是上圖中的地址)即可查看這個對象的信息:
image.png

通過分析大對象和數目過多的對象,可分析內存被佔用的情況。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.