用Windbg来分析.Net程序的CPU高、内存高问题

1. WinDbg

WinDbg是微软发布的一款相当优秀的源码级(source-level)调试工具,可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件。WinDbg可以查看源代码、设置断点、查看变量, 查看调用堆栈及内存情况。Dump文件是进程的内存镜像, 可以把程序的执行状态通过调试器保存到dump文件中。
Windbg可以解决内存高、CPU高、程序异常、程序Hang死 问题;

2. 使用windbg进行调试分析的方式

抓取进程的dump文件,使用windbg分析dump

注意:抓取进程的dump文件的方式有两种:
一种是简单的使用任务管理器进程右键进程,点击创建转储文件,系统会自动抓取和保存,保存完成会弹出对话框提示保存路径。
另一种是在命令行中用ProcDump 工具进行抓取生成dump文件。下面为一条语句为示例:
procdump -ma -c 0 -s 3 -n 1 402668 -o D:\dumps


用Windbg来分析.Net程序的CPU高、内存高问题_第1张图片
image.png

-ma 生成full dump, 即包括进程的所有内存. 默认的dump格式包括线程和句柄信息.
-c 在CPU使用率到达这个阀值的时候, 生成dump文件.
-s CPU阀值必须持续多少秒才抓取dump文件.
-n 在该工具退出之前要抓取多少个dump文件.
-o dump文件保存目录.
402668为进程的ID,可替换为程序名称

ProcDump 工具 工具的下载地址:https://technet.microsoft.com/en-us/sysinternals/dd996900

3. 安装windbg

下载:选择对应的工具包下载
https://docs.microsoft.com/zh-cn/windows-hardware/drivers/download-the-wdk

用Windbg来分析.Net程序的CPU高、内存高问题_第2张图片
image.png

安装:

点击安装,可选择安装的工具,通常只选择windbg就可以。安装之后在debuggers文件夹下选择32位或64位程序运行。

设置:

打开windbg之后,需要设置symbol path,可以按快捷键Ctrl+S。把下面的路径粘贴进去保存。系统进行dump解析等操作的时候会自动下载需要的符号表
srvc:\symcache http://msdl.microsoft.com/download/symbols;c:\symcache;

用Windbg来分析.Net程序的CPU高、内存高问题_第3张图片
image.png

4. 解析dump

通过windbg的菜单,File—>Open Crash Dump选择dump文件打开。打开成功界面如下图所示:


用Windbg来分析.Net程序的CPU高、内存高问题_第4张图片
image.png

注意:
基本命令:
? 获取命令提示
D 查看内存信息
K 观察栈
~ 显示和控制线程 ~number s number为线程id 如:~1s为获取1号线程的上下文
Q 退出
!runaway 查看线程占用cpu时间,可看出哪个线程占用时间最高(所有线程)
.dump /ma E:/dumps/myapp.dmp 抓取dump

.net 相关的命令
!peb或!dlls 列出进程已经加载的dll
!threadpool 查看当前CPU状况 线程数等等
!dumpheap –stat 统计堆信息
!Threads 所有托管线程 -special Crl创建的线程
!clrstack 看看这个线程再干嘛 执行那些方法
!clrstack –p addr addr:具体方法的参数值地址
!do 地址 查看参数值
!analyze –v 显示分析的详细信息
.reload /i /f 强制重新加载pdb

内存调试
!eeheap –gc 获取gc中内存信息
!eeheap –loader Loader 堆信息
!dumpheap –stat 统计GC堆的信息,统计GC堆上存活的对象
!dumpheap -mt <> 查看该地址上的对象
!gcroot <<对象地址>> 查看对象根
!dumpheap -type <> 查看string类型在堆中的信息
!helproot -查看gcroot的帮助

在解析.Net程序时首先要加载运行环境framework版本对应的SOS.DLL:

.load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\SOS.DLL

你可能感兴趣的:(用Windbg来分析.Net程序的CPU高、内存高问题)