下载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调试