1. 下載安裝Windbghtml
http://www.windbg.org/ Debugging Tools for Windows 10 (WinDbg) 下載Windows 10 SDKjava
2. Create Dump Fileweb
cpu 使用量太高時,任務管理器找到相應的進程並dump files。spa
3. Using Windbg 查找Root Cause.net
打開對應版本的WinDbg, Ctrl+D 打開.DMP文件線程
!loadby sos clr 加載Son of Strike extension (包含不少有用的debug .net 代碼的方法)debug
!runaway 列出全部的線程及執行用戶模式user mode代碼的時間。當處理cpu100%問題是,查看一直執行的線程,通常是開頭幾個。指針
~線程編號s 選擇指定的線程htm
!CLRStack 查看指定的線程當前正在作什麼,找到stuck中的方法blog
分析問題後,查看對應用戶代碼,找出問題點
~線程編號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