演習 - 変数と実行フローを監視する
RUN AND DEBUG ビューを使用すると、開発者は、デバッグ プロセス中に変数と式の監視、実行フローの観察、ブレークポイントの管理を簡単に行うことができます。
実行ビューとデバッグ ビューのセクションを確認する
RUN AND DEBUG ビューの各セクションには、固有の機能があります。 デバッグ プロセス中にこれらのセクションを組み合わせて使用すると、多くの場合役に立ちます。
VARIABLES セクション
変数の状態の監視は、コード デバッグの重要な側面です。 変数状態の予期しない変更は、多くの場合、コード内のロジック エラーを特定するのに役立ちます。
VARIABLES セクションでは、変数をスコープ別に整理します。
Locals スコープには、現在のスコープ (現在のメソッド) の変数が表示されます。
注
コンソール アプリケーションの最上位レベルのステートメント セクションは、独自のメソッドと見なされます。
Mainという名前のメソッド。
スコープ名の左側にある矢印を選択すると、表示されるスコープを展開 (展開) できます。 変数とオブジェクトを展開することもできます。 次のスクリーンショットは、numbersスコープの下に展開されたLocals配列を示しています。
変数セクションを使用して、実行時に変数の値を変更することもできます。 変数名をダブルクリックし、新しい値を入力できます。
視聴セクション
時間やさまざまな方法で変数の状態を追跡する場合はどうなりますか? 毎回変数を検索するのは面倒な場合があります。 ここで、WATCH セクションが役立ちます。
[ 式の追加 ] ボタン (プラス記号として表示されます: +) を選択して、変数名またはウォッチする式を入力できます。 別の方法として、[変数] セクションで変数を右クリックし、 Add to watchを選択することもできます。
WATCH セクション内のすべての式は、コードの実行時に自動的に更新されます。
[呼び出し履歴] セクション
コードが別のメソッドからメソッドを入力するたびに、呼び出しレイヤーがアプリケーションの呼び出し履歴に追加されます。 アプリケーションが複雑になり、他のメソッドによって呼び出されるメソッドの長い一覧がある場合、呼び出し履歴はメソッド呼び出しの証跡を表します。
CALL STACK セクションは、例外または WATCH 式のソースの場所を見つけようとしている場合に便利です。 アプリケーションで予期しない例外がスローされた場合、コンソールに次のようなメッセージが表示されることがよくあります。
Exception has occurred: CLR/System.DivideByZeroException
An unhandled exception of type 'System.DivideByZeroException' occurred in Debug1.dll: 'Attempted to divide by zero.'
at Program.<<Main>$>g__WriteMessage|0_1() in C:\Users\howdc\Desktop\Debug1\Program.cs:line 27
at Program.<<Main>$>g__Process1|0_0() in C:\Users\howdc\Desktop\Debug1\Program.cs:line 16
at Program.<Main>$(String[] args) in C:\Users\howdc\Desktop\Debug1\Program.cs:line 10
エラー メッセージの下にある at Program ... 行のインデントされたグループは、スタック トレースと呼ばれます。 スタック トレースには、例外に至るまで呼び出されたすべてのメソッドの名前と発生元が一覧表示されます。 ただし、情報には .NET ランタイムからの情報を含めることができるため、解読が少し難しい場合があります。 この例では、スタック トレースはかなりクリーンであり、 WriteMessageという名前のメソッドで例外が発生したことを確認できます。 スタックは、コンソール アプリケーションの最上位レベルのステートメント セクションである Main という名前のメソッドから生成されます。
CALL STACK セクションは、.NET ランタイム情報が煩雑なスタック トレースの解読の難しさを回避するのに役立ちます。 既定では、不要な情報を除外して、関連するメソッドのみを独自のコードから表示します。 呼び出し履歴を手動でアンワインドして、例外が発生した場所を確認できます。
ブレークポイント セクション
[ブレークポイント] セクションには現在のブレークポイント設定が表示され、デバッグ セッション中に特定のブレークポイントを有効または無効にするために使用できます。
アプリケーションの構成と起動の構成
ユーザー入力を読み取るコンソール アプリケーションで作業している場合は、起動構成ファイルを更新する必要がある可能性があります。
Program.cs ファイル内のコードを次のように更新します。
string? readResult; int startIndex = 0; bool goodEntry = false; int[] numbers = { 1, 2, 3, 4, 5 }; // Display the array to the console. Console.Clear(); Console.Write("\n\rThe 'numbers' array contains: { "); foreach (int number in numbers) { Console.Write($"{number} "); } // To calculate a sum of array elements, // prompt the user for the starting element number. Console.WriteLine($"}}\n\r\n\rTo sum values 'n' through 5, enter a value for 'n':"); while (goodEntry == false) { readResult = Console.ReadLine(); goodEntry = int.TryParse(readResult, out startIndex); if (startIndex > 5) { goodEntry = false; Console.WriteLine("\n\rEnter an integer value between 1 and 5"); } } // Display the sum and then pause. Console.WriteLine($"\n\rThe sum of numbers {startIndex} through {numbers.Length} is: {SumValues(numbers, startIndex)}"); Console.WriteLine("press Enter to exit"); readResult = Console.ReadLine(); // This method returns the sum of elements n through 5 static int SumValues(int[] numbers, int n) { int sum = 0; for (int i = n; i < numbers.Length; i++) { sum += numbers[i]; } return sum; }少し時間をかけてコードを確認します。
次のことに注意してください。
- このコードでは、5 つの数値を含む整数配列を指定します。
- このコードは、コンソールに出力を表示します。
- このコードは、
nを介してn配列要素を合計するために使用する開始要素番号5を入力するようにユーザーに求めます。 - このコードは、メソッドの合計を計算し、結果をコンソールに表示してから一時停止します。
注
DEBUG CONSOLE パネルは、コンソールからのユーザー入力をサポートしていません。
[Visual Studio Code ファイル ] メニューの [ 保存] を選択します。
[ 実行 ] メニューの [ すべてのブレークポイントの削除] を選択します。
これにより、前の演習で残ったブレークポイントが削除されます。
[実行とデバッグ] ビューで、[ デバッグの開始] を選択します。
Console.Clear();コード行の実行時にエラーが発生します。[ デバッグ] ツール バーの [ 停止] を選択します。
エクスプローラー ビューに切り替え、エディターで launch.json ファイルを開きます。
console属性の値を次のように更新します。"console":"integratedTerminal",[Visual Studio Code ファイル ] メニューの [ 保存] を選択し、launch.json ファイルを閉じます。
アプリケーションの出力を確認し、問題を特定する
アプリケーションの出力を確認すると、コードの記述時に見落としていたロジックの問題が明らかになります。
RUN AND DEBUG ビューに切り替えて戻ります。
[実行とデバッグ] ビューで、[ デバッグの開始] を選択します。
デバッグ コンソール パネルに表示されるメッセージには、
Debug101.dllアプリケーションにアタッチされているデバッガーが表示されます。エラー メッセージが表示されていないことに注意してください。
起動構成ファイルで
console属性の値を internalConsole から integratedTerminal に変更すると、コンソール エラーが修正されました。 ただし、出力を含むコンソールを見つける必要があります。エディターの下のパネル領域で、デバッグ コンソール パネルからターミナル パネルに切り替えます。
nの値を入力するようにユーザーに求めるメッセージでコードの実行が一時停止していることに注意してください。ターミナル パネルの出力は次のようになります。
The 'numbers' array contains: { 1 2 3 4 5 } To sum values 'n' through 5, enter a value for 'n':TERMINAL コマンド プロンプトで、「3」と入力します。
アプリケーションからの出力を確認します。
ターミナル パネルの出力は次のようになります。
The 'numbers' array contains: { 1 2 3 4 5 } To sum values 'n' through 5, enter a value for 'n': 3 The sum of numbers 3 through 5 is: 9 press Enter to exitsumの報告された値と、コンソールの上部に表示される配列要素 3 から 5 の値を考慮します。"
The sum of numbers 3 through 5 is: 9" というメッセージが表示されます。 ただし、配列要素 3 から 5 は3、4、および5です。 報告される合計は 12 ではないでしょうか?RUN AND DEBUG ビューの VARIABLES セクションを使用して、問題を調査できます。
変数の状態を監視する
場合によっては、単に変数の状態を監視するだけで、アプリケーションのロジックの問題を特定するのに十分です。
次のコード行にブレークポイントを設定します。
Console.WriteLine($"\n\rThe sum of numbers {startIndex} through {numbers.Length} is: {SumValues(numbers, startIndex)}");[実行とデバッグ] ビューで、[ デバッグの開始] を選択します。
デバッグ コンソール パネルからターミナル パネルに切り替えます。
TERMINAL コマンド プロンプトで、「3」と入力します。
コードの実行はブレークポイントで一時停止します。
RUN AND DEBUG ビューの VARIABLES セクションを確認するには、少し時間がかかります。
startIndexに入力した値 (3) が割り当てられていることに注意してください。[ステップ イン]を選択します。
変数セクションと呼び出し履歴セクションが更新されていることに注意してください。
CALL STACK セクションは、コードの実行が
SumValuesメソッドに移動したことを示しています。ローカル変数を一覧表示する VARIABLES セクションには、整数
nの値が表示されます。nメソッド パラメーターには、メソッド呼び出し引数startIndexから値が割り当てられます。 この場合、変数名を変更すると、参照ポインターではなく、値が渡されたことが明確になります。注
この場合、エディターでほとんどのコードが表示されるため、CALL STACK セクションは必要ない場合がありますが、深く入れ子になった相互接続されたメソッド呼び出しを使用して大規模なアプリケーションで作業している場合は、「CALL STACK」セクションに示されている実行パスが非常に役立ちます。
sum に割り当てられた値が 0 でなくなるまで、[ステップ インする] を選択し続けます。
「変数」セクションに示されている情報を確認するには、少し時間がかかります。
次のように表示されます。
sumに割り当てられた値が0から4に戻ったことに注意してください。numbers配列を展開するには、数値 [int[]] を選択します。
配列要素は、0 から始まるインデックス番号を使用してアクセスされることを思い出してください。
この場合、ロジック エラーは、ユーザー インターフェイスの命令と基になるコードの間の不一致です。 ユーザー インターフェイスは、配列項目 1 から 5 を参照します。 ただし、このコードでは、ユーザーが入力した値を使用して、0 から始まる配列要素にアクセスします。
3のインデックスを持つ配列要素には、4の値が格納されます。 このコードでは、0 から始まるインデックス番号は補正されません。デバッグ セッションを終了するには、[停止] を選択 します。
少し時間を取って、問題を解決する方法を検討してください。
この問題は、ユーザー インターフェイスで 0 から 4 の値を入力するようにユーザーに求めることで修正できます。 また、入力された値から 1 を減算することで、コード内で修正することもできます。 一般的に言えば、目標は明確で使いやすいユーザーインターフェースを作成することです。 この場合は、次のようにコードを更新することをお勧めします。
Console.WriteLine($"\n\rThe sum of numbers {startIndex} through {numbers.Length} is: {SumValues(numbers, startIndex - 1)}");更新されたコードを実行すると、次の出力が生成されます。
推奨される方法を使用してコードを更新し、Program.cs ファイルを保存します。
ブレークポイントをクリアし、デバッガーでアプリケーションを再実行し、目的の結果がターミナルに表示されることを確認します。
変数の状態を使用して、ロジックの問題を特定して修正しました。 素晴らしい仕事。
ウォッチ式を監視する
WATCH セクションを使用すると、1 つ以上の変数に基づく式を監視できます。
データ セットに対して数値計算を実行するアプリケーションで作業しているとします。 2 つの数値変数間の比率が 5 より大きい場合、コードで信頼性の低い結果が生成されると考えています。 WATCH セクションを使用して、計算された比率を監視できます。
Program.cs ファイルを次のコードで更新します。
bool exit = false; var rand = new Random(); int num1 = 5; int num2 = 5; do { num1 = rand.Next(1, 11); num2 = num1 + rand.Next(1, 51); } while (exit == false);Program.cs ファイルを保存します。
最後のコード行にブレークポイントを設定します。
次の WATCH 式を設定します。
num2 / num1 > 5[実行とデバッグ] ビューで、[ デバッグの開始] を選択します。
[変数] セクションと [ウォッチ] セクションに表示される値に注目してください。
WATCH 式がに評価されるまで、[
trueを選択します。最初のイテレーションで WATCH 式が
true評価された場合は、[ Continue]\(続行 \) をもう数回選択するか、2 回目true表示されるまで選択します。WATCH セクションの使用方法を検討するには、少し時間がかかります。
このシナリオでは、2 つの数値変数間の比率が 5 より大きい場合に、コードで信頼性の低い結果が生成されることを確認しました。 この条件を表す式を WATCH セクションで作成しました。 WATCH セクションを使用して、その条件を追跡できるようになりました。
変数セクションで変数に割り当てられた値を変更する
プログラムによる条件を手動で作成したい場合があります。 RUN AND DEBUG ビューの VARIABLES セクションを使用すると、実行時に変数の状態を変更することでこれを行うことができます。
実行しているコードを確認するには、少し時間がかかります。
doがexitされないため、コードがtrueループから抜け出すことはありません。 これは、実際のアプリケーションで変更する必要があるプログラム上の条件ではありませんが、機能を示しています。[変数] セクションで、
exit [bool]右クリックし、[ 値の設定] を選択します。VARIABLES セクションを使用すると、実行時に変数に割り当てられた値を変更できます。 これは、コードが特定の条件にどのように反応するかを確認する場合に役立ちます。
exitの値をtrueに設定するには、「true」と入力し、Enter キーを押します。この場合、
exitの値をtrueに変更すると、whileステートメントの実行時にアプリケーションが閉じられます。[ 続行] を選択します。
DEBUG CONSOLE パネルに、プログラムが終了したことを通知するメッセージが表示されます。
おめでとうございます! RUN AND DEBUG ビューの VARIABLES セクションと WATCH セクションが正常に使用されました。
まとめ
このユニットで覚えておく必要があるいくつかの重要な点を次に示します。
- RUN AND DEBUG ビューの VARIABLES セクションを使用して変数の状態を監視します。
- RUN AND DEBUG ビューの WATCH セクションを使用して、時間または異なるメソッド間で式を追跡します。
- RUN AND DEBUG ビューの CALL STACK セクションを使用して、例外または WATCH 式のソースの場所を見つけます。
- 変数セクションを使用して、実行時に変数の代入値を変更します。