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

0.安装WinDBG

1.首先写个代码用来测试

一个class

  1. public class MyClass
  2. {
  3. public int AintValue = 123;
  4. public static int BintValue = 456;
  5. public string AstringValue = "AAA";
  6. public static string BstringValue = "BBB";
  7. }

在main中引用

  1. Console.WriteLine($"ret={d1(1)}");
  2. MyClass MC = new MyClass();
  3. MC.AstringValue = "SuperAAAA";
  4. Console.ReadKey(true);//程序会停在这,这时候保存文件
  5. Console.Write(MC.AstringValue);

2.编译运行以后,到任务管理器保存内存转储文件

3.用WinDBG打开转储文件

点这里:



这里,然后选文件:

这里需要注意的是:

32位的WinDBG用来调试32位的程序dump文件,

64位的WInDBG用来调试64位的程序dump文件,

如果你跟我一样用的是UWP版的WinDBG,那只能调试64位的(一定有办法能调32位的,但我不知道,如果你知道,请回复,感谢~)

4:在内存中搜索我们要查看的对象类型



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

首先输入两个命令,加载两个.net调试相关文件:

  1. .load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\SOS.dll
  2. .load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll

notice:中间有个目录是Framework64,如果是调试32位程序,改为Framework

加载成功.

在上面的C#代码中,我们声明了一个类 MyClass ,并实例化了它,现在我们要找到它,在windbg里,搜索类有两种方式:

1:根据类名 (有可能重复)

2:根据MT(Methot Table,唯一)

刚开始是不知道MT的,所以根据类名搜索:

  1. !dumpheap -type MyClass

notice:"!dumpheap -type"这部分不验证大小写,后面类名会验证大小写



返回的内容,第一块是类的实例列表,第二块是对象列表(有时候名字很像的对象也会在这里)

可以看到我们的对象只有一个,第一列是MT,如果你搜索出了多个,可以根据MT搜索:

  1. !DumpHeap -mt 00007ff9fc0a7488

5:查看对象信息

从实例列表中可以看到这个类只有1个实例,数据格式是:

内存地址 MT 占用内存长度

我们可以从内存地址,查看这个实例的详细信息:

  1. !DumpObj /d 000002331f11bed0

notice:DumpObj 可以简写为do



可以看到下面列出了对象的所有属性.包括静态的,动态的.

值类型的属性直接显示了值

引用类型的属性给出了引用地址

对于string类型,我们还要再进一步:

  1. !DumpObj 000002331f112f18



就可以看到字符串值了,如果是byte[]数据,可以直接用 "dd 内存起点 内存终点" 进行查看,如果想解析成字符串可以用du命令(u表示按unicode解析)

  1. dd 000002331f112f18+c 000002331f112f18+c+53
  2. du 000002331f112f18+c 000002331f112f18+c+8

字符串数据前12个字节是字符串的属性,所以要过掉

