调试时我无法在堆上看到我的字符串

Hei*_*nzi 6 .net debugging profiling visual-studio-2015

我试图在使用非常大的字符串的.NET应用程序中调试内存问题.为此,我想设置一些断点并在执行的各个阶段分析堆.

问题是:当使用Visual Studio 2015的诊断工具时,似乎只有在没有调试的情况下启动应用程序时才会显示堆上的大字符串.这很不方便,因为它阻止我设置断点.

问题:这是一个已知的错误吗?或者我错误地使用诊断工具?


如何重现

  1. 使用以下代码创建新的C#控制台应用程序(.NET 4.6.1):

    using System;
    using System.Threading;
    
    class Program
    {
        static void Main(string[] args)
        {
            string test1 = new string('a', 100000000);
            Thread.Sleep(2000);
            string test2 = new string('a', 100000000);
            Thread.Sleep(2000);
            string test3 = new string('a', 100000000);
    
            Console.WriteLine("Done");
            Console.ReadLine();
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 激活诊断工具(Ctrl + Alt + F2)并使用调试启动应用程序(F5).观察内存使用情况并注意每个字符串分配会将内存使用量增加200MB.在内存使用量达到最大值后,获取内存快照并查看堆.

  3. 观察到堆上占用最多内存的对象类型是一个10 KB的图标.显然,这是不正确的.

调试

  1. 停止申请.使用诊断工具再次启动它,不进行调试(Alt + F2).选择"内存使用"并开始.

  2. 再次注意内存的增加,拍摄快照并查看它.

  3. 观察显示三个大字符串(应该是).

在此输入图像描述

Hei*_*nzi 5

我发现即使在调试时也能看到字符串.出于某些奇怪的原因,默认选项"Just my code"会在调试时隐藏这些字符串:

只是我的代码

删除复选标记使字符串可见.

显然,这只是调试时的一个问题.正如问题中的第二个屏幕截图所示,在"不调试"的情况下,即使启用了"仅我的代码",也会显示字符串.