演習 - ログとトレース

完了

アプリケーションの開発が開始されたら、開発者が新しい機能を追加するときに役立つ追加の診断をロジックに追加することをお勧めします。 デバッグ診断に関する新しい知識を活用して、このタスクを実行できます。

デバッグ コンソールに書き込む

アプリケーションをデバッグする前に、デバッグ診断を追加しましょう。 追加の診断は、デバッグ中に実行されているアプリケーションの診断に役立ちます。

Debug メソッドを使用できるようにするため、Program.cs ファイルの先頭に、System.Diagnostics を取り込む新しい using ステートメントを追加します。

using System.Diagnostics;

コードを使用してデバッグするときにわかりやすくするため、Fibonacci メソッドの先頭に WriteLine ステートメントを追加します。

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

for ループの終了時に、すべての値を出力することができます。 また、条件付き print ステートメントを使用することもできます。そのためには、WriteIf または WriteLineIf を使用して、for ループの最後で sum が 1 になっている場合にのみ print 行を追加します。

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}");    
}

アプリケーションをデバッグします。次の出力が表示されるはずです。

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

Assert を使用して条件を確認する

状況によっては、特定の条件が満たされない場合に、実行中のアプリケーション全体を停止することが必要になる場合があります。 Debug.Assert を使用すると、条件を調べて、アプリケーションの状態に関する追加情報を出力することができます。 return ステートメントの直前に、n2 が 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;

アプリケーションのロジックは既に正しいので、異なる結果になるように Fibonacci(5);Fibonacci(6); に更新します。

アプリケーションをデバッグします。 コードで Debug.Assert が実行されると、デバッガーによってアプリケーションが停止されるので、変数、ウォッチ ウィンドウ、呼び出し履歴などを検査できます。 また、メッセージがデバッグ コンソールに出力されます。

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

デバッグを停止し、ターミナルで次のコマンドを入力して、デバッグなしでアプリケーションを実行します。

dotnet run

アサーションの失敗後にアプリケーションが終了され、情報がアプリケーション出力に記録されます。

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

ここで、ターミナルで次のコマンドを使用して、Release 構成でアプリケーションを実行します。

dotnet run --configuration Release

Debug 構成ではなくなったため、アプリケーションは正常に完了します。

おめでとうございます。Debug.WriteLineDebug.Assert を含む .NET の機能を使用して、コードを問題なく効率的にデバッグできました。 お疲れさまでした。