在生产环境中如果出现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
可以用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程序,也可以用于其他语言开发的程序,在后面的文章会介绍具体怎么分析使用。写作水平有限,欢迎留言斧正,并欢迎留言讨论。