Configurar pontos de interrupção condicionais em C#
O depurador C# para Visual Studio Code dá suporte à opção de configurar um ponto de interrupção que só é disparado se uma condição for atendida. Esse tipo de ponto de interrupção é chamado de ponto de interrupção condicional. Pontos de interrupção condicionais podem ser configurados diretamente ou editando um ponto de interrupção existente.
Observação
O Visual Studio Code também dá suporte a um ponto de interrupção condicional que é disparado com base no número de vezes que o ponto de interrupção foi "atingido".
Suponha que você esteja depurando um aplicativo que processa informações do produto em uma matriz de cadeia de caracteres multidimensional. A matriz inclui milhares de pontos de dados. O problema que você está depurando parece ocorrer para produtos marcados como new. Seu código processa a matriz dentro de um for loop. Você precisa definir um ponto de interrupção no loop, mas só desejará pausar quando os produtos forem new.
Usar um ponto de interrupção padrão para examinar um aplicativo de processamento de dados
Substitua o conteúdo do arquivo Program.cs pelo seguinte código:
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) ;Esse código usa um método nomeado
LoadProductspara carregar dados naproductsmatriz. Depois que os dados são carregados, o código itera por meio da matriz e chama métodos nomeadosProcess1eProcess2.Para gerar dados para os processos simulados, adicione o seguinte método ao final do arquivo 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; } }O
LoadProductsmétodo gera 2.000 IDs aleatórias do produto e atribui um valor de ,existingounewa um campo de descrição doobsoleteproduto. Há cerca de 1% chance de que os produtos sejam marcadosnew.Para simular o processamento de dados, adicione os seguintes métodos ao final do arquivo 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"); }Os
Process1métodos e osProcess2métodos exibem mensagens de progresso e retornam uma cadeia de caracteres.Observe que o método
Process2chamaProcess3se o produto énew.No menu Arquivo do Visual Studio Code, selecione Salvar.
Próximo à parte superior do arquivo Program.cs, defina um ponto de interrupção na seguinte linha de código:
result = Process1(products, i);Abra a exibição EXECUTAR E DEPURAR e, em seguida, selecione Iniciar Depuração.
Use Intervir para percorrer o código de
Process1eProcess2.Observe as atualizações nas seções VARIÁVEIS e PILHA DE CHAMADAS da exibição EXECUÇÃO E DEPURAÇÃO.
Continue a usar Step Into para percorrer o código até ver que
ié igual a 3.A seção VARIABLES da exibição EXECUTAR E DEPURAR exibe o valor atribuído a
i.Observe que
Process1eProcess2exibem mensagens no painel CONSOLE DE DEPURAÇÃO. Um aplicativo real pode exigir interações do usuário à medida que os dados estão sendo processados. Algumas interações podem depender dos dados que estão sendo processados.Use o botão Parar para interromper a execução do código.
Configurar um ponto de interrupção condicional usando uma expressão
Um ponto de interrupção padrão é ótimo para percorrer um aplicativo de processamento de dados. No entanto, nesse caso, você está interessado em produtos new e não deseja percorrer a análise de cada produto para encontrar os que são new. Esse cenário é um bom exemplo de quando pontos de interrupção condicionais devem ser usados.
Clique com o botão direito do mouse no ponto de interrupção existente e selecione Editar Ponto de Interrupção.
Insira a expressão a seguir:
products[i,1] == "new";Observe que a expressão não é mais exibida depois de pressionar Enter.
Para exibir a expressão temporariamente, passe o ponteiro do mouse sobre o ponto de interrupção (ponto vermelho).
Para executar seu aplicativo com o ponto de interrupção condicional configurado, selecione Iniciar Depuração.
Aguarde até que o aplicativo pause no ponto de interrupção condicional.
Observe o valor de
iexibido na seção VARIABLES.Na barra de ferramentas de controles de depuração , selecione Continuar
Observe que o valor de
ifoi atualizado na seção VARIABLES.Selecione Intervir.
Continue selecionando Step Into até que a
Process1mensagem seja exibida.Observe que
Process1informa que ele está trabalhando em um novo produto.Reserve um momento para considerar a vantagem que os pontos de interrupção condicionais oferecem.
Neste cenário simulado de processamento de dados, há cerca de 1% chance de um produto ser
new. Se você estiver usando um ponto de interrupção padrão para depurar o problema, precisará percorrer a análise de cerca de 100 produtos para encontrar um dosnewprodutos nos quais está interessado.Os pontos de interrupção condicionais podem economizar muito tempo quando você depura um aplicativo.
Use o botão Parar para interromper a execução do código.
Parabéns! Você configurou com êxito um ponto de interrupção condicional.
Recapitulação
Aqui estão duas coisas importantes a serem lembradas desta unidade:
- Use um ponto de interrupção padrão para pausar um aplicativo sempre que um ponto de interrupção for encontrado.
- Use um ponto de interrupção condicional para pausar um aplicativo quando uma expressão booliana for avaliada como
true.