使用WinDBG调试查看C#内存转储文件的更多相关文章

  1. 内存转储文件调试系统崩溃bug

    百度百科:内存转储文件 内存转储是用于系统崩溃时,将内存中的数据转储保存在转储文件中,供给有关人员进行排错分析用途.而它所保存生成的文件就叫做内存转储文件. 内存转储文件也被称作虚拟内存,它是用硬盘里 ...

  2. 如何删除Windows 10中的内存转储文件

    内存转储文件是由Windows产生的.以下情况下可能产生内存转储文件: 计算机崩溃蓝屏 内存错误 硬件问题 内存转储文件包含计算机系统崩溃时的详细的参数副本.用于帮助识别导致系统崩溃的原因.Windo ...

  3. 内存转储文件 Memory.dmp

    https://baike.sogou.com/v63435711.htm?fromTitle=内存转存文件 内存转储是用于系统崩溃时,将内存中的数据转储保存在转储文件中,供给有关人员进行排错分析用途 ...

  4. linux 查看cpu 内存 硬盘 文件夹大小

    文件夹大小 显示cpu使用率 top 1 查看CPU 1.1 查看CPU个数 # cat /proc/cpuinfo | grep "physical id" | uniq | w ...

  5. WinDbg调试.NET程序入门

    俗话说:万事开头难! 自从来到新公司遇到性能问题后,需要想办法解决这个问题,但是一直没有合适的性能分析工具,然后找到StevenChennet 大神帮忙,他用WinDbg工具远程帮我分析了一个 dum ...

  6. WinDbg调试.NET

    WinDbg调试.NET程序入门 俗话说:万事开头难! 自从来到新公司遇到性能问题后,需要想办法解决这个问题,但是一直没有合适的性能分析工具,然后找到StevenChennet 大神帮忙,他用WinD ...

  7. 如何使用Microsoft的驱动程序验证程序解释无法分析的崩溃转储文件

    这篇文章解释了如何使用驱动程序验证工具来分析崩溃转储文件. 使用Microsoft驱动程序验证工具 如果您曾经使用Windows的调试工具来分析崩溃转储,那么毫无疑问,您已经使用WinDbg打开了一个 ...

  8. 在x64计算机上捕获32位进程的内存转储

    这是一个我经常遇到的问题,我们经常会遇到这样的情况:我们必须重新捕获内存转储,因为内存转储是以“错误”的方式捕获的.简而言之:如果在64位计算机上执行32位进程,则需要使用允许创建32位转储的工具捕获 ...

  9. 获取JVM转储文件的Java工具类

    在上期文章如何获取JVM堆转储文件中,介绍了几种方法获取JVM的转储文件,其中编程方法是里面唯一一个从JVM内部获取的方法.这里就不演示了其他方法获取正在运行的应用程序的堆转储,重点放在了使用编程来获 ...

随机推荐

  1. 团队作业8——第二次项目冲刺(Beta阶段)--5.25 5th day

    团队作业8--第二次项目冲刺(Beta阶段)--5.25 fifth day Day five: 会议照片 项目进展 Beta冲刺的第四天,以下是今天具体任务安排: 队员 昨天已完成的任务 今日计划完 ...

  2. 团队作业8——第二次项目冲刺(Beta阶段)--第三天

    一.Daily Scrum Meeting照片 二.燃尽图 三.项目进展 学号 成员 贡献比 201421123001 廖婷婷 16% 201421123002 翁珊 16% 201421123004 ...

  3. 201521123016《Java设计与程序》第6周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 2. 书面作业 1.clone方法 1.1 Object对 ...

  4. 201521123070 《JAVA程序设计》第5周学习总结

    1. 本章学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. http://naotu.baidu.com/file/02b01f465e125c5942648a03358273b0 2. ...

  5. 201521123068《Java程序设计》第5周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 查看脑图->多态与接口 1.2 可选:使用常规方法总结其他上课内容. 2. 书面作业 1.代码阅读:Child压缩包内源 ...

  6. java面试之Hashmap

    在java面试中hashMap应该说一个必考的题目,而且HashMap 和 HashSet 是 Java Collection Framework 的两个重要成员,其中 HashMap 是 Map 接 ...

  7. HTML文本

    1.HTML元素 2.HTML属性 3.HTML文本格式化 4.HTML样式 1.HTML元素 1.什么是HTML元素 HTML 元素指的是从开始标签(start tag)到结束标签(end tag) ...

  8. [PHP源码阅读]number_format函数

    上次讲到PHP是如何解析大整数的,一笔带过了number_format的处理,再详细阅读该函数的源码,以下是小分析. 函数原型 string number_format ( float $number ...

  9. TomCat系统架构

    1.TomCat总体结构 TomCat有两大核心组件:Connector和Container.Connector组件是可以被替换的,一个Container可以对应多个Connector. 多个Conn ...

  10. Android中Parcelable接口

    1. Parcelable接口 Interface for classes whose instances can be written to and restored from a Parcel. ...