Configurar pontos de interrupção condicionais em C#

Concluído

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

  1. 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 LoadProducts para carregar dados na products matriz. Depois que os dados são carregados, o código itera por meio da matriz e chama métodos nomeados Process1 e Process2.

  2. 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 LoadProducts método gera 2.000 IDs aleatórias do produto e atribui um valor de , existingou new a um campo de descrição do obsoleteproduto. Há cerca de 1% chance de que os produtos sejam marcados new.

  3. 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 Process1 métodos e os Process2 métodos exibem mensagens de progresso e retornam uma cadeia de caracteres.

    Observe que o método Process2 chama Process3 se o produto é new.

  4. No menu Arquivo do Visual Studio Code, selecione Salvar.

  5. Próximo à parte superior do arquivo Program.cs, defina um ponto de interrupção na seguinte linha de código:

    result = Process1(products, i);
    
  6. Abra a exibição EXECUTAR E DEPURAR e, em seguida, selecione Iniciar Depuração.

  7. Use Intervir para percorrer o código de Process1 e Process2.

    Observe as atualizações nas seções VARIÁVEIS e PILHA DE CHAMADAS da exibição EXECUÇÃO E DEPURAÇÃO.

  8. 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 Process1 e Process2 exibem 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.

  9. 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.

  1. Clique com o botão direito do mouse no ponto de interrupção existente e selecione Editar Ponto de Interrupção.

  2. Insira a expressão a seguir:

    products[i,1] == "new";
    
  3. Observe que a expressão não é mais exibida depois de pressionar Enter.

  4. Para exibir a expressão temporariamente, passe o ponteiro do mouse sobre o ponto de interrupção (ponto vermelho).

  5. Para executar seu aplicativo com o ponto de interrupção condicional configurado, selecione Iniciar Depuração.

  6. Aguarde até que o aplicativo pause no ponto de interrupção condicional.

  7. Observe o valor de i exibido na seção VARIABLES.

  8. Na barra de ferramentas de controles de depuração , selecione Continuar

  9. Observe que o valor de i foi atualizado na seção VARIABLES.

  10. Selecione Intervir.

  11. Continue selecionando Step Into até que a Process1 mensagem seja exibida.

  12. Observe que Process1 informa que ele está trabalhando em um novo produto.

  13. 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 dos new produtos nos quais está interessado.

    Os pontos de interrupção condicionais podem economizar muito tempo quando você depura um aplicativo.

  14. 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.