[更新]使用WinDbg分析转储文件 找出C#程序内存占用过大的原因

作者:V君 发布于:2015-9-15 14:37 Tuesday 分类:填坑经验

TL;DR: 

1)打开windbg载入dmp

2).loadby sos mscorwks

3)!dumpheap -stat 

你写的程序你估计就知道为啥了


扯扯:

这次不是进程崩溃, 是另一个服务进程内存占用异常的大 , 超过4GB

原因诊断十分顺利, 然并卵,

因为某个环节需要调用第三方服务接口来解析数据,

这个接口似乎承受不住请求密度, 出现严重延迟现象

进程内部队列一直堆积着, 内存就撑大了 _(:з」∠)_


参考来源 调试内存泄漏问题的一些经验 by Dawei XU

 

After.Ps:
另一种方式,使用 sosex 下载来丢windbg旁边
1).load sosex
2)!sosex.mfrag -stat

参考来源 debugging.io


继续补充:

当不是你写的程序, 然而你又看到大量String而不知所措时

先用!strings命令来刷刷内存中的字符串, 适当的时候按暂停, 不然会卡死你

然后总结一下内容,看看有没有大片有规律的字符串

使用 !gcroot 每行前面的地址查看是什么地方引用了它 (参考来源: theartofdev.com

再进一步: !mdt 出来的根对象地址, 如果是List<T> 还可以查看内容哟

顺着items进去,点击 expand first 40 items, 嗯嗯 这下真相大白啦

(我不会说之前的人真是丧心病狂, 60多万行1G以上内容,

居然直接查询出来放到内存里面去挨个处理) ‘皿’

标签: 软件开发 C# 调试技术 windbg

引用地址:

发表评论:

Powered by emlog 去你妹的备案 sitemap