.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 内存对象分析的整个过程,分享给大家。

分析Net 内存对象的更多相关文章

  1. .Net 内存对象分析

    在生产环境中,通过运行日志我们会发现一些异常问题,此时,我们不能直接拿VS远程到服务器上调试,同时日志输出的信息无法百分百反映内存中对象的状态,比如说我们想查看进程中所有的Socket连接状态.服务路 ...

  2. JVM 基础:回收哪些内存/对象 引用计数算法 可达性分析算法 finalize()方法 HotSpot实现分析

    转自:https://blog.csdn.net/tjiyu/article/details/53982412 1-1.为什么需要了解垃圾回收 目前内存的动态分配与内存回收技术已经相当成熟,但为什么还 ...

  3. MemCache分布式内存对象缓存系统

    MemCache超详细解读 MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而 ...

  4. Memcached源码分析之内存管理

    先再说明一下,我本次分析的memcached版本是1.4.20,有些旧的版本关于内存管理的机制和数据结构与1.4.20有一定的差异(本文中会提到). 一)模型分析在开始解剖memcached关于内存管 ...

  5. iOS的内存分析和内存管理

    iOS的内存分析和内存管理 [内存管理]一直是iOS开发中的一个重点. 本文就带你从内存分析开始一步步了解内存的占用情况,从真实的情况中领悟真正项目开发过程中的内存的使用情况. 注:本文默认你熟悉 M ...

  6. 分析 ThreadLocal 内存泄漏问题

    ThreadLocal 的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度.但是如果滥用 ThreadLocal,就可能会导 ...

  7. 使用MAT分析Java内存

    Overview MAT(Memory Analyzer Tool) 是一个JAVA Heaper分析器,可以用来分析内存泄露和减少内存消耗.分析Process showmap中的/dev/ashme ...

  8. 大数据学习--day13(字符串String--源码分析--JVM内存分析)

    字符串String--源码分析--JVM内存分析 String 类的对象 , 是不可变的字符串对象呢 这个不可变很重要,之后要讲的intern()也离不开它的不可变性. https://www.cnb ...

  9. [转]一次使用Eclipse Memory Analyzer分析Tomcat内存溢出

    一次使用Eclipse Memory Analyzer分析Tomcat内存溢出 前言 在平时开发.测试过程中.甚至是生产环境中,有时会遇到OutOfMemoryError,Java堆溢出了,这表明程序 ...

随机推荐

  1. Linux智能手机安全策略研究

    Linux智能手机安全策略研究 http://www.zdnet.com.cn    本文是继从“窃听门”事件解读手机Rootkit攻击(http://chenguang.blog.51cto.com ...

  2. 51Nod 1006 最长公共子序列Lcs问题 模板题

    给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为:   abcicba abdkscab   ab是两个串的子序列,abc也是,abca也是,其中abca是这两个 ...

  3. [Redux-Observable && Unit testing] Testing the output of epics

    Epics can be unit-tested just like any other function in your application - they have a very specifi ...

  4. ubuntu mysql 无法启动 简单排查

    自己的站点非常久没有去上了,想打开发现竟然打不开了.所以就找了一系列的原因. vps不行了 dns解析出问题了 域名出问题了 简单排查之后,我的vps服务商用的是 ***(bandwagonhost) ...

  5. Intent调用系统拍照程序,返回图片太小的问题

    之前採用的方式(返回的照片会被压缩,不能达到预期效果): Intent intent = new Intent(); Intent intent_camera = getPackageManager( ...

  6. jquery js解析函数、函数直接调用

    ----------------------------------------------------------------- cc = function(){alert(345)}, pushS ...

  7. 洛谷P3273 [SCOI2011]棘手的操作

    题目描述 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作:U x y: 加一条边,连接第x个节点和第y个节点A1 x v: 将第x个节点的权 ...

  8. Monkey服务器命令

  9. Appium_python3 抓取客户端toast

    在客户端登录或者退出登录的时候会有吐司提示,因此需要抓取来验证用户登录成功或者注销成功: 在获取toast之前需要添加   desired_caps['automationName'] = 'Uiau ...

  10. HDU 3584 Cube (三维树状数组)

    Problem Description Given an N*N*N cube A, whose elements are either 0 or 1. A[i, j, k] means the nu ...