当我们调试复杂代码时,尤其是那些长年累月无人维护的不良代码,我们常常遇到的情况是,我们需要打大量的断点,并且在调试的时候,不断的反复启用和禁用它们,一不注意还容易错误的将断点删除,这是一个糟糕的调试体验。

  随着 Visual Studio 2022 新版本的发布,新的“断点组”特性已经加入其中。此特性允许我们创建断点组,用于将某类断点统一管理,从而使调试过程更加简单和高效。

  下面让我们看一下“断点组”的使用。

Step 01 准备一个控制台程序

  下面是一个验证素数的控制台应用。

using System.Collections.Concurrent;
using System.Diagnostics;

namespace Demo
{
    class Program
    {
        static void Main()
        {
            var limit = 2000000;
            var numbers = Enumerable.Range(0, limit).ToList();
            var watch = Stopwatch.StartNew();
            var primeNumbersFromForeach = GetPrimeList(numbers); watch.Stop();
            var watchForParallel = Stopwatch.StartNew();
            var primeNumbersFromParallelForeach = GetPrimeListWithParallel(numbers);
            watchForParallel.Stop();
            Console.WriteLine($"Classical foreach loop | Total prime numbers: {primeNumbersFromForeach.Count} | Time Taken: {watch.ElapsedMilliseconds} ms.");
            Console.WriteLine($"Parallel.ForEach loop | Total prime numbers : {primeNumbersFromParallelForeach.Count} | Time Taken:{watchForParallel.ElapsedMilliseconds} ms.");
            Console.ReadLine();
        }
        private static IList<int> GetPrimeList(IList<int> numbers) => numbers.Where(IsPrime).ToList();

        private static IList<int> GetPrimeListWithParallel(IList<int> numbers)
        {
            var primeNumbers = new ConcurrentBag<int>();
            Parallel.ForEach(numbers, number =>
            {
                if (IsPrime(number))
                {
                    primeNumbers.Add(number);
                }
            });
            return primeNumbers.ToList();
        }

        /// <summary>
        /// 判断是否为素数
        /// </summary>
        /// <param name="number"></param>
        /// <returns></returns>
        private static bool IsPrime(int number)
        {
            if (number < 2)
            {
                return false;
            }
            for (var divisor = 2; divisor <= Math.Sqrt(number); divisor++)
            {
                if (number % divisor == 0)
                {
                    return false;
                }
            }
            return true;
        }
    }
}

Step 02 创建“断点组”

  在断点窗口中,点击 新建 -> 断点组

   输入断点组名称,设置断点组

   将任意断点添加到断点组

  设置好后的样子

Step 03 验证“断点组”

  * 可以通过断点组,启用或禁用一组断点。

  * 可以通过断点组,设置“仅当命中以下代码时启用”。

小结

  “断点组”带来的优点:

  * 对于大量断点的复杂场景提供了一种自定义断点配置和单独或组合切换断点的方法,从而使调试、测试和故障排除更快、更有效。

  “断点组”的不足:

  * 目前断点组尚未支持导入与导出。

  * 目前断点组仅支持仅当命中以下代码时启用设置,尚未支持其他断点设置。