1. 程式人生 > >Windbg程式除錯系列1-常用命令說明&示例

Windbg程式除錯系列1-常用命令說明&示例

Windbg程式除錯是.Net高階開發需要掌握的必備技能,分析記憶體洩露、分析高CPU、分析執行緒阻塞、分析記憶體物件、分析執行緒堆疊、Live Dedugging。這個領域可以說一個技能+場景化應用的結合,如果單學Windbg命令,不理解實際Troubleshooting中的作用,是沒有意義的。所以,準備搞個系列文章,3~5篇,分享給大家:

工欲善其事必先利其器,我們先從常用的命令和示例說起。

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: 4Work 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還支援Mex擴充套件外掛,可以參考我部落格中的連結:

接下來,我會以記憶體洩露的場景,給大家分享Windbg分享的思路和方法。

周國慶

2018/10/28