.Net 内存对象分析
在生产环境中,通过运行日志我们会发现一些异常问题,此时,我们不能直接拿VS远程到服务器上调试,同时日志输出的信息无法百分百反映内存中对象的状态,比如说我们想查看进程中所有的Socket连接状态、服务路由信息等等。
即:如何分析.Net 运行时内存对象?
所以,今天我们推荐.Net进阶必备神器:Windbg,基于Windbg分析内存中对象的状态。
还是以实际场景为例吧,这样可以更加贴合实际应用,同时更有借鉴意义。
业务场景:分布式环境下,各个服务容器进程中缓存了各个服务的Socket连接信息,方便运行时服务间相互访问。但是网络是偶尔要抖动的,在抖动的一瞬间,很多Socket连接便中断了,服务调用方收到的异常信息便是:连接已中断等。
如何快速定位到哪些Socket连接是中断的?这些中断的Socket连接是连接的哪些服务器、端口?这些信息可以帮助我们分析具体的网络问题,同时做一些程序上的补偿:连接重建。一个目标,保持程序的高可用性!
那么,请出我们今天的主角:Windbg,微软的官方介绍:
http://windbg.org/
进一步说,我们需要抓取指定进程某一瞬间的内存镜像,然后使用Windbg分析内存中各种对象、线程、线程池、析构队列、堆、CPU内核时间片等的状态。
因此,第一步,我们需要对要进行内存分析的进程,抓取一个Full Dump文件:内存镜像文件。
任务管理器->选择进程->创建转储文件
系统会将Dump文件存储在指定的目录,这个目录需要拷贝一下,以备用。
第二步,从下面路径下载并安装Windbg:
https://developer.microsoft.com/en-us/windows/hardware/download-windbg
请根据操作系统的位数,选择X86或者X64。这里我们用的64位操作系统,选择的Windbg(X64)
第三步:Ctrl+D,打开刚才抓取的Dump文件
第四步:加载调试用的SOS.dll: .loadby sos clr
.loadby sos clr
第五步:查看内存中指定类型的对象
!dumpheap -Type Socket
这里的Socket是具体的类型,我们要查看Socket连接状态,所以类型是Socket
这里的Header中MT=Method Table
我们需要用的MT:00007ffafe50d700
第六步,查看内存所有所有的Socket对象的地址:
!dumpheap -mt 00007ffafe50d700
输出结果中,第一列是某一个Socket对象的内存地址
此时,我们可以使用下面的命令,随机查看一个Socket对象的信息:
!do 000001b2d188ae00
!do 的意思:!dumpObj
那么问题来了,几百个Socket对象,如果一个一个!do查看,这工作量太大了! 当然不能这么干,Windbg有.foreach命令
搜索Debugging help.chm文档,.foreach给了个样例:
.foreach /f ( place "g:\myfile.txt") { dds place }
即,循环遍历一个文本文件,对每一行数据,执行一个命令操作。
好,我们回到我们上一步的输出中:每个Socket对象的地址列表,我们拷贝出来,用文本编辑工具只取出第一列(Socket地址列),保存成1.txt
第七步:循环遍历查看每个内存对象
.foreach /f (adr "C:\1.txt") {!do adr}
输出:
将所有的输出,拷贝到文本编辑器中,搜索查询指定的属性,例如m_IsConnected=0, 即可找出连接断开的Socket对象,然后进一步用!gcroot 查看这个对象的引用关系,再一步一步看各个引用对象的信息就可以大致分析了。
原文地址:http://www.cnblogs.com/tianqing/p/7630636.html
.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注
.Net 内存对象分析相关推荐
- jmap, jhat, jvisualvm:java堆内存对象分析利器
转载自 jmap, jhat, jvisualvm:java堆内存对象分析利器 jmap -help查看命令用法. jmap -heap <pid> 查看堆使用情况. jmap -dump ...
- python查看对象占用内存_『Python』内存分析_List对象内存占用分析
list声明后结构大体分为3部分,变量名称--list对象(结构性数据+指针数组)--list内容,其中id表示的是list对象的位置, v引用变量名称,v[:]引用list对象,此规则对python ...
- php 在对象中递归 坑,PHP_PHP对象递归引用造成内存泄漏分析,通常来说,如果PHP对象存在递 - phpStudy...
PHP对象递归引用造成内存泄漏分析 通常来说,如果PHP对象存在递归引用,就会出现内存泄漏.这个Bug在PHP里已经存在很久很久了,先让我们来重现这个Bug,示例代码如下: class Foo { f ...
- Linux内存技术分析(下)
Linux内存技术分析(下) 五. 内存使用场景 out of memory 的时代过去了吗?no,内存再充足也不可任性使用. 1.内存的使用场景 · page管理 · slab(kmalloc.内存 ...
- Linux内存技术分析(上)
Linux内存技术分析(上) 一.Linux存储器 限于存储介质的存取速率和成本,现代计算机的存储结构呈现为金字塔型.越往塔顶,存取效率越高.但成本也越高,所以容量也就越小.得益于程序访问的局部性原理 ...
- android释放acitity内存,Android 内存泄漏分析与解决方法
在分析Android内存泄漏之前,先了解一下JAVA的一些知识 1. JAVA中的对象的创建 使用new指令生成对象时,堆内存将会为此开辟一份空间存放该对象 垃圾回收器回收非存活的对象,并释放对应的内 ...
- ARMS V4.3发布,应用监控全新支持内存快照分析,全息排查等功能。
信息摘要: ARMS V4.3发布,应用监控全新支持内存快照分析,全息排查等功能. 适用客户: 企业开发和运维人员. 版本/规格功能: 1. 支持内存快照分析,内存对象分布一览无遗,内存泄露秒级定位. ...
- JVM 调优实战--jmap的使用以及内存溢出分析
目录 jmap的使用以及内存溢出分析 查看内存使用情况 查看内存中对象数量及大小 将内存使用情况dump到文件中 通过jhat对dump文件进行分析 通过MAT工具对dump文件进行分析 MAT介绍 ...
- 一次.net托管内存泄露分析
简介:一次.net托管内存泄露分析 最近协助分析了一个.net进程内存泄露的问题,过程分享给大家. 症状:客户的服务端.net进程出现分钟级的cpu抖动,接近100%后落回. 图1 分析:支持同学通过 ...
最新文章
- 无线路由器结合Windows Radius Server实现通过域账户连接公司无线网络
- java pkcs1转pkcs8_.NET Core RSA密钥的xml、pkcs1、pkcs8格式转换和JavaScript、Java等语言进行对接...
- 皮一皮:现在知道公司老说信息完整的重要性...
- EMLOG复制网站文字提醒弹窗源码美化版
- emui内核支持kvm吗_KVM虚拟化详解
- 图像分类中数据增强的有效性
- IP组播之组播路由算法
- c语言不用的行参警告,如何在C语言中禁止“未使用的参数”警告?
- linux内存源码分析 - 内存回收(匿名页反向映射)
- 图解设计模式-Facade模式
- 学生对计算机老师评价,浅谈初中计算机专业老师如何对学生进行多元化评价(3页)-原创力文档...
- pandownload如何使用cookie登录百度网盘账号
- 云片网短信模版自定义变量的替换内容
- 上海软件工程师工资待遇调查
- TAGE Branch Predictor/分支预测
- 火焰焰心matlab,火焰的形貌-中性焰、碳化焰、氧化焰
- TensorFlow下用自己的数据训练Fater-RCNN
- day 32 css后续补充以及js 简单入门
- FL Studio2023水果完整中文版音乐制作软件
- ESP01 连接OneNet平台