WinDbg调试高内存的.Net进程Dump
WinDbg的学习路径,艰难曲折,多次研究进展不多,今日有所进展,记录下来。
微软官方帮助文档非常全面:https://msdn.microsoft.com/zh-cn/library/windows/hardware/ff551063(v=vs.85).aspx
问题发现在服务器上,服务器为WinServer2012 R2 x64。其中一个Windows服务,内存高达7G。但此服务,无什么操作,仅仅定时获取数据,更新数据。使用的EntityFramework。用任务管理器,抓包下来,查看。Dump包有7GB之大。
1、准备环境,加载sos.dll===========================
开始调试,首先WinDbg,分为x64和x86版本。由于Dump运行环境,为64位,故WinDbg也应64位,这就要主机调试环境也应64位。我主机环境为win8.1x64。
运行WinDbg,一定要管理员权限。
然后,确认是否已加载sos.dll。使用.chain命令,查看。若未加载,则加载64位的sos.dll。因为Dump是x64位的,故加载x32位不成,会提示
"The call to LoadLibrary(C:\Windows\Microsoft.NET\Framework\v4.0.30319\sos.dll) failed, Win32 error 0n193
"%1 不是有效的 Win32 应用程序。""
sos.dll微软官方帮助文档,https://msdn.microsoft.com/en-us/library/bb190764(v=vs.110).aspx
2、调试===================================
1)、.cls清屏。
2)、!eeheap -gc 查看托管堆,发现2代堆非常大,近2.5G。故确定问题在此。
每个Segment最大255M,begin为起始地址,allocated为结束地址,结束地址减去起始地址等于size,括号里为10进制大小。LOB并不大。
3)、由于dump很大,全分析很慢,故只取一个二代堆的Segment分析。!DumpHeap 000000008f591000
000000009f58ffe0
4)、分析几分钟后,stat统计节显示String类型最大。故再次分析String类型。!DumpHeap -type String
000000008f591000 000000009f58ffe0
5)、发现String类型,有很多4KB字符串,不知什么。进一步分析大字符串,!DumpHeap
-type String -min 1000 000000008f591000 000000009f58ffe0
6)、!do 查看对象,发现String是错误信息。联系之前,此系统确实一直出现报错行为,但不影响使用也就没管。
7)、!gcroot
-all 查看引用 ,此操作也比较慢。发现String是一个对象属性,而对象是EF5的Context表记录。
8)、重复6)、7)步骤,发现都是如此。那么这个Context一直有效,其中内容也就一直被引用。
8)、这时,用IL查看代码,发现确实有个静态的EF的ObjectContext被引用,此对象生命期与进程一致。由于长期运行,加入数据,ObjectContext会一直增加。
关于这个问题,我找了下EF相关文档,似乎没有清理DBContext的命令。
其实,这种操作非常常见,为此,我单独做了测试程序,证明了以上结论。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace ConsoleApplication12
{
class Program
{ static IT_MonitorEntities DB = new IT_MonitorEntities(); static void Main(string[] args)
{
while (true)
{
Console.WriteLine("是否调用Add Y/N");
ConsoleKeyInfo k = Console.ReadKey();
Console.WriteLine("");
if (k.Key == ConsoleKey.Y)
{
Console.WriteLine("Add ");
Add();
}
} } static void Add()
{
for (int i = 0; i < 1000; i++)
{
DB.JobNotifies.Add(new JobNotify()
{
Remark = i.ToString() + " " + invarStr
});
DB.SaveChanges();
}
} static string invarStr = @"你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒
你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒
你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒
你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒
你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒
你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒
你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒你巍峨峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒
你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒
你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒
你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒
你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒你巍峨峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒
你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒
你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒
你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒
你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒你巍峨峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒
你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒
你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒
你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒
你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒你巍峨峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒
你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒
你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒
你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒
你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒你巍峨峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒
你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒
你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒
你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒
你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒你巍峨峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒
你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒
你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒
你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒
你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒你巍峨峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒
你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒
你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒
你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒
你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒你巍峨峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒
你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒
你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒
你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒
你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒你巍峨峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒
你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒
你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒
你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒
你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒你巍峨阿斯顿发地方阿斯顿发啊上帝发誓地方撒"; }
}
3、帮助信息================
1)、WinDbg可使用!help cmd.获取帮助,比如!help dumpheap
2)、可用搜索内存s -u 0x017a1000 0x017c8c78 "朝生暮死"
或搜索内存到底 .foreach (addr { s -[1]u 0x017a1000 0x017c8c78 "朝生暮死"}){du ${addr}}
3)、
WinDbg调试高内存的.Net进程Dump的更多相关文章
- Windbg分析高内存占用问题
1. 问题简介 最近产品发布大版本补丁更新,一商超客户升级后,反馈系统经常奔溃,导致超市的收银系统无法正常收银,现场排队付款的顾客更是抱怨声声.为了缓解现场的情况, 客户都是手动回收IIS应用程序池才 ...
- 利用windbg分析崩溃,句柄泄漏,死锁,CPU高,内存泄漏
Windbg的一些简单使用命令 一.崩溃 1. 输入.ecxr;kbn得到崩溃的堆栈 其中源代码如下 2. 查看堆栈和源代码,发现第0帧导致崩溃,代码也是本地代码 输入.frame 0,切到第0 ...
- (转)解决WinDbg调试Dump文件不同环境mscordacwks.dll版本问题
解决WinDbg调试Dump文件不同环境mscordacwks.dll版本问题 开发人员提交一个dump文件(Windows Server 2008 R2),当前调试环境Windows Serve ...
- Linux OOM-killer 内存不足时kill高内存进程的策略
OOM_killer是Linux自我保护的方式,当内存不足时不至于出现太严重问题,有点壮士断腕的意味 在kernel 2.6,内存不足将唤醒oom_killer,挑出/proc/<pid> ...
- windbg调试C#代码(一)
用windbg调试C#代码是比较麻烦的,因为windbg是针对OS层级的,而C#被CLR隔了一层,很多原生的命令如查看局部变量dv.查看变量类型dt等在CLR的环境中都不能用了.必须使用针对CLR的扩 ...
- windbg调试.net程序
1. 解决线上.NET应用程序的如下问题: 崩溃 CPU高 程序异常 程序Hang死 2. 安装WinDbg: http://msdn.microsoft.com/en-us/windows/hard ...
- WinDbg调试命令汇总
一. 1. !address eax 查看对应内存页的属性 2. vertarget 显示当前进程的大致信息 3 !peb 显示process Environment Block 4. lmvm 可以 ...
- 使用Windbg调试.Net应用程序 [转]
Windbg+Procdump解决w3wp.exe CPU过百问题[转] High CPU Dump收集工具 - ProcDump使用方法[转] ProcDump v9.0[官方] windbg查找c ...
- WinDBG 调试命令大全
转载收藏于:http://www.cnblogs.com/kekec/archive/2012/12/02/2798020.html #调试命令窗口 ++++++++++++++++++++++++ ...
随机推荐
- JS控制背景音乐 没有界面
建立一个HTML5页面,放置<audio>标签,设置音频文件源,设置循环播放.准备两张图片,分别表示开启和暂停背景音乐两种状态,可以点击. <audio id="music ...
- 洛谷P2625 豪华游轮
题目描述 有一条豪华游轮(其实就是条小木船),这种船可以执行4种指令: right X : 其中X是一个1到719的整数,这个命令使得船顺时针转动X度. left X : 其中X是一个1到719的整数 ...
- objective-c中#import和@class的区别
在Objective-C中,可以使用#import和@class来引用别的类型, 但是你知道两者有什么区别吗? @class叫做forward-class, 你经常会在头文件的定义中看到通过@cla ...
- Day 10 Linux nfs && crond(摘)
(摘) 介绍: NFS 是Network File System的缩写,即网络文件系统.一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布.功能是通过网络让不同的机器.不同的操作系 ...
- 有关WebView开发问题(转)
http://blog.sina.com.cn/s/blog_8241e8510101btvk.html 如何创建WebView: 1.添加权限:AndroidManifest.xml中必须使用许可& ...
- 2017 ACM/ICPC 广西邀请赛 题解
题目链接 Problems HDOJ上的题目顺序可能和现场比赛的题目顺序不一样, 我这里的是按照HDOJ的题目顺序来写的. Problem 1001 签到 #include <bits/std ...
- 通过quick2wire使用raspi的i2c和ks103通信
原文:http://www.cnblogs.com/hangxin1940/archive/2013/04/04/2999015.html 之前介绍了如何启用i2c设备 http://www.cnbl ...
- python内存泄露诊断过程记录pyrasite
工具:pyrasite;包含三个命令行 pyrasite / pyrasite-shell / pyrasite-memory-viewer 安装:gdb meliae urwid 说明:Pyrasi ...
- BUPT复试专题—矩阵幂(2012)
https://www.nowcoder.com/practice/31e539ab08f949a8bece2a7503e9319a?tpId=67&tqId=29638&rp=0&a ...
- U盘容纳不了大于4G的文件比如ISO文件咋办?
格式化U盘成NTFS格式就行了,不这么做8,16,32G Upan都容纳不下来.