Windbg程序調試系列1-經常使用命令說明&示例

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-Mex擴展使用總結

 

接下來,我會之內存泄露的場景,給你們分享Windbg分享的思路和方法。

 

周國慶

2018/10/28

相關文章
相關標籤/搜索