石家庄企业自助建站,外贸建站模版,阿里巴巴如何做网站,手机网站 标题长度在生产环境中#xff0c;通过运行日志我们会发现一些异常问题#xff0c;此时#xff0c;我们不能直接拿VS远程到服务器上调试#xff0c;同时日志输出的信息无法百分百反映内存中对象的状态#xff0c;比如说我们想查看进程中所有的Socket连接状态、服务路由信息等等。 即… 在生产环境中通过运行日志我们会发现一些异常问题此时我们不能直接拿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位操作系统选择的WindbgX64 第三步CtrlD打开刚才抓取的Dump文件 第四步加载调试用的SOS.dll: .loadby sos clr .loadby sos clr 第五步查看内存中指定类型的对象 !dumpheap -Type Socket 这里的Socket是具体的类型我们要查看Socket连接状态所以类型是Socket 这里的Header中MTMethod Table 我们需要用的MT00007ffafe50d700 第六步查看内存所有所有的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_IsConnected0 即可找出连接断开的Socket对象然后进一步用!gcroot 查看这个对象的引用关系再一步一步看各个引用对象的信息就可以大致分析了。 原文地址http://www.cnblogs.com/tianqing/p/7630636.html.NET社区新闻深度好文微信中搜索dotNET跨平台或扫描二维码关注