下載winsdksetup.exe 他挎,雙擊,選擇
Debugging Tools for Windows
安裝捡需。
- 64位系統(tǒng)抓64位進(jìn)程dump办桨,用64位windbg來分析。64位系統(tǒng)抓32位進(jìn)程dump站辉,用32位windbg來分析
- 用VS命令行執(zhí)行
where sos.dll
找到sos.dll路徑 -
SOS does not support the current target architecture
這個錯誤的原因是用了32位的任務(wù)管理器抓的32位的dump文件呢撞。
需要用64位的任務(wù)管理器抓32位的dump文件(C:\Windows\SysWOW64\taskmgr.exe) -
lmf
指令列出當(dāng)前進(jìn)程中加載的所有DLL文件和對應(yīng)的路徑 -
lmvm
查看DLL/EXE文件信息,參數(shù)為某個dll文件名稱 - 使用
.loadby sos mscorwks
指令用于加載.Net 3.5版本及以下模塊 - 使用
.loadby sos clr
指令用于加載.Net 4.0版本及以上模塊 - 指定symbol search path 設(shè)置符號服務(wù)器與符號緩存
SRV*D:\symbols*http://msdl.microsoft.com/download/symbols
也可以在命令行執(zhí)行
.symfix d:\symbols
-
lmv mclr
查看當(dāng)前dump所需環(huán)境
The version of SOS does not match the version of CLR you are debugging?
根據(jù)dump來源系統(tǒng)版本從sos下載路徑找到對應(yīng)版本的mscordacwks.dll饰剥、sos.dll下載到本地殊霞,并重命名為mscordacwks.dll、sos.dll汰蓉,在對應(yīng)版本的Windbg的安裝路徑下創(chuàng)建目錄绷蹲,比如下載的是4.0.30319.1026這個版本的sos.dll,就在目錄下創(chuàng)建clr1026文件夾古沥,并將下載的文件放入該目錄瘸右,然后執(zhí)行.load clr1026\sos.dll(注意目錄名),即可加載正確版本的sos岩齿。
常用命令
!help sos指令幫助
!threads 顯示所有線程
!threadpool(!tp) 顯示程序池信息
!ProcInfo 顯示進(jìn)程信息
!dumpheap 顯示托管堆的信息
!dumpheap -stat 檢查當(dāng)前所有托管類型的統(tǒng)計信息
!dumpheap -type Person –stat 在堆中查找指定類型(person)對象太颤,注意大小寫敏感
!clrstack 顯示調(diào)用棧
!clrstack -p 顯示調(diào)用棧,同時顯示參數(shù)
!clrstack 只顯示托管代碼盹沈,而kb只顯示非托管代碼
!dumpobj(!do) 顯示一個對象的內(nèi)容
!dumparray(!da) 顯示數(shù)組
!DumpStackObjects(!dso) 當(dāng)前線程對象分配過程
!syncblk 顯示同步塊
!runaway 顯示線程cpu時間
!gcroot 跟蹤對象內(nèi)存引用
!pe 打印異常
!ObjSize 查看對象大小 ObjSize 用于知道對象地址時龄章,查看該對象的大小吃谣。
!GCRoot 是一個非常有用的命令,它能夠幫助我們發(fā)現(xiàn)某對象上目前還存在的有效引用做裙。這也是為什么GC還不回收這個對象的原因岗憋。這個信息可以很好的幫助我們分析那些本應(yīng)該沒有引用,但卻一直還存在有效引用的對象锚贱,由此發(fā)現(xiàn)我們代碼中潛在的內(nèi)存泄漏仔戈,同時我們也可以觀察到哪些對象是目前沒有引用了。
~*k 結(jié)合~和k命令拧廊,來顯示所有線程的callstack
.cls 清屏
kb 顯示當(dāng)前線程的callstack
線程Hang住的常見原因
-線程池或工作線程集中在某個耗時的工作當(dāng)中监徘,或者被其他線程鎖住
核心問題,找到被hang住的線程
!threads
~* e!clrstack
!syncblk
CPU高
-如果與業(yè)務(wù)量沒有提升吧碾,有線程在長時間的處理
核心問題凰盔,找到占用CPU的線程
!runaway 找到占用CPU的線程
~*e!clrstack
線程死鎖出現(xiàn)的情況:
兩個鎖A,B倦春,
一個線程已經(jīng)拿到鎖A户敬,申請鎖B,
另一個線程已經(jīng)拿到鎖B睁本,申請鎖A
核心問題:找到鎖定的線程
!threads
!syncblk
~*e!clrstack
調(diào)試dump步驟
- 將dump文件拖入windbg
- 執(zhí)行
.loadby sos clr
或.loadby sos mscorwks
加載模塊- 執(zhí)行
!analyze -v
進(jìn)行異常分析
調(diào)試exe文件步驟
- Open Executeable..
- 執(zhí)行
sxe ld:clrjit
- 執(zhí)行
g
- 執(zhí)行
.loadby sos clr
如何在IIS crash或者h(yuǎn)ang時候尿庐,dump 所有與IIS相關(guān)的memory?
當(dāng)IIS發(fā)生crash或者h(yuǎn)ang之后,如果有必要獲取此刻的memory dump添履。我們必須通過相應(yīng)的debug tool來獲得屁倔。相應(yīng)工具很多。推薦的是windbg暮胧。安裝之后,在其folder下问麸,有一個adplus.vbs腳本工具往衷。
dump hang模式下的iis memory:
在command console下面:
key in: adplus -hang -iis -o c:\ Path_to_Put_Files_in -quiet
則系統(tǒng)會listen iis。如果iis發(fā)生hang严卖,那么會自動收集與iis相關(guān)的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
則當(dāng)iis crash的時候席舍,系統(tǒng)會自動收集與iis相關(guān)的memery并保存至Path_to_Put_Files,然后exit.
!sym noisy
.reload