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 #调试命令窗口 ++++++++++++++++++++++++ ...
随机推荐
- 巧克力王国 BZOJ 2850
巧克力王国 [问题描述] 巧克力王国里的巧克力都是由牛奶和可可做成的.但是并不是每一块巧克力都受王国人民的欢迎,因为大家都不喜欢过于甜的巧克力.对于每一块巧克力,我们设x和y为其牛奶和可可的含量.由于 ...
- elasticsearch起步
elasticsearch教程 elastic入门教程 阮一峰的elasticsearch教程 elasticsearch官网 kibana用户手册 elasticsearch安装步骤 参考:http ...
- 2014湘潭全国邀请赛I题 Intervals /POJ 3680 / 在限制次数下取有权区间使权最大/小问题(费用流)
先说POJ3680:给n个有权(权<10w)开区间(n<200),(区间最多数到10w)保证数轴上所有数最多被覆盖k次的情况下要求总权最大,输出最大权. 思路: 限制的处理:s ...
- 死磕 java同步系列之自己动手写一个锁Lock
问题 (1)自己动手写一个锁需要哪些知识? (2)自己动手写一个锁到底有多简单? (3)自己能不能写出来一个完美的锁? 简介 本篇文章的目标一是自己动手写一个锁,这个锁的功能很简单,能进行正常的加锁. ...
- luogu P1032 字串变换
题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B1.A2 可以变换为 B ...
- 数据库设计三范式(3NF)
问:当时你数据库是如何设计的? 答:当时是按照三范式规范设计的: 第一范式: 1:数据库的原子性,即保证数据库表的每一列都不可分割的 第二范式: 1:原子性,即保证数据库表的每一列都不可分割 2:表中 ...
- synchronized初识
作用域: 1.对象实例内--->People jack = new Jack(); ①此作用域内的synchronized锁 ,可以防止多个线程同时访问这个对象的synchronized方法 ② ...
- Linux索引节点(Inode:no space for device)用满导致的一次故障
问题描写叙述 在storm測试环境集群上上nimbus和supervisor自己主动挂调.重新启动时显示no space for device,也不能创建,加入文件及文件夹,df -h查看 ilesy ...
- Python常用的模块
模块,模块就是封装了特殊功能的代码. 模块分为三种: 自定义模块 第三方模块 内置模块 自定义模块 1.自定义模块 2.模块的导入 python有大量的模块可以使用,再使用之前我们只需要导入模块就可以 ...
- 1.shell编程之变量的高级用法
1.1.变量替换 变量替换的六种形式 实例:非贪婪和贪婪的区别 从头部删除 [root@VM_0_9_centos shell_learn]# var_1="i love you,do yo ...