.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跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323375.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

百度开源的分布式唯一ID生成器UidGenerator,解决了时钟回拨问题

转载自 百度开源的分布式唯一ID生成器UidGenerator,解决了时钟回拨问题 UidGenerator是百度开源的Java语言实现,基于Snowflake算法的唯一ID生成器。而且,它非常适合虚拟环境,比如:Docker。另外,它通过消…

nssl1193-地主【dp】

正题 题目大意 一个2∗n2*n2∗n的矩形,求分歌成k块的方案数。 解题思路 我们用fi,j,0/1f_{i,j,0/1}fi,j,0/1​表示前i列,分成j块,第i列是相同一块还是分开的一块。 然后我们分析 (不同颜色表示不同联通块)(字型体汇) 然后推出方程 (f[i][…

MyBatis-generator使用,Example缺少分页问题解决

一、分页问题 MyBatis自动生成代码没有分页功能。 如: public class User {private Integer userId;private String name;public Integer getUserId() {return userId;}public void setUserId(Integer userId) {this.userId userId;}public String getName() {r…

调试 ASP.NET Core 2.0 源代码

在Visual Studio 2017中可以通过符号以及源链接,非常方便对 ASP.NET Core 2.0中源代码进行调试。在这篇文章中,我们将重点介绍如何使用源链接对ASP.NET Core源进行调试。 什么是源链接? 和我一样,您可能已经注意到在编译代码时&am…

html新知

文章目录[x]开门大吉轮播样式账户密码获取回车发送命令(按键)计时器通过按钮实现清屏选项卡(轮播图原型)阶乘密码一致登录导航栏(新学的,,,,,其实就是简单的h…

如何将每日新闻添加到自己博客中,发送到微信群中

大家好,我是雄雄。 前言 最近新整了个博客网站,同事在gitee上找的,还不错,gitee上的地址在这里:拾壹博客管理系统。 别人的业务,再好也有不满足自己的地方,所以我就拉下来源码看了看&#xff0…

Hack for Cloud Beginner微软黑客松大赛

在这美丽的西子湖畔,我们欢迎各行各业的开发者参与此次Hack for Cloud Beginner微软黑客松大赛。我们致力于为开发者们提供在技术、社区领域中的交流平台,重在参与,意于创新。 此次黑客松大赛将于10月22日在中国杭州拉开帷幕,参与…

Asp.Net Core 2.0 多角色权限认证

在使用 WebForm 技术开发网站的时候,微软就提供了 Form 身份认证,这使得登录认证简单了许多,不同于 WebForm 以及后来的 Asp.Net Mvc,Asp.Net Core 中的身份认证与之前相比使用更加便捷,本文介绍 Asp.Net Core 2.0 多角…

html近期所学

导航栏&#xff08;新学的&#xff0c;&#xff0c;&#xff0c;&#xff0c;&#xff0c;其实就是简单的href&#xff09; css 开门大吉 轮播样式 js css js1 js1 js1 js1 js1 js7 首先是css 开门大吉 改只需其中的gif <html><head><style>section{width…

asp.net core后台系统登录的快速构建

登录流程图 示例预览 构建步骤 当然&#xff0c;你也可以直接之前前往coding仓库查看源码&#xff0c;要是发现bug记得提醒我啊~ LoginDemo地址 1. 首先你得有一个项目 2. 然后你需要一个登录页面 完整Login.cshtml视图代码戳这里-共计55行 效果预览图 <!DOCTYPE html>&l…

JavaFX Chart设置数值显示

一、XYChart import javafx.application.Application; import javafx.geometry.NodeOrientation; import javafx.geometry.Side; import javafx.scene.Scene; import javafx.scene.chart.*; import javafx.scene.control.Label; import javafx.stage.Stage;public class LineC…

多多自走棋

文章目录[x]形似麻将种族职业各种搭配操作下面还是讲讲攻略&#xff08;主要&#xff09;在朋友的推荐下玩了自走棋&#xff0c;我一个不玩王者不玩吃鸡的人&#xff0c;玩这游戏竟然上瘾了&#xff0c;太不可思议了&#xff0c;这两天被这游戏搞得中午都没睡好&#xff0c;不得…

Linux--用SecureCRT来上传和下载文件

转载自 Linux--用SecureCRT来上传和下载文件 SecureCRT下的文件传输协议有以下几种&#xff1a;ASCII、Xmodem、Ymodem、Zmodem ASCII&#xff1a;这是最快的传输协议&#xff0c;但只能传送文本文件。 Xmodem&#xff1a;这种古老的传输协议速度较慢&#xff0c;但由于使用…

从头编写 asp.net core 2.0 web api 基础框架 (1)

工具: 1.Visual Studio 2017 V15.3.5 2.Postman (Chrome的App) 3.Chrome (最好是) 关于.net core或者.net core 2.0的相关知识就不介绍了, 这里主要是从头编写一个asp.net core 2.0 web api的基础框架. 我最近几年一直在使用asp.net web api (传统.net framework)作为后台Api, …

美妙的Github

这十天来&#xff0c;一度被自走棋带入了旋涡。没学到什么&#xff0c;但让我惊喜的是&#xff0c;游戏之余&#xff0c;我尝试了下Github。人们都讲Github是程序员的必备&#xff0c;连Github都不知道做什么程序员。玩了github之后我才是知道什么叫大佬。 通常我找源代码都是上…

白嫖之Github

文章目录[x]微信机器人这十天来&#xff0c;一度被自走棋带入了旋涡。没学到什么&#xff0c;但让我惊喜的是&#xff0c;游戏之余&#xff0c;我尝试了下Github。人们都讲Github是程序员的必备&#xff0c;连Github都不知道做什么程序员。玩了github之后我才是知道什么叫大佬。…

layer之弹层组件文档 layui.layer(v.1.9.0之后)

弹层组件文档 - layui.layer layer 至今仍作为 layui 的代表作&#xff0c;她的受众广泛并非偶然&#xff0c;而是这数年来的坚持、不弃的执念&#xff0c;将那些不屑的眼光转化为应得的尊重&#xff0c;不断完善和维护、不断建设和提升社区服务&#xff0c;在 Web 开发者的圈子…

设置宽带自动连接

刚接触电脑的小伙伴有没有这样的困扰&#xff0c;每次电脑开机的时候都要自己手动重新连接宽带&#xff0c;很麻烦。 而通过一些设置我们可以免除这样的麻烦&#xff0c;不需要输入账号密码&#xff0c;开机自动连接&#xff0c;每次开机省去个一两分钟的宽带连接时间&#xf…

随时随地以任意方式编写 .NET 应用程序

希望大家现在都知道&#xff0c;Microsoft .NET 不再仅适用于 Windows。借助 .NET Core&#xff0c;可以使用想要的语言&#xff08;C#、Visual Basic 或 F#&#xff09;编写应用程序&#xff0c;这些应用程序可以在选定的任何 OS&#xff08;Windows、macOS 或 Linux&#xff…

java实现如何定时给微信群中发送消息

大家好&#xff0c;我是雄雄。 前言 前几天&#xff0c;发了一个系列这样的文章&#xff0c;如下所示&#xff1a; java实现每日给女友微信发送早安等微信信息java实现给微信群中定时推送消息如何将每日新闻添加到自己博客中&#xff0c;发送到微信群中 基本都是说的一个事儿…