Exercício – Registro em log e rastreamento

Concluído

Agora que o desenvolvimento do aplicativo foi iniciado, é bom incluir mais diagnósticos à lógica para ajudar os desenvolvedores à medida que eles acrescentam novos recursos. Podemos usar nosso novo conhecimento sobre diagnóstico de depurações para realizar essa tarefa.

Gravar no console de depuração

Antes de depurar o aplicativo, vamos incluir mais diagnósticos de depuração. Eles ajudarão a diagnosticar o aplicativo enquanto ele estiver sendo executado sob depuração.

Na parte superior do arquivo Program.cs, adicionaremos uma nova instrução using para inserir System.Diagnostics e possibilitar o uso dos métodos de Debug.

using System.Diagnostics;

Adicione uma instrução WriteLine no início do método Fibonacci para obter clareza ao depurar por meio do código.

Debug.WriteLine($"Entering {nameof(Fibonacci)} method");
Debug.WriteLine($"We are looking for the {n}th number");

No final do loop for, poderíamos imprimir cada valor. Também é possível usar uma instrução de impressão condicional usando WriteIf ou WriteLineIf para adicionar uma linha de impressão somente quando sum for 1 no final do loop:

for (int i = 2; i <= n; i++)
{                  
    sum = n1 + n2;
    n1 = n2;
    n2 = sum;
    Debug.WriteLineIf(sum == 1, $"sum is 1, n1 is {n1}, n2 is {n2}");    
}

Depure o aplicativo e você deverá obter a seguinte saída:

Entering Fibonacci method
We are looking for the 5th number
sum is 1, n1 is 1, n2 is 1

Verificar condições com Assert

Em algumas situações, é indicado interromper todo o aplicativo em execução quando determinada condição não é atendida. O uso de Debug.Assert permite que você verifique uma condição e gere informações adicionais sobre o estado do aplicativo. Vamos adicionar uma verificação antes da instrução return para garantir que n2 seja 5.

// If n2 is 5 continue, else break.
Debug.Assert(n2 == 5, "The return value is not 5 and it should be.");
return n == 0 ? n1 : n2;

Nossa lógica de aplicativo já está correta, portanto, vamos atualizar Fibonacci(5); para Fibonacci(6);, que terá um resultado diferente.

Depure o aplicativo. Quando Debug.Assert é executado no código, o depurador interrompe o aplicativo para que você possa inspecionar as variáveis, a janela de inspeção, a pilha de chamadas e muito mais. Ele também gera a mensagem para o console de depuração.

---- DEBUG ASSERTION FAILED ----
---- Assert Short Message ----
The return value is not 5 and it should be.
---- Assert Long Message ----

   at Program.<<Main>$>g__Fibonacci|0_0(Int32 n) in C:\Users\Jon\Desktop\DotNetDebugging\Program.cs:line 23
   at Program.<Main>$(String[] args) in C:\Users\Jon\Desktop\DotNetDebugging\Program.cs:line 3

Interrompa a depuração e execute o aplicativo sem depuração inserindo o comando a seguir no terminal.

dotnet run

O aplicativo é encerrado após a falha da asserção e o registro das informações na saída do aplicativo.

Process terminated. Assertion failed.
The return value is not 5 and it should be.
   at Program.<<Main>$>g__Fibonacci|0_0(Int32 n) in C:\Users\Jon\Desktop\DotNetDebugging\Program.cs:line 23
   at Program.<Main>$(String[] args) in C:\Users\Jon\Desktop\DotNetDebugging\Program.cs:line 3

Agora, vamos executar o aplicativo na configuração de Release com o comando a seguir no terminal.

dotnet run --configuration Release

O aplicativo é executado com êxito até a conclusão, pois não estamos mais na configuração de Debug.

Parabéns, a depuração do código foi realizada com êxito e eficiência usando recursos do .NET, incluindo Debug.WriteLine e Debug.Assert. Muito bem!