最近在公司知道有一個好工具可以進行分析,名稱為WinDbg,所以我就拿這個問題來小試身手,我將安裝步驟與解決方法列於下方,再請大家多多參考。
1、下載 WinDbg 工具
1-1. 先至微軟的官方網站下載,此工具分成兩個版本,一個是32位元,一個是64位元,基本上這不是取絕於你的OS為何,而是你要除錯的程式為32位元還是64位元,那要如何分辨呢?最簡單的方式就是透過工作管理員確認即可。
下載網址:
http://msdn.microsoft.com/en-us/windows/hardware/gg463009
2、重現應用程式卡住的情況,然後進行下列的動作,收集dump files。
2-1. 確認應用程式執行的是32還是64位元的。
2-2. 啟動一個命令視窗,切換至安裝目錄下:
- x32 -> C:\Program Files (x86)\Debugging Tools for Windows (x86)
- x64 -> C:\Program Files\Debugging Tools for Windows (x64)
2-3. 由於我的應用程式是Hang的情況,所以請執行下列的指令:
adplus.exe -hang -quiet -pn fund.vshost.exe -o c:\dumps
參數說明:
- -hang 執行adplus在Hang的模式。
- -o 指定輸出路徑
- -quiet 不跳出快顯視窗
- -pn 指定應用程式的名稱
3、設定 WinDbg 的環境
3-1. 開啟 windbg 之後,選擇 [File] -> [Symbol File Path]
3-2. 在開啟的視窗中輸入下列的資訊:
SRV*c:\websymbols*http://msdl.microsoft.com/download/symbols
4、分析 Dump Files
4-1 開啟 WinDbg
4-3. 輸 [k] 觀察程式中 stack的狀態,輸入後你會發現出現許多的 mscorwks 這也代表您的應用程式是執行在.Net之下。
4-4. 由於我們觀察 .Net的相關記憶體與物件資料,所以需要載入 sos.dll,請在命令視窗中輸入下列的指令。
.loadby sos mscorwks
4-5. 載入後我們 透過下列的指令來確認目前.net 中 stack的情況。
~*e!clrstack
4-6. 透過4-5的指令可能會列出許多的資訊,請仔細觀察後,終於找到卡住的地方,也就是下列紅色圈起來的地方,主要是卡在 [set_page_property],因為這個函式中有一個迴圈會不斷的等待執行緒的回傳,我作了兩個動作,一是初使值的設定,二是等待超過1分鐘就強迫停止這一個執行緒的資料捉取,所以改完後問題就解決了。
PS:在上圖中有一個箭頭由下往上,主要指的是由於這是一個stack的資料結構,所以你可以看出是由 Update_basic() -> external_company() -> set_page_property(),藉以了解執行的順序。
參考連結:
WinDbg Command-Line Options
http://msdn.microsoft.com/en-us/library/ff561306(v=vs.85).aspx
SOS.dll (SOS Debugging Extension)
http://msdn.microsoft.com/en-us/library/bb190764.aspx
Debugging Tools and Symbols: Getting Started
http://msdn.microsoft.com/en-us/windows/hardware/gg462988