使用WinDBG调试查看C#内存转储文件
有时候我们想查看一个正在运行的程序内存中的数据,可以在任务管理器将内存状态保存为转储文件,并使用WinDBG验证,这里我们来试试:
0.安装WinDBG

1.首先写个代码用来测试
一个class
public class MyClass
{
public int AintValue = 123;
public static int BintValue = 456;
public string AstringValue = "AAA";
public static string BstringValue = "BBB";
}
在main中引用
Console.WriteLine($"ret={d1(1)}");
MyClass MC = new MyClass();
MC.AstringValue = "SuperAAAA";
Console.ReadKey(true);//程序会停在这,这时候保存文件
Console.Write(MC.AstringValue);
2.编译运行以后,到任务管理器保存内存转储文件

3.用WinDBG打开转储文件
点这里:

这里,然后选文件:

这里需要注意的是:
32位的WinDBG用来调试32位的程序dump文件,
64位的WInDBG用来调试64位的程序dump文件,
如果你跟我一样用的是UWP版的WinDBG,那只能调试64位的(一定有办法能调32位的,但我不知道,如果你知道,请回复,感谢~)
4:在内存中搜索我们要查看的对象类型

我们可以看到中间有个命令输入框:

首先输入两个命令,加载两个.net调试相关文件:
.load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\SOS.dll
.load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
notice:中间有个目录是Framework64,如果是调试32位程序,改为Framework

加载成功.
在上面的C#代码中,我们声明了一个类 MyClass ,并实例化了它,现在我们要找到它,在windbg里,搜索类有两种方式:
1:根据类名 (有可能重复)
2:根据MT(Methot Table,唯一)
刚开始是不知道MT的,所以根据类名搜索:
!dumpheap -type MyClass
notice:"!dumpheap -type"这部分不验证大小写,后面类名会验证大小写

返回的内容,第一块是类的实例列表,第二块是对象列表(有时候名字很像的对象也会在这里)
可以看到我们的对象只有一个,第一列是MT,如果你搜索出了多个,可以根据MT搜索:
!DumpHeap -mt 00007ff9fc0a7488
5:查看对象信息
从实例列表中可以看到这个类只有1个实例,数据格式是:
内存地址 MT 占用内存长度
我们可以从内存地址,查看这个实例的详细信息:
!DumpObj /d 000002331f11bed0
notice:DumpObj 可以简写为do

可以看到下面列出了对象的所有属性.包括静态的,动态的.
值类型的属性直接显示了值
引用类型的属性给出了引用地址
对于string类型,我们还要再进一步:
!DumpObj 000002331f112f18

就可以看到字符串值了,如果是byte[]数据,可以直接用 "dd 内存起点 内存终点" 进行查看,如果想解析成字符串可以用du命令(u表示按unicode解析)
dd 000002331f112f18+c 000002331f112f18+c+53
du 000002331f112f18+c 000002331f112f18+c+8
字符串数据前12个字节是字符串的属性,所以要过掉

