Configurar pontos de interrupção condicionais em C#
O depurador C# para Visual Studio Code oferece suporte à opção de configurar um ponto de interrupção que só é acionado se uma condição for atendida. Esse tipo de ponto de interrupção é chamado de ponto de interrupção condicional. Os 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 oferece suporte a um ponto de interrupção condicional que é acionado 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 estás a depurar parece ocorrer em produtos marcados como new. Seu código processa a matriz dentro de um for loop. Você precisa definir um ponto de interrupção dentro do loop, mas só deseja pausar quando os produtos estiverem 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 chamado
LoadProductspara carregar dados naproductsmatriz. Depois que os dados são carregados, o código itera através da matriz e chama os métodos nomeadosProcess1eProcess2.Para gerar dados para os processos simulados, adicione o seguinte método ao final do arquivo de 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 2000 IDs de produto aleatórios e atribui um valor de ,existingounewa um campo de descrição doobsoleteproduto. Há cerca de 1% de chance de que os produtos sejam marcadosnew.Para simular o processamento de dados, adicione os seguintes métodos ao final do arquivo de 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 eProcess2exibem mensagens de progresso e retornam uma cadeia de caracteres.Observe que o
Process2método chamaProcess3se o produto fornew.No menu Ficheiro do Visual Studio Code, selecione Guardar.
Perto da parte superior do arquivo Program.cs, defina um ponto de interrupção na seguinte linha de código:
result = Process1(products, i);Abra a vista EXECUTAR E DEPURAR e, em seguida, selecione Iniciar Depuração.
Use Step Into para percorrer o código de
Process1eProcess2.Observe as atualizações para as seções VARIABLES e CALL STACK da visualização RUN AND DEBUG.
Continue a usar Step Into para percorrer o código até ver que
ié igual a 3.A seção VARIÁVEIS do modo de exibição EXECUTAR E DEPURAR exibe o valor atribuído a
i.Observe que
Process1eProcess2exibem mensagens no painel de consola de depuração. Uma aplicação real pode exigir interações do utilizador à medida que os dados estão a ser 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, neste caso, você está interessado em new produtos e não quer percorrer a análise de cada produto para encontrar os que são new. Este cenário é um bom exemplo de quando os pontos de interrupção condicionais devem ser usados.
Clique com o botão direito do rato no ponto de interrupção existente e, em seguida, selecione Editar ponto de interrupção.
Insira a seguinte expressão:
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 VARIÁVEIS.Na barra de ferramentas Controles de depuração , selecione Continuar
Observe que o valor de
ifoi atualizado na seção VARIÁVEIS.Selecione Entrar.
Continue selecionando Step Into até que a
Process1mensagem seja exibida.Observe que
Process1informa que está trabalhando em um novo produto.Tire um momento para considerar a vantagem que os pontos de interrupção condicionais oferecem.
Neste cenário de processamento de dados simulado, há cerca de 1% de chance de que um produto seja
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 em que está interessado.Os pontos de interrupção condicionais podem poupar muito tempo quando estiver a depurar uma aplicação.
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 para lembrar 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 booleana for avaliada como
true.