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 #调试命令窗口 ++++++++++++++++++++++++ ...
随机推荐
- Subsequence(hdu 3530)
题意:给你一个长度为n的数列,要求一个子区间,使得区间的最大值与最小值的差s满足,m<=s<=k,求满足条件的最长子区间 /* 单调队列 我们可以用单调队列分别维护最大值和最小值 当差值大 ...
- STL学习笔记(一) 容器
0.前言随机访问迭代器: vector.string.dequeSTL的一个革命性的方面就是它的计算复杂性保证 条款01:慎重选择容器类型 c++提供的容器:标准STL序列容器:vector.stri ...
- AtCoder Regular Contest 074F - Lotus Leaves
$n \leq 300,m \leq 300$,$n*m$的格子里有起点有终点有空地有障碍,人会从起点选一个同行或同列空地跳过去,然后一直这样跳到终点.求至少删掉多少格子使得人跳不到终点. 首先S和T ...
- bootstrap-datatables
刚写到datatimepicker的时候想到这个问题. 这可以说是我接触到的第一个功能如此齐全的一款依赖型插件.我把依赖于别人库的插件这么称呼. 首先上官网:http://datatables.clu ...
- 标准C程序设计七---27
Linux应用 编程深入 语言编程 标准C程序设计七---经典C11程序设计 以下内容为阅读: <标准C程序设计>(第7版) 作者 ...
- Laravel5.1的控制器分组
Laravel5.1的控制器分组 默认的控制器时直接在app\Http\Controllers下,创建分组名字,路由配置使用:分组名\控制器名@方法名.
- 洛谷——P1141 01迷宫
P1141 01迷宫 题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任 ...
- 一步步走向国际乱码大赛-- 恶搞C语言
大家都一直强调规范编码.可是这个世界上有个大师们娱乐的竞赛--国际乱码大赛. 能写出来的都是对语言深入了解的master.我从没想自己也能"恶搞"C,一直都是老老实实编码.就在前几 ...
- BUPT复试专题—树查找(2011)
https://www.nowcoder.com/practice/9a10d5e7d99c45e2a462644d46c428e4?tpId=67&tqId=29641&rp=0&a ...
- [scrapy]Item Loders
Items Items就是结构化数据的模块,相当于字典,比如定义一个{"title":"","author":""},i ...