Windbg程式除錯系列1-常用命令說明&Mex擴充套件使用總結
Windbg程式除錯是.Net高階開發需要掌握的必備技能,分析記憶體洩露、分析高CPU、分析執行緒阻塞、分析記憶體物件、分析執行緒堆疊、Live Dedugging。這個領域可以說一個技能+場景化應用的結合,如果單學Windbg命令,不理解實際Troubleshooting中的作用,是沒有意義的。
工欲善其事必先利其器,我們先從常用的命令和示例說起。
1. 先準備一個Dump檔案,建議使用64位應用程式。例如:64位IIS應用的w3wp程序,64位exe程序都可以。如果抓Dump檔案,很簡單:工作管理員-程序-右鍵【建立轉儲檔案】
開啟之後,Ctrl+D,開啟第一步抓的Dump檔案,開始今天的常用命令介紹。
1. 載入SOS除錯擴充套件dll
.loadby sos clr
2. 設定並重新載入除錯符號檔案的命令,將.Net 一些重要的pdb檔案下載到指定的路徑中,載入到Windbg除錯環境中,這樣,我們就可以看到程式在哪一行出錯,執行到哪一行了
1 .symfix+ C:\symbols 2 .reload
3. 列印當前除錯符號檔案搜尋路徑
0:000> .sympath
4. 檢視執行緒池,分析並確認CPU使用率,可以使用哪個指令
0:000> !threadpool CPU utilization: 2% Worker Thread: Total: 19 Running: 2 Idle: 17 MaxLimit: 32767 MinLimit: 4 Work Request in Queue: 0 -------------------------------------- Number of Timers: 2 -------------------------------------- Completion Port Thread:Total: 4 Free: 4 MaxFree: 8 CurrentLimit: 4 MaxLimit: 1000 MinLimit: 4
5. 檢視執行緒的整體執行情況
!threads
6. 查詢指定執行緒的呼叫堆疊,例如34號執行緒
~34s
!clrstack
7. 檢視執行緒消耗CPU資源情況
!runaway
第一列是執行緒號,第二列是Total的CPU使用時間
8. 檢視當前執行緒棧上所有物件的資訊,Dump stack objects
!dso
9. 查詢記憶體中指定物件的資訊 Dump object
!do
10. 查詢記憶體中指定陣列物件的資訊 Dump Array
!da
11. 檢視當前執行緒的堆疊和每行堆疊上的變數資訊
!clrstack -a
12. Windbg 附加程序除錯,啟用CLR異常捕獲、檢視異常、檢視異常所線上程堆疊、禁用CLR異常除錯、退出除錯
sxe clr g !pe !clrstack sxd clr qd
13. 檢視託管堆上記憶體物件的分佈、三個代的資訊
!eeheap -gc
14. 檢視託管堆上載入的Dll
!eeheap -loader
15. 什麼是記憶體物件代提升,垃圾回收中未回收的物件也稱為倖存者,並會被提升到下一代。通過代提升的情況,可以分析物件的存活時間
16. 查詢記憶體中各類物件的總個數和總記憶體佔用
!dumpheap -stat
17. 查詢記憶體中大物件的個數和物件大小
!dumpheap -stat -mt -min 85000
18. 檢視記憶體的析構佇列的指令
!finalizequeue
19. 請輸入檢視物件000000123557DFC0的gcroot的指令
!gcroot 000000123557DFC0
20. 檢視執行緒阻塞的指令
!syncblk
21. 檢視Dump中所有System.Net.Sockets.Socket物件統計資訊的指令
!dumpheap -type System.Net.Sockets.Socket -stat
------------------------------------------------------------------------------------------------------------------------------------------------------------
最近一直在頻繁使用Windbg做線上Dump除錯,與微軟做Case交流的時候,發現微軟CSS團隊,用了一個非常效率的Windbg 外掛,Mex:
使用介紹:
https://blogs.msdn.microsoft.com/luisdem/2016/07/19/mex-debugging-extension-for-windbg-2/
下載地址:
https://www.microsoft.com/en-us/download/details.aspx?id=53304
下載之後,解壓縮,有兩個目錄,X64和X86,大家根據自己的需要進行載入,目前我們主要用X64。當然也可以直接把這個擴充套件拷貝到Windbg執行目錄中。
這裡,我們先show一下Windbg載入mex擴充套件:
0:000> .load D:\Mex\x64\mex.dll Mex External 3.0.0.7172 Loaded!
當然,我們可以同時繼續載入sos
0:000> .loadby sos clr
檢視已經載入的擴充套件:
如果本機除錯Dump,建議設定除錯符號的路徑:
srv*c:\symcache*http://msdl.microsoft.com/download/symbols;c:\symcache
檢視Mex的各種命令:
0:000> !mex.help Mex currently has 255 extensions available. Please specify a keyword to search. Or browse by category:
大家可以逐一點進去看一下。
這裡我給大家show幾個常用的命令:
1. !dae 檢視所有的Exception
2. 檢視所有的執行緒狀態
!mex.mthreads
3. !clrstack2 查詢執行緒堆疊
4. do2 檢視物件
5. 檢視所有的Asp.Net請求
!mex.aspxpagesext
6. 檢視當前執行緒的異常
!mex.pe2
7. Foreach
!foreachobject -x
"!do2 @#Obj"
System.Net.Socke