WinDBG工具
- WinDBG用来分析服务器上产生的dump文件信息
- 处理CPU占满,内存居高不下的问题。
- 程序死锁的问题
处理步骤
- 0 查看iis应用程序池对应的进程ID c:windowssystem32inetsrvappcmd list wp
找出w3wp.exe对应的Web应用 -
- 使用producmp 工具监控服务器,当内存占用超过多少时生成dump文件
procdump64 w3wp -ma 20480 -o D:Dumps
(当内存超过20G时生成Dump文件)
- 使用producmp 工具监控服务器,当内存占用超过多少时生成dump文件
-
- 使用windb工具打开dump文件,并设置好符号文件(Symbol文件)及pdb文件的路径,设置代码路径
-
- 使用windb工具的命令进行分析操作
- 载入sos.dll 执行.load C:WindowsMicrosoft.NETFramework64v4.0.30319SOS.DLL 需要根据程序的的版本来选择sos.dll文件的加载路径
- 常用命令分析
!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
https://blogs.msdn.microsoft.com/benjaminperkins/2016/11/07/lab-21-debugging-a-w3wp-process-with-high-memory-consumption/
https://blogs.msdn.microsoft.com/benjaminperkins/2016/06/16/lab-19-debugging-a-high-cpu-hang-w3wp-process-using-windbg/