1. 下载安装Windbg
http://www.windbg.org/ Debugging Tools for Windows 10 (WinDbg) 下载Windows 10 SDK
2. Create Dump File
cpu 使用量过高时,任务管理器找到相应的进程并dump files。
3. Using Windbg 查找Root Cause
打开对应版本的WinDbg, Ctrl+D 打开.DMP文件
!loadby sos clr 加载Son of Strike extension (包含很多有用的debug .net 代码的方法)
!runaway 列出所有的线程及执行用户模式user mode代码的时间。当处理cpu100%问题是,查看一直执行的线程,一般是开头几个。
~线程编号s 选择指定的线程
!CLRStack 查看指定的线程当前正在做什么,找到stuck中的方法
分析问题后,查看对应用户代码,找出问题点
~线程编号s 指定线程
!CLRStack -p 列出stack trace 并且每帧的参数
比如
iPaper.BL.Backend.Modules.Paper.Settings.SettingDescriptionCache.GetAllDescriptions(iPaper.BL.Backend.Infrastructure.PartnerConfiguration.IPartnerConfig)
PARAMETERS:
partnerConfig (0x00000000543ac650) = 0x0000000260a7bd98
左侧的是本地内存指针地址,右侧是变量 实际存储地址。
!do 0x0000000260a7bd98 可以查看到变量的值
参考 https://improve.dk/category/IIS/
!threads 列出托管线程
!threadspool 列出线程池情况
CPU utilization: 0%
Worker Thread: Total: 17 Running: 0 Idle: 17 MaxLimit: 32767 MinLimit: 8
Work Request in Queue: 0
--------------------------------------
Number of Timers: 2
--------------------------------------
Completion Port Thread:Total: 2 Free: 2 MaxFree: 16 CurrentLimit: 2 MaxLimit: 1000 MinLimit: 8
.time 查看CPU使用情况,分析User time
!runaway 查看thread占用时间,对比User time, 找出占用比最高的那个一般是问题点
~线程s 切换到指定线程
k 查看调用堆栈
!clrstack 用SOS列出托管方法调用堆栈
!SaveModule <Base address> <FileName> 若是没有源码,则需要先用!DumpDomain 找到程序集,base Address还可以通过lm命令查看加载的module来获取。 然后保存此model,再反编译dll
参考:https://www.cnblogs.com/lbq1221119/archive/2008/06/17/1224301.html
错误解决
若执行 !clrstack 出现报错
OS Thread Id: 0xbcd24 (35)
Unable to walk the managed stack. The current thread is likely not a
managed thread. You can run !threads to get a list of managed threads in
the process
Failed to start stack walk: 80070057
执行~*e!clrstack查看所有持有和等待锁的线程(的下一条要执行的代码)
https://www.cnblogs.com/javawebsoa/archive/2013/05/20/3089381.html