Visual Studio 2013 新功能 Memory Dump 分析器

简介:

TechEd2013 发现新功能

12月5日和6日,在国家会议中心参加了微软的 TechEd2013 技术大会,了解了很多微软所提供的软件新功能和新技术。

在上面的图中描述了在 Visual Studio 2013 中提供了新的功能 .NET Memory Dump Analysis,在具体的 Visual Studio 2013 新功能介绍的 Session 看到了实际的演示。当时感觉这个新功能对开发人员太有帮助了,因为使用 WinDbg 进行内存泄漏等问题排查总是一种痛苦。如果能在 Visual Studio 中包含类似的功能就再好不过了。

准备尝鲜 .NET Memory Dump Analysis

回到家,自然是想使用 Visual Studio 2013 直接上手实际体验下。

在创造了一个 Dump 文件之后,使用 Visual Studio 2013 直接打开,

结果发现,在 Actions 处少一个 "Debug Managed Memory" 按钮。

它应该长这个样子才对:

Google 之后发现原来我使用的是 Visual Studio 2013 Premium 版本,而该功能只有在 Visual Studio 2013 Ultimate 版本中才支持。

公司的 MSDN 订阅选的是 Premium ,比较了下与 Ultimate 的区别,价格果真差的很大。

 此时,我选择了安装个 Windows 7 SP1 虚拟机,并安装 Visual Studio 2013 Ultimate 的试用版。

遭遇 Visual Studio 2013 的 Known Issue

显然,安装上 Visual Studio 2013 Ultimate 之后,再打开 Dump 文件,就可以成功看到 Actions 中的 "Debug Managed Memory" 按钮。

点击该按钮,等待 Heap View 显示。

什么?白屏?一万只马飘过。

这可真是郁闷,折腾了半天都没反应。

于是只能问 Google 了,显然,新的功能暂时没什么人用,也搜不到什么有用的讨论。

终于,当搜索关键词修改为 “Visual Studio 2013 Debug Managed Memory is not work” 时,有用的信息出现了。

打开一看,这居然是一个 Visual Studio 2013 Known Issue,基本就是要求安装 IE10 或以上的版本才能使用此功能。

解决办法,当然就是安装新版 IE,立马下载安装 IE11。新装的虚拟机中的 Windows 7 默认的还是 IE8 。

使用 Dump 文件比较功能

这一次,成功看到了 Heap View。

在 Compare to 中选择一个之前的 Dump 文件作为对比,即可查看两个文件时间的内存变化。

Inclusive Size

在 Heap View 中,有一列为 Inclusive Size (Bytes)。

其包含所显示对象引用的所有对象内存占用的总和。下面的图标展示了内存占用大小的计算过程。

Object Type

Count

Size (Bytes)

Inclusive Size (Bytes)

Customer

1

100

400

Address

1

50

200

String

2

150

150

Byte[]

1

100

100

 

 

 

 

 

 

 

 

 

Address 对象的 Inclusive Size = Address (50 bytes) + String (50 bytes) + Byte[] (100 bytes) = 200 bytes

Customer 对象的 Inclusive Size = Address Inclusive Size (200 bytes) + String (100 bytes) + Customer (100 bytes) = 400 bytes

Inclusive Size Diff

在使用 Dump 比较功能后,显示的列中会出现 "Inclusive Size Diff",用来描述在两个 Dump 文件采集的时间点时,Inclusive Size 的变化。

View Setting

在 Dump 比较的界面中,我们可以看到 View Settings 选项。

  • Just My Code :顾名思义,仅显示用户代码。
  • Collapse Small Objects :隐藏小对象。

这里需要描述下,小对象隐藏后的 Inclusive Size 的计算方式。

实际上,会将被隐藏的小对象的大小累加到父对象上。

仍然使用上面的图例进行计算。

我们假设 String 和 Byte[] 被隐藏,在隐藏小对象后,

Object Type

Count

Size (Bytes)

Inclusive Size (Bytes)

Customer

1

200

400

Address

1

200

200

 

 

 

 

 

 

Paths To Root View

点击 Heap View 列表中的某一个 Object Type,在 Paths To Root 中会通过级联方式显示对象的引用关系。

这用于显示,是哪个对象引用导致该对象没有被垃圾回收。

References View

References View 用于显示,这个对象都引用了哪些对象。

测试用代码

