.NET事后调试基础之抓取内存数据的方法

在生产环境中如果出现bug,分析程序运行的内存数据也是找出bug的好方法,不过需要开发者懂点更低级的语言。下面介绍几种方法:

一、dotnet-dump

    借助 dotnet-dump 工具,可以抓取内存,可以运行 SOS 命令来分析崩溃和垃圾回收器 (GC)。.

安装方法是用命令安装,打开CMD输入命令,如下:

dotnet tool install -g dotnet-dump

使用方法是打开cmd,输入如下命令后回车,抓取的数据会自动保存到C盘:

dotnet-dump collect --process-id 1000 #1000为进程ID

.NET事后调试基础之抓取内存数据的方法

可以用windbg打开文件进行分析。

二、adplus.exe

Windows Kits下自带的分析工具,在C:\Program Files (x86)\Windows Kits\10\Debuggers\x64目录下。

使用方法是打开CMD,进入目录下,运行输入命令:adplus.exe -crash -pn 进程名 -o dump文件输出目录。与dotnet-dump类似。

三、procdump

procdump功能就比较强大了,不但可以抓取分析内存,还可以监视CUP峰值情况。

安装方法,下载包即可安装,网址:

https://download.sysinternals.com/files/Procdump.zip

使用示例

编写名为“记事本”的进程小型转储 (只有一个匹配项可以存在) :

C:\>procdump 记事本

使用 PID “4572”编写进程的完整转储:

C:\>procdump -ma 4572

在名为“记事本”的进程之间编写 3 个小型转储 5 秒:

C:\>procdump -s 5 -n 3 记事本

在 5 秒内超过 20% 的 CPU 使用率时,最多写 3 个名为“usage”的进程小型转储:

C:\>procdump -c 20 -s 5 -n 3 使用

为名为“hang.exe”的进程编写一个小型转储,当其中一个进程Windows超过 5 秒时无响应:

C:\>procdump -h hang.exe hungwindow.dmp

当系统 CPU 总使用率超过 20% 10 秒时,写入名为“outlook”的进程的小转储:

C:\>procdump outlook -p “\Processor (_Total) \% Processor Time” 20

当Outlook的句柄计数超过 10,000 时,写入名为“outlook”的进程的完整转储:

C:\>procdump -ma outlook -p “\Process (Outlook) \Handle Count” 10000

当 Microsoft Exchange 信息Microsoft Store出现未经处理的异常时,请编写 MiniPlus 转储:

C:\>procdump -mp -e store.exe

在不编写转储的情况下显示异常代码/w3wp.exe的名称:

C:\>procdump -e 1 -f “” w3wp.exe

如果异常的代码/名称包含“NotFound”,请编写一个小型转储w3wp.exe:

C:\>procdump -e 1 -f NotFound w3wp.exe

启动进程,然后监视其异常:

C:\>procdump -e 1 -f “” -x c:\dumps consume.exe

详情请访问:https://docs.microsoft.com/zh-cn/sysinternals/downloads/procdump

在linux

linux下运行内存抓取需要开启ulimit 

ulimit -c # 查看是否支持内存抓取0为不支持 unlimited支持

ulimit -c unlimited # 开启

抓取内存转储的小编知道的有 procdump,gcore两种,procdump的用法跟windows相同,推荐大家使用

结语

本文介绍了几种抓取应用内存数据转存的方法,这些工具不但可以用于.NET程序,也可以用于其他语言开发的程序,在后面的文章会介绍具体怎么分析使用。写作水平有限,欢迎留言斧正,并欢迎留言讨论。