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
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