在 C# 中配置条件断点
Visual Studio Code 的 C# 调试器支持一种配置选项,该选项允许仅在满足特定条件时才触发断点。 这种类型的断点称为条件断点。 条件断点可以直接配置,也可以通过编辑现有断点来配置。
注释
Visual Studio Code 还支持条件断点,该断点根据断点被“命中”的次数触发。
假设你正在调试一个应用程序,该应用程序处理多维字符串数组中的产品信息。 该数组包括数千个数据点。 你正在调试的问题似乎会出现在标记为new的产品中。 代码在 for 循环中处理数组。 你需要在循环中设置断点,但只希望在产品为 new 时暂停。
使用标准断点检查数据处理应用程序
将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。 加载数据后,代码将循环遍历数组并调用Process1和Process2方法。若要为模拟进程生成数据,请将以下方法添加到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,并赋值existing,new或obsolete分配给产品说明字段。 产品被标记new的可能性约为 1%。若要模拟数据处理,请将以下方法添加到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。在 Visual Studio Code 的“文件”菜单上,选择“保存”。
在Program.cs文件的顶部附近,在以下代码行上设置断点:
result = Process1(products, i);打开“运行和调试”视图,然后选择“ 开始调试”。
使用“单步执行”来演练
Process1和Process2代码。请注意对“运行和调试”视图的 VARIABLES 和 CALL STACK 部分的更新。
继续使用“单步执行”来演练代码,直到看到
i等于 3。“运行和调试”视图的 VARIABLES 部分显示分配给
i的值。请注意,
Process1和Process2向调试控制台面板显示消息。 实际应用程序可能需要用户交互,因为正在处理数据。 某些交互可能依赖于正在处理的数据。使用 “停止 ”按钮停止代码执行。
使用表达式配置条件断点
标准断点非常适合用于演练数据处理应用程序。 但是,在这种情况下,你对 new 产品感兴趣,并且不想逐一分析每个产品以找到那些 new 的产品。 此方案是应使用条件断点时的一个很好的示例。
右键单击现有断点,然后选择 “编辑断点”。
输入以下表达式:
products[i,1] == "new";请注意,按 Enter 后不再显示表达式。
若要暂时显示表达式,请将鼠标指针悬停在断点上(红点)。
若要运行配置有条件断点的应用程序,请选择“ 开始调试”。
等待应用程序在条件断点处暂停。
请注意“VARIABLES”部分下显示的值
i。在“调试控件”工具栏上,选择“继续”
请注意,
i的值已在变量部分中更新。选择“单步执行”。
继续选择“单步执行”,直到显示
Process1消息。请注意,
Process1报告它正在处理新产品。花点时间考虑条件断点提供的优势。
在此模拟数据处理方案中,产品为
new的可能性约为 1%。 如果使用标准断点来调试问题,则需要演练分析大约 100 个产品,才能找到一个感兴趣的new产品。条件断点可以在调试应用程序时节省大量时间。
使用 “停止 ”按钮停止代码执行。
祝贺! 已成功配置条件断点。
回顾
下面是本单元要记住的两个重要事项:
- 每次遇到断点时,使用标准断点暂停应用程序。
- 当布尔表达式的计算结果为
true时,使用条件断点暂停应用程序。