WinDbG工具实践

WinDBG工具

  • WinDBG用来分析服务器上产生的dump文件信息
  • 处理CPU占满,内存居高不下的问题。
  • 程序死锁的问题

处理步骤

  • 0 查看iis应用程序池对应的进程ID c:\windows\system32\inetsrv\appcmd list wp
    找出w3wp.exe对应的Web应用
    1. 使用producmp 工具监控服务器,当内存占用超过多少时生成dump文件 procdump64 w3wp -ma 20480 -o D:\Dumps (当内存超过20G时生成Dump文件)
    1. 使用windb工具打开dump文件,并设置好符号文件(Symbol文件)及pdb文件的路径,设置代码路径
    1. 使用windb工具的命令进行分析操作
    • 载入sos.dll 执行.load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\SOS.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/

posted @ 2018-11-22 11:01  奋斗2013  阅读(235)  评论(0编辑  收藏  举报