下載winsdksetup.exe ,雙擊,選擇
Debugging Tools for Windows
安裝。windows
where sos.dll
找到sos.dll路徑lmf
指令列出當前進程中加載的全部DLL文件和對應的路徑lmvm
查看DLL/EXE文件信息,參數爲某個dll文件名稱.loadby sos mscorwks
指令用於加載.Net 3.5版本及如下模塊.loadby sos clr
指令用於加載.Net 4.0版本及以上模塊SRV*D:\symbols*http://msdl.microsoft.com/download/symbols
.symfix d:\symbols
lmv mclr
查看當前dump所需環境The version of SOS does not match the version of CLR you are debugging?
根據dump來源系統版本從sos下載路徑找到對應版本的mscordacwks.dll、sos.dll下載到本地,並重命名爲mscordacwks.dll、sos.dll,在對應版本的Windbg的安裝路徑下建立目錄,好比下載的是4.0.30319.1026這個版本的sos.dll,就在目錄下建立clr1026文件夾,並將下載的文件放入該目錄,而後執行.load clr1026\sos.dll(注意目錄名),便可加載正確版本的sos。數組
!help sos指令幫助
!threads 顯示全部線程
!threadpool(!tp) 顯示程序池信息
!ProcInfo 顯示進程信息
!dumpheap 顯示託管堆的信息
!dumpheap -stat 檢查當前全部託管類型的統計信息
!dumpheap -type Person –stat 在堆中查找指定類型(person)對象,注意大小寫敏感
!clrstack 顯示調用棧
!clrstack -p 顯示調用棧,同時顯示參數
!clrstack 只顯示託管代碼,而kb只顯示非託管代碼
!dumpobj(!do) 顯示一個對象的內容
!dumparray(!da) 顯示數組
!DumpStackObjects(!dso) 當前線程對象分配過程
!syncblk 顯示同步塊
!runaway 顯示線程cpu時間
!gcroot 跟蹤對象內存引用
!pe 打印異常
!ObjSize 查看對象大小 ObjSize 用於知道對象地址時,查看該對象的大小。
!GCRoot 是一個很是有用的命令,它可以幫助咱們發現某對象上目前還存在的有效引用。這也是爲何GC還不回收這個對象的緣由。這個信息能夠很好的幫助咱們分析那些本應該沒有引用,但卻一直還存在有效引用的對象,由此發現咱們代碼中潛在的內存泄漏,同時咱們也能夠觀察到哪些對象是目前沒有引用了。
~*k 結合~和k命令,來顯示全部線程的callstack
.cls 清屏
kb 顯示當前線程的callstack緩存
-線程池或工做線程集中在某個耗時的工做當中,或者被其餘線程鎖住
核心問題,找到被hang住的線程
!threads
~* e!clrstack
!synblk服務器
-若是與業務量沒有提高,有線程在長時間的處理
核心問題,找到佔用CPU的線程
!runaway 找到佔用CPU的線程
~*e!clrstack工具
兩個鎖A,B,
一個線程已經拿到鎖A,申請鎖B,
另外一個線程已經拿到鎖B,申請鎖A
核心問題:找到鎖定的線程
!threads
!syncblk
~*e!clrstackui
- 將dump文件拖入windbg
- 執行
.loadby sos clr
或.loadby sos mscorwks
加載模塊- 執行
!analyze -v
進行異常分析
- Open Executeable..
- 執行
sxe ld:clrjit
- 執行
g
- 執行
.loadby sos clr
當IIS發生crash或者hang以後,若是有必要獲取此刻的memory dump。咱們必須經過相應的debug tool來得到。相應工具不少。推薦的是windbg。安裝以後,在其folder下,有一個adplus.vbs腳本工具。命令行
dump hang模式下的iis memory:
在command console下面:
key in: adplus -hang -iis -o c:\ Path_to_Put_Files_in -quiet
則系統會listen iis。若是iis發生hang,那麼會自動收集與iis相關的memory保存至Path_to_Put_Files,而後exit.線程
dump crash模式下的iis memory:
在command console下面:
key in: adplus -crash -iis -o c:\ Path_to_Put_Files_in -quiet
則當iis crash的時候,系統會自動收集與iis相關的memery並保存至Path_to_Put_Files,而後exit.debug
!sym noisy
.reload調試