WINDBG学习

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

原文地址:https://www.cnblogs.com/dennysong/p/10980531.html