使用WinDBG调试查看C#内存转储文件的更多相关文章
- 内存转储文件调试系统崩溃bug
百度百科:内存转储文件 内存转储是用于系统崩溃时,将内存中的数据转储保存在转储文件中,供给有关人员进行排错分析用途.而它所保存生成的文件就叫做内存转储文件. 内存转储文件也被称作虚拟内存,它是用硬盘里 ...
- 如何删除Windows 10中的内存转储文件
内存转储文件是由Windows产生的.以下情况下可能产生内存转储文件: 计算机崩溃蓝屏 内存错误 硬件问题 内存转储文件包含计算机系统崩溃时的详细的参数副本.用于帮助识别导致系统崩溃的原因.Windo ...
- 内存转储文件 Memory.dmp
https://baike.sogou.com/v63435711.htm?fromTitle=内存转存文件 内存转储是用于系统崩溃时,将内存中的数据转储保存在转储文件中,供给有关人员进行排错分析用途 ...
- linux 查看cpu 内存 硬盘 文件夹大小
文件夹大小 显示cpu使用率 top 1 查看CPU 1.1 查看CPU个数 # cat /proc/cpuinfo | grep "physical id" | uniq | w ...
- WinDbg调试.NET程序入门
俗话说:万事开头难! 自从来到新公司遇到性能问题后,需要想办法解决这个问题,但是一直没有合适的性能分析工具,然后找到StevenChennet 大神帮忙,他用WinDbg工具远程帮我分析了一个 dum ...
- WinDbg调试.NET
WinDbg调试.NET程序入门 俗话说:万事开头难! 自从来到新公司遇到性能问题后,需要想办法解决这个问题,但是一直没有合适的性能分析工具,然后找到StevenChennet 大神帮忙,他用WinD ...
- 如何使用Microsoft的驱动程序验证程序解释无法分析的崩溃转储文件
这篇文章解释了如何使用驱动程序验证工具来分析崩溃转储文件. 使用Microsoft驱动程序验证工具 如果您曾经使用Windows的调试工具来分析崩溃转储,那么毫无疑问,您已经使用WinDbg打开了一个 ...
- 在x64计算机上捕获32位进程的内存转储
这是一个我经常遇到的问题,我们经常会遇到这样的情况:我们必须重新捕获内存转储,因为内存转储是以“错误”的方式捕获的.简而言之:如果在64位计算机上执行32位进程,则需要使用允许创建32位转储的工具捕获 ...
- 获取JVM转储文件的Java工具类
在上期文章如何获取JVM堆转储文件中,介绍了几种方法获取JVM的转储文件,其中编程方法是里面唯一一个从JVM内部获取的方法.这里就不演示了其他方法获取正在运行的应用程序的堆转储,重点放在了使用编程来获 ...
随机推荐
- 【Beta】Daily Scrum Meeting——Day5
站立式会议照片 1.本次会议为第五次Meeting会议: 2.本次会议在早上9:35,在陆大2楼机房召开,本次会议为25分钟讨论今天要完成的任务以及接下来的任务安排. 燃尽图 每个人的工作分配 成 员 ...
- 201521123038 《Java程序设计》 第七周学习总结
201521123038 <Java程序设计> 第七周学习总结 1. 本周学习总结 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 ...
- 201521123023《java程序设计》第四周学习总结
1. 本周学习总结 思维导图 常规: (1)抽象类:不能被直接实例化.只能作为其它类的父类,这一点与final类正好相反.用关键词abstract声明. (2)继承:只能有一个父类,即单继承,子类继承 ...
- 201521123037 《Java程序设计》第10周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 创建自己的异常 1.自定义异常要继承已有的异常,需要手动throw异常:根据继承的异常不同以及具体情况,选择 ...
- 201521123044 《Java程序设计》第9周学习总结
1. 本章学习总结 2. 书面作业 本次PTA作业题集异常 1.常用异常题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代码中经常出现什么异常.需要捕获吗(为什么)?应如何避免 ...
- JS严格模式
如何开启严格模式? 在js中,只需要在顶部添加"use strict",即可进入严格模式 在函数中加上"use strict"编辑指示,也可以指定函数在严格模式 ...
- python2/python3 内存中打包/压缩文件
python2:(包含压缩选项,如果只打包,可以调整zipfile.ZIP_DEFLATED) import zipfile import StringIO class InMemoryZip(obj ...
- python之socket编程------粘包
一.粘包 什么是粘包 只有TCP只有粘包现象,UDP永远不会粘包 所谓粘包问题主要还是因为接收方不知道之间的界限,不知道一次性提取多少字节的数据所造成的 两种情况发生粘包: 1.发送端需要等缓冲区满才 ...
- Hibernate第二篇【API讲解、执行流程图】
前言 从上一篇中已经大致介绍了Hibernate并且有了一个快速入门案例的基础了,-.本博文主要讲解Hibernate API 我们看看快速入门案例的代码用到了什么对象吧,然后一个一个讲解 publi ...
- 短视频图像处理 OpenGL ES 实践
2017年,短视频正以其丰富的内容表现力和时间碎片化的特点,快速崛起,而短视频最具可玩性之处就在支持人脸识别的动态贴图和各种不同效果的美颜.滤镜等.那短视频动态贴纸.滤镜.美颜等功能究竟是如何实现的呢 ...