复制代码
 1 using System;
 2 using System.Collections.Concurrent;
 3 using System.Collections.Generic;
 4 using System.Threading;
 5 
 6 namespace TestDebugMemoryDumpFile
 7 {
 8   class Program
 9   {
10     static ConcurrentQueue<Tree> _leakedTrees = new ConcurrentQueue<Tree>();
11 
12     static void Main(string[] args)
13     {
14       List<string> fruits = new List<string>() // 6 items
15       { 
16         "Apple", "Orange", "Pear", "Banana", "Peach", "Hawthorn",
17       };
18 
19       Random random = new Random();
20       while (true)
21       {
22         string fruitName = fruits[random.Next(0, 5)];
23         Tree fruitTree = new Tree(fruitName);
24         BuildFruitTree(fruitTree, 100); // 100M
25         _leakedTrees.Enqueue(fruitTree);
26 
27         Console.WriteLine("Added    [{0}] on [{1}]...", 
28           fruitTree.Name,
29           DateTime.Now.ToString(@"yyyy-MM-dd HH:mm:ss.ffffff"));
30 
31         Thread.Sleep(TimeSpan.FromSeconds(5));
32       }
33     }
34 
35     private static void BuildFruitTree(Tree fruitTree, int leafCount)
36     {
37       Console.WriteLine("Building [{0}] on [{1}]...", 
38         fruitTree.Name, 
39         DateTime.Now.ToString(@"yyyy-MM-dd HH:mm:ss.ffffff"));
40 
41       for (int i = 0; i < leafCount; i++) // size M
42       {
43         Leaf<byte[]> leaf = new Leaf<byte[]>(Guid.NewGuid())
44         {
45           Content = CreateContentSizeOfOneMegabyte()
46         };
47         fruitTree.Leaves.Add(leaf);
48       }
49     }
50 
51     private static byte[] CreateContentSizeOfOneMegabyte()
52     {
53       byte[] content = new byte[1024 * 1024]; // 1 M
54       for (int j = 0; j < content.Length; j++)
55       {
56         content[j] = 127;
57       }
58       return content;
59     }
60   }
61 
62   internal class Tree
63   {
64     public Tree(string name)
65     {
66       Name = name;
67       Leaves = new List<Leaf<byte[]>>();
68     }
69 
70     public string Name { get; private set; }
71     public List<Leaf<byte[]>> Leaves { get; private set; }
72   }
73 
74   internal class Leaf<T>
75   {
76     public Leaf(Guid id)
77     {
78       Id = id;
79     }
80 
81     public Guid Id { get; private set; }
82     public T Content { get; set; }
83   }
84 }
复制代码

参考资料







本文转自匠心十年博客园博客,原文链接:http://www.cnblogs.com/gaochundong/p/visual_studio_2013_new_feature_memory_dump_analysis.html,如需转载请自行联系原作者
目录
相关文章
|
27天前
Visual Studio 快速分析 .NET Dump 文件
【11月更文挑战第10天】.NET Dump 文件是在 .NET 应用程序崩溃或出现问题时生成的,记录了应用程序的状态,包括内存对象、线程栈和模块信息。通过分析这些文件,开发人员可以定位和解决内存泄漏、死锁等问题。在 Visual Studio 中,可以通过调试工具、内存分析工具和符号加载等功能来详细分析 Dump 文件。此外,还可以使用第三方工具如 WinDbg 进行更深入的分析。
|
5月前
|
存储 运维
使用Visual Studio分析.NET Dump
使用Visual Studio分析.NET Dump
|
3月前
|
存储 运维
.NET开发必备技巧:使用Visual Studio分析.NET Dump,快速查找程序内存泄漏问题!
.NET开发必备技巧:使用Visual Studio分析.NET Dump,快速查找程序内存泄漏问题!
|
7月前
Visual Studio 2022 中VLD库如何安装
Visual Studio 2022 中VLD库如何安装
733 1
|
7月前
Visual Studio 2022 中VLD库如何安装
Visual Studio 2022 中VLD库如何安装
707 0
|
6月前
|
IDE 开发工具 C语言
Visual Studio 2017 安装及使用(新手)
Visual Studio 2017 安装及使用(新手)
1256 0
|
5月前
|
弹性计算 自然语言处理 Windows
通义灵码 Visual Studio 下载安装指南(附安装包)
本安装步骤适用于 Windows 10 及以上操作系统中安装和使用通义灵码。
131866 20
|
5月前
|
前端开发 JavaScript 开发工具
|
6月前
|
JSON 开发工具 C语言
编程入门(五)【Visual Studio Code安装与C/C++语言运行】
编程入门(五)【Visual Studio Code安装与C/C++语言运行】
769 0
|
6月前
|
C++ Windows
Visual Studio 2022安装详解教程
Visual Studio 2022安装详解教程
852 0