工具: winbdg
WinDBG不是專門用於調試.Net程序的工具,它更偏向於底層,可用於內核和驅動調試。進行普通的.Net程序調試還是使用微軟專爲.Net開發的調試工具MDBG更方便一些。但是WinDBG能看到更多的底層信息,對於某些特別疑難的問題調試有所幫助,例如內存泄漏等問題。
工具下載: WinBdgTool.zip
測試代碼下載 : MyDumpTest.7z
首先添加設定符號文件路徑(Symbol Path),當你使用Visual Studio編譯程序時,是否有留意到在bin/Debug文件夾下會有.pdb後綴的文件?這些文件包含有dll程序集的調試符號,pdb文件並不包含有執行代碼,只是使調試工具能把代碼執行指令翻譯爲正確的可識別字符。微軟提供了包含大量pdb文件的公共服務器,地址如下:http://msdl.microsoft.com/download/symbols。打開windbg程序,選擇“File->Symbol File Path…“,把下面的內容複製進去保存。srv*c:\temp*http://msdl.microsoft.com/download/symbols。
下面這行命令 如果你發現出現Unable to verify checksum...或者的消息 那是因爲你沒有添加.net的sos擴展或者sos的版本沒有對應上。.Net1.1時代的SOS擴展已經自帶於下載安裝的WinDBG中,從.Net2.0以後,SOS擴展已經自帶到.Net框架中:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\SOS.dll,爲了不至於引起混淆,最好的方法就是使用前面的loadby調試器元命令來讓WinDBG自己決定加載什麼版本的SOS。
添加sos:.load C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\sos.dll。
加載SOS後,使用命令.chain來查看調試鏈中是否已經成功包含SOS擴展。
通過!eeversion查看sos的版本號。
實戰命令: ~ 查看線程
這表明當前dump裏記錄的線程數。如果要切換線程,用波浪線+序號+s來切換,如切換到線程2,那麼用~2s即可。
lm 查看你加載的模塊
kb 查看native code調用棧
用~現在只有線程信息,對於每個線程,在被抓的那一刻,在執行什麼,我們有命令:kb。
看到clr大家應該很眼熟吧。這裏已經可以看到較詳細的調試信息了。
!runaway (查看線程對應 CPU 運行時間)
因爲我們的測試程序是測試的是線程阻塞所以我們選一個運行時間爲0的,例如415
!dso 查看這個堆棧中的對象
!clrstack 查看這個線程的託管代碼調用棧
通過上面我們已經可以看出這個線程一直都是處於阻塞狀態。
到這裏基本上一個小的測試程序可以告一段落了,當然windbg的功能遠遠不止如此,這裏分享一些資源給大家。
資源下載 : WinDbg入門.rar Windbg用法詳解.7z