在调试

时间:2016-06-21 15:18:22

标签: .net debugging visual-studio-2015 profiling

我正在尝试在使用非常大的字符串的.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();
        }
    }
    
  2. 激活诊断工具(Ctrl + Alt + F2)并使用调试启动应用程序(F5)。观察内存使用情况并注意每个字符串分配会将内存使用量增加200MB。在内存使用量达到最大值后,获取内存快照并查看堆。

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

  4. with debugging

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

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

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

    4. enter image description here

1 个答案:

答案 0 :(得分:5)

即使在调试时我也找到了查看字符串的方法。出于某些奇怪的原因,默认选项“只是我的代码”在调试时会隐藏这些字符串

just my code

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

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