服务器上如果出现cpu内存饱满,找不到原因,那么dump文件分析必不可少。
起初是想在linux下调试.net core 的dump,但是环境一直无法安装 搞了许久没搞出来,其次文章太少了,google几页都变紫色了,园友大佬知道可以给小弟解惑下几个问题。
- Linux分析高版本的.net core必须是要lldb3.9.0 这个就很烦了。我的linux的centos7.4。没有现成的可以下载,只能自己编译。编译数小时最终发现并没有安装成功,大佬们有没有脚本能直接安装lldb3.9.0。开始都是按照https://www.cnblogs.com/calvinK/p/9263696.html 文章来,结果失败了,没有报错。也感谢这个博主帮助了解决不少问题。
- .net core console可以创建dump文件,但是asp.net core 无法创建dump文件,官方issue:https://github.com/dotnet/coreclr/issues/21484。 官方解决后,合并到了release 2.2. 也就是说我自己还要编译corelcr。而这个coreclr编译也需要特定版本基本也是3.9.0 https://github.com/dotnet/coreclr/blob/master/Documentation/building/linux-instructions.md 。
Windows下.net core dump分析
- 下载工具windbg 地址:https://www.microsoft.com/zh-cn/p/windbg-preview/9pgjgd53tn86?SilentAuth=1&rtc=1&activetab=pivot:overviewtab
-
Dump文件:任务管理;选择w3wp.exe;右键;创建转储文件 这里项目用core的一个console项目举例 代码如下
- 用windbg打开dump文件
-
注意:framework和.net core都有提供相应版本的sos.dll,在load加载到windbg的时候请选择正确的地址,这里加载进去时2.2.1版本。
插件介绍:https://docs.microsoft.com/en-us/dotnet/framework/tools/sos-dll-sos-debugging-extension
-
加载完毕使用!help 查看是否加载成功,并查看命令介绍
-
查找线程 !threads
-
指定线程 ~{线程编号}s 例如22号线程:~22s 。 查找该线程的堆栈信息 !clrstack
-
利用!dumpheap 查找所有gc中所有的对象占用内存的大小并且排序。 (可以利用!help dumpheap 查看相关介绍)
-
利用 !dumpheap -min 85000 查看LOH对象来判断内存泄漏的对象 LOH 对象介绍:https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/large-object-heap
这里测试项目没有该对象
-
利用!dumpheap -strings 来查看指定对象在应用中的使用 这里用string 举例
-
利用!dumpheap -type Console 查看指定类型 在应用中的使用 这里用console举例
-
利用!do {线程编号}来查看该改对象在这个线程中的使用
还有很多的命令,再补充