Configuración de puntos de interrupción condicionales en C#
El depurador de C# para Visual Studio Code admite la opción de configurar un punto de interrupción que solo se desencadena si se cumple una condición. Este tipo de punto de interrupción se denomina punto de interrupción condicional. Los puntos de interrupción condicionales se pueden configurar directamente o editando un punto de interrupción existente.
Nota:
Visual Studio Code también admite un punto de interrupción condicional que se desencadena en función del número de veces que el punto de interrupción se ha "alcanzado".
Supongamos que está depurando una aplicación que procesa la información del producto en una matriz de cadenas multidimensionales. La matriz incluye miles de puntos de datos. El problema que se está depurando parece producirse para los productos marcados como new. El código procesa la matriz dentro de un for bucle. Debe establecer un punto de interrupción dentro del bucle, pero solo quiere pausar cuando los productos son new.
Uso de un punto de interrupción estándar para examinar una aplicación de procesamiento de datos
Reemplace el contenido del archivo Program.cs por el código siguiente:
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) ;Este código usa un método denominado
LoadProductspara cargar datos en laproductsmatriz. Una vez cargados los datos, el código recorre en iteración la matriz y llama a los métodos denominadosProcess1yProcess2.Para generar datos para los procesos simulados, agregue el siguiente método al final del archivo 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; } }El
LoadProductsmétodo genera 2000 identificadores de producto aleatorios y asigna un valor de ,existingonewa un campo de descripción delobsoleteproducto. Hay aproximadamente un 1 % de probabilidad de que los productos estén marcados comonew.Para simular el procesamiento de datos, agregue los métodos siguientes al final del archivo 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"); }Los
Process1métodos yProcess2muestran mensajes de progreso y devuelven una cadena.Tenga en cuenta que el método
Process2llama aProcess3si el producto esnew.En el menú Archivo de Visual Studio Code, seleccione Guardar.
Cerca de la parte superior del archivo Program.cs, establezca un punto de interrupción en la siguiente línea de código:
result = Process1(products, i);Abra la vista EJECUTAR Y DEPURAR y, a continuación, seleccione Iniciar depuración.
Use Step Into para recorrer el código de
Process1yProcess2.Observe las actualizaciones de las secciones VARIABLES y CALL STACK de la vista RUN AND DEBUG.
Siga usando Step Into para recorrer el código hasta que vea que
ies igual a 3.La sección VARIABLES de la vista RUN AND DEBUG muestra el valor asignado a
i.Observe que
Process1yProcess2muestran mensajes en el panel CONSOLA DE DEPURACIÓN. Una aplicación real puede requerir interacciones del usuario a medida que se procesan los datos. Algunas interacciones pueden depender de los datos que se procesan.Use el botón Detener para detener la ejecución del código.
Configuración de un punto de interrupción condicional mediante una expresión
Un punto de interrupción estándar es ideal para analizar una aplicación de procesamiento de datos. Sin embargo, en este caso está interesado en los productos new y no desea recorrer el análisis de cada producto para encontrar los que son new. Este escenario es un buen ejemplo de cuándo se deben usar puntos de interrupción condicionales.
Haga clic con el botón derecho en el punto de interrupción existente y seleccione Editar punto de interrupción.
Escriba la siguiente expresión:
products[i,1] == "new";Observe que la expresión ya no se muestra después de presionar Entrar.
Para mostrar la expresión temporalmente, mantenga el puntero del mouse sobre el punto de interrupción (punto rojo).
Para ejecutar la aplicación con el punto de interrupción condicional configurado, seleccione Iniciar depuración.
Espere a que la aplicación se detenga en el punto de interrupción condicional.
Observe el valor de
ique se muestra en la sección VARIABLES.En la barra de herramientas Controles de depuración, seleccione Continuar
Observe que el valor de
ise ha actualizado en la sección VARIABLES.Seleccione Paso a paso por instrucciones.
Continúe seleccionando Paso a paso hasta que se muestre el
Process1mensaje.Observe que informa de que
Process1está trabajando en un nuevo producto.Dedique un momento a tener en cuenta la ventaja que ofrecen los puntos de interrupción condicionales.
En este escenario de procesamiento de datos simulado, hay aproximadamente 1% posibilidad de que un producto sea
new. Si usa un punto de interrupción estándar para depurar el problema, debe recorrer el análisis de unos 100 productos para encontrar uno de losnewproductos que le interesen.Los puntos de interrupción condicionales pueden ahorrarle mucho tiempo al depurar una aplicación.
Use el botón Detener para detener la ejecución del código.
¡Felicidades! Ha configurado correctamente un punto de interrupción condicional.
Resumen
Estas son dos cosas importantes que recordar de esta unidad:
- Use un punto de interrupción estándar para pausar una aplicación cada vez que se encuentre un punto de interrupción.
- Use un punto de interrupción condicional para pausar una aplicación cuando una expresión booleana se evalúa como
true.