1. 程式人生 > >Windbg程式除錯系列1-常用命令說明&Mex擴充套件使用總結

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