在 C# 中配置条件断点

已完成

Visual Studio Code 的 C# 调试器支持一种配置选项,该选项允许仅在满足特定条件时才触发断点。 这种类型的断点称为条件断点。 条件断点可以直接配置,也可以通过编辑现有断点来配置。

注释

Visual Studio Code 还支持条件断点,该断点根据断点被“命中”的次数触发。

假设你正在调试一个应用程序,该应用程序处理多维字符串数组中的产品信息。 该数组包括数千个数据点。 你正在调试的问题似乎会出现在标记为new的产品中。 代码在 for 循环中处理数组。 你需要在循环中设置断点,但只希望在产品为 new 时暂停。

使用标准断点检查数据处理应用程序

  1. 将Program.cs文件的内容替换为以下代码:

    int productCount = 2000;
    string[,] products = new string[productCount, 2];
    
    LoadProducts(products, productCount);
    
    for (int i = 0; i < productCount; i++)
    {
        string result;
        result = Process1(products, i);
    
        if (result != "obsolete")
        {
            result = Process2(products, i);
        }
    }
    
    bool pauseCode = true;
    while (pauseCode == true) ;
    

    此代码使用命名 LoadProducts 的方法将数据加载到数组中 products 。 加载数据后,代码将循环遍历数组并调用Process1Process2方法。

  2. 若要为模拟进程生成数据,请将以下方法添加到Program.cs文件的末尾:

    static void LoadProducts(string[,] products, int productCount)
    {
        Random rand = new Random();
    
        for (int i = 0; i < productCount; i++)
        {
            int num1 = rand.Next(1, 10000) + 10000;
            int num2 = rand.Next(1, 101);
    
            string prodID = num1.ToString();
    
            if (num2 < 91)
            {
                products[i, 1] = "existing";
            }
            else if (num2 == 91)
            {
                products[i, 1] = "new";
                prodID = prodID + "-n";
            }
            else
            {
                products[i, 1] = "obsolete";
                prodID = prodID + "-0";
            }
    
            products[i, 0] = prodID;
        }
    }
    

    该方法 LoadProducts 生成 2000 个随机产品 ID,并赋值 existingnewobsolete 分配给产品说明字段。 产品被标记 new 的可能性约为 1%。

  3. 若要模拟数据处理,请将以下方法添加到Program.cs文件的末尾:

    static string Process1(string[,] products, int item)
    {
        Console.WriteLine($"Process1 message - working on {products[item, 1]} product");
    
        return products[item, 1];
    }
    
    static string Process2(string[,] products, int item)
    {
        Console.WriteLine($"Process2 message - working on product ID #: {products[item, 0]}");
        if (products[item, 1] == "new")
            Process3(products, item);
    
        return "continue";
    }
    
    static void Process3(string[,] products, int item)
    {
        Console.WriteLine($"Process3 message - processing product information for 'new' product");
    }
    

    Process1Process2方法显示进度消息并返回字符串。

    请注意,如果产品为 Process2,则 Process3 方法调用 new

  4. 在 Visual Studio Code 的“文件”菜单上,选择“保存”。

  5. 在Program.cs文件的顶部附近,在以下代码行上设置断点:

    result = Process1(products, i);
    
  6. 打开“运行和调试”视图,然后选择“ 开始调试”。

  7. 使用“单步执行”来演练 Process1Process2 代码。

    请注意对“运行和调试”视图的 VARIABLES 和 CALL STACK 部分的更新。

  8. 继续使用“单步执行”来演练代码,直到看到 i 等于 3。

    “运行和调试”视图的 VARIABLES 部分显示分配给 i的值。

    请注意,Process1Process2 向调试控制台面板显示消息。 实际应用程序可能需要用户交互,因为正在处理数据。 某些交互可能依赖于正在处理的数据。

  9. 使用 “停止 ”按钮停止代码执行。

使用表达式配置条件断点

标准断点非常适合用于演练数据处理应用程序。 但是,在这种情况下,你对 new 产品感兴趣,并且不想逐一分析每个产品以找到那些 new 的产品。 此方案是应使用条件断点时的一个很好的示例。

  1. 右键单击现有断点,然后选择 “编辑断点”。

  2. 输入以下表达式:

    products[i,1] == "new";
    
  3. 请注意,按 Enter 后不再显示表达式。

  4. 若要暂时显示表达式,请将鼠标指针悬停在断点上(红点)。

  5. 若要运行配置有条件断点的应用程序,请选择“ 开始调试”。

  6. 等待应用程序在条件断点处暂停。

  7. 请注意“VARIABLES”部分下显示的值 i

  8. “调试控件”工具栏上,选择“继续

  9. 请注意,i 的值已在变量部分中更新。

  10. 选择“单步执行”

  11. 继续选择“单步执行”,直到显示 Process1 消息。

  12. 请注意,Process1 报告它正在处理新产品

  13. 花点时间考虑条件断点提供的优势。

    在此模拟数据处理方案中,产品为 new 的可能性约为 1%。 如果使用标准断点来调试问题,则需要演练分析大约 100 个产品,才能找到一个感兴趣的 new 产品。

    条件断点可以在调试应用程序时节省大量时间。

  14. 使用 “停止 ”按钮停止代码执行。

祝贺! 已成功配置条件断点。

回顾

下面是本单元要记住的两个重要事项:

  • 每次遇到断点时,使用标准断点暂停应用程序。
  • 当布尔表达式的计算结果为 true时,使用条件断点暂停应用程序。