.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 查看这个对象的引用关系,再一步一步看各个引用对象的信息就可以大致分析了。

以上就是.Net 内存对象分析的整个过程,分享给大家。

最新文章

  1. Print a Binary Tree in Vertical Order
  2. 使用Fragment的两种方式:<fragment>与<FrameLayout>
  3. python __file__ 与相对路径
  4. 【jmeter】逻辑控制器
  5. [HDOJ2586]How far away?(最近公共祖先, 离线tarjan, 并查集)
  6. [mac git 服务器端]
  7. 怎么查看window7的.net framework的版本
  8. Cell自适应高度及自定义cell混合使…
  9. # Java Queue系列之PriorityQueue
  10. 【CSS3】transition过渡和animation动画
  11. java基础知识-算术运算符和赋值运算符
  12. 网络虚拟化(SDN,NFV..)和企业骨干网的演化
  13. ICLR 2014 International Conference on Learning Representations深度学习论文papers
  14. exec-maven-plugin配置及使用
  15. 跟着太白老师学python 09day 初识函数
  16. Luogu 4245 【模板】任意模数NTT
  17. Codeforces 500 E. New Year Domino
  18. mac 上配置 maven
  19. [转载]Process工具类,提供设置timeout功能
  20. HTML5 Canvas 画钟表

热门文章

  1. 搭建 Nginx 静态网站
  2. css3--根据数据加载显示的一个动画
  3. 小米开源文件管理器MiCodeFileExplorer-源码研究(5)-AsyncTask异步任务
  4. 洛谷 P1981 表达式求值
  5. Makefile 文件格式
  6. actionMode - 在屏幕中的显示位置设置
  7. thinkphp最简单路由
  8. Bean复制的几种框架性能比较(Apache BeanUtils、PropertyUtils,Spring BeanUtils,Cglib BeanCopier)
  9. Eclipse&STS常用小技巧
  10. 如果输入的不是英文字母或者数字或者汉字,则返回false