Windbg程序調試是.Net高級開發須要掌握的必備技能,分析內存泄露、分析高CPU、分析線程阻塞、分析內存對象、分析線程堆棧、Live Dedugging。這個領域能夠說一個技能+場景化應用的結合,若是單學Windbg命令,不理解實際Troubleshooting中的做用,是沒有意義的。因此,準備搞個系列文章,3~5篇,分享給你們:html
工欲善其事必先利其器,咱們先從經常使用的命令和示例提及。windows
1. 先準備一個Dump文件,建議使用64位應用程序。例如:64位IIS應用的w3wp進程,64位exe進程均可以。若是抓Dump文件,很簡單:任務管理器-進程-右鍵【建立轉儲文件】數組
2. 下載並安裝Windbg,下載連接:https://developer.microsoft.com/zh-cn/windows/downloads/windows-10-sdk,一路下一步,選擇【Debugging Tools for Windows】spa
打開以後,Ctrl+D,打開第一步抓的Dump文件,開始今天的經常使用命令介紹。插件
1. 加載SOS調試擴展dll線程
.loadby sos clr
2. 設置並從新加載調試符號文件的命令,將.Net 一些重要的pdb文件下載到指定的路徑中,加載到Windbg調試環境中,這樣,咱們就能夠看到程序在哪一行出錯,運行到哪一行了調試
1 .symfix+ C:\symbols 2 .reload
3. 打印當前調試符號文件搜索路徑code
0:000> .sympath
4. 查看線程池,分析並確認CPU使用率,可使用哪一個指令htm
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還支持Mex擴展插件,能夠參考我博客中的連接:
接下來,我會之內存泄露的場景,給你們分享Windbg分享的思路和方法。
周國慶
2018/10/28