在生产环境中,通过运行日志我们会发现一些异常问题,此时,我们不能直接拿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 内存对象分析相关推荐

  1. jmap, jhat, jvisualvm:java堆内存对象分析利器

    转载自 jmap, jhat, jvisualvm:java堆内存对象分析利器 jmap -help查看命令用法. jmap -heap <pid> 查看堆使用情况. jmap -dump ...

  2. python查看对象占用内存_『Python』内存分析_List对象内存占用分析

    list声明后结构大体分为3部分,变量名称--list对象(结构性数据+指针数组)--list内容,其中id表示的是list对象的位置, v引用变量名称,v[:]引用list对象,此规则对python ...

  3. php 在对象中递归 坑,PHP_PHP对象递归引用造成内存泄漏分析,通常来说,如果PHP对象存在递 - phpStudy...

    PHP对象递归引用造成内存泄漏分析 通常来说,如果PHP对象存在递归引用,就会出现内存泄漏.这个Bug在PHP里已经存在很久很久了,先让我们来重现这个Bug,示例代码如下: class Foo { f ...

  4. Linux内存技术分析(下)

    Linux内存技术分析(下) 五. 内存使用场景 out of memory 的时代过去了吗?no,内存再充足也不可任性使用. 1.内存的使用场景 · page管理 · slab(kmalloc.内存 ...

  5. Linux内存技术分析(上)

    Linux内存技术分析(上) 一.Linux存储器 限于存储介质的存取速率和成本,现代计算机的存储结构呈现为金字塔型.越往塔顶,存取效率越高.但成本也越高,所以容量也就越小.得益于程序访问的局部性原理 ...

  6. android释放acitity内存,Android 内存泄漏分析与解决方法

    在分析Android内存泄漏之前,先了解一下JAVA的一些知识 1. JAVA中的对象的创建 使用new指令生成对象时,堆内存将会为此开辟一份空间存放该对象 垃圾回收器回收非存活的对象,并释放对应的内 ...

  7. ARMS V4.3发布,应用监控全新支持内存快照分析,全息排查等功能。

    信息摘要: ARMS V4.3发布,应用监控全新支持内存快照分析,全息排查等功能. 适用客户: 企业开发和运维人员. 版本/规格功能: 1. 支持内存快照分析,内存对象分布一览无遗,内存泄露秒级定位. ...

  8. JVM 调优实战--jmap的使用以及内存溢出分析

    目录 jmap的使用以及内存溢出分析 查看内存使用情况 查看内存中对象数量及大小 将内存使用情况dump到文件中 通过jhat对dump文件进行分析 通过MAT工具对dump文件进行分析 MAT介绍 ...

  9. 一次.net托管内存泄露分析

    简介:一次.net托管内存泄露分析 最近协助分析了一个.net进程内存泄露的问题,过程分享给大家. 症状:客户的服务端.net进程出现分钟级的cpu抖动,接近100%后落回. 图1 分析:支持同学通过 ...

最新文章

  1. 无线路由器结合Windows Radius Server实现通过域账户连接公司无线网络
  2. java pkcs1转pkcs8_.NET Core RSA密钥的xml、pkcs1、pkcs8格式转换和JavaScript、Java等语言进行对接...
  3. 皮一皮:现在知道公司老说信息完整的重要性...
  4. EMLOG复制网站文字提醒弹窗源码美化版
  5. emui内核支持kvm吗_KVM虚拟化详解
  6. 图像分类中数据增强的有效性
  7. IP组播之组播路由算法
  8. c语言不用的行参警告,如何在C语言中禁止“未使用的参数”警告?
  9. linux内存源码分析 - 内存回收(匿名页反向映射)
  10. 图解设计模式-Facade模式
  11. 学生对计算机老师评价,浅谈初中计算机专业老师如何对学生进行多元化评价(3页)-原创力文档...
  12. pandownload如何使用cookie登录百度网盘账号
  13. 云片网短信模版自定义变量的替换内容
  14. 上海软件工程师工资待遇调查
  15. TAGE Branch Predictor/分支预测
  16. 火焰焰心matlab,火焰的形貌-中性焰、碳化焰、氧化焰
  17. TensorFlow下用自己的数据训练Fater-RCNN
  18. day 32 css后续补充以及js 简单入门
  19. FL Studio2023水果完整中文版音乐制作软件
  20. ESP01 连接OneNet平台

热门文章

  1. 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX
  2. (三)java的数据类型
  3. windows下编译firefox
  4. Primes on Interval
  5. MD5计算,一个扩展类,哪里都能用
  6. 字节前端终于开源!吹爆!
  7. 浅析 Dapr 里的云计算设计模式
  8. Blazor+Dapr+K8s微服务之服务调用
  9. 你的密码已泄露!使用C#阻止弱密码
  10. ASP.NET Core 5.0 Web API 自动集成Swashbuckle