使用Windbg的dump等命令分析.Net程序的CPU高、内存高,死锁系列问题

-- 使用Windbg 的dump等命令分析.Net程序的CPU高、内存高,死锁等问题
【官网】:https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/debugger-download-tools#small-windbg-preview-logo-download-wi

应用场景

WinDbg是一个Windows下对用户态/内核态的程序进行调试,以及对Core Dump文件的分析。对于Crash,内存泄露,CPU占用过高,线程死锁等问题的分析,Windbg是一个很强的,无法使用vs时的神器。

基础资源

使用须知

WinDbg使用须知: 1)确定主机和目标--调试器在主机系统上运行,您要调试的代码在目标系统上运行。 2)确定是进行内核模式调试还是用户模式调试. 3)选择你的调试器环境(visual studio or windbg). 4)如何连接目标主和主机. 5)选择 32 位或 64 位调试工具 6)配置符号. 7)配置源码 8)熟悉调试器操作. 9)熟悉调试技术. 10)使用调试器参数命令。11)针对特定技术使用调试扩展。 12)了解windows内部 .

配置步骤

A)WinDbg下载.

a1)Win10对应的下载地址:

step1)点击下列地址.

Download Debugging Tools for Windows 10


step2)点击[下载安装程序]


step3)安装winsdksetup.exe,仅选择"Debuging tools for windows".


step4)启动WinDbg.


a2)Win7: 使用Windbg需要通过Windows SDK下载.


Microsoft Windows SDK for Windows 7 and .NET Framework 4

[注]其余步骤参考Win10下的操作步骤。


 




   

常见问题

  • 创建转储文件失败,dump字节数为0
    【解决方案】因为待Dump分析的目标程序可能不是64位的,为了确定需要编译时指定x64位
  • !threads没有响应
    【解决方案】有时电脑比较慢会延时几秒
  • SOS does not support the current target architecture
    【解决方案】方案1)区分C:WindowsSystem32TaskMgr.exe 和 C:WindowsSysWOW64 askmgr.exe 方案2)使用其它的转储工具,例如:ProcessExplorer
  • The call to LoadLibrary(C:WindowsMicrosoft.NETFramework64v4.0.30319sos.dll) failed, Win32 error 0n193 %1 不是有效的 Win32 应用程序。
    【解决方案】windbg没有使用64位的,如果是win10则建议使用:C:Program Files (x86)Windows Kits10Debuggers64WinDbg.exe

快速入门

A)WinDbg应用分析示例。

a1)查找cpu占用高的程序及位置。

附命令:

.load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\SOS.dll
.load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
.loadby sos clr
!threads  //列出线程
!runaway   //查看当前托管线程已执行时间
~~[3b34]s  //切换到指定线程:3b34,是osid
!clrstack  //查看调用堆栈



a2)查找内存泄漏的程序及位置。

附命令:

.loadby sos clr
!threads
!dumpheap -stat  //查看clr的托管堆中的各个类型的占用情况
!DumpHeap /d -mt 00007ff8272059c0  //查看当前的方法表
!DumpObj /d 000001ceb7b964b0 //查看当前char[]的内容
查看存储的具体内容即可分析大概位置
!gcroot 000001ceb7b964b0 查看当前地址的Root。。。


参考资料