Вправа – налагодження за допомогою Visual Studio
Настав час на практиці втілити свої нещодавно придбані налагодити знання. Це ваш перший день на роботі, і ви хочете покласти свої навички налагодження .NET для роботи, виправляючи помилку в флагманському продукті компанії, калькуляторі Fibonacci.
Створення зразка проекту .NET для налагодження
Щоб настроїти visual Studio для налагодження .NET, спочатку потрібен проект .NET. Visual Studio пропонує безліч початкових шаблонів, які спрощують створення нового проекту.
У Visual Studio виберіть Файл>Новий>проект.
У діалоговому вікні Створення нового проекту виберіть консольну програму та натисніть кнопку Далі.
Назвіть проект DotNetDebugging і виберіть розташування, де потрібно зберегти проект. Залиште інші значення за замовчуванням, а потім натисніть кнопку Далі.
Натисніть кнопку Створити на останньому екрані.
Visual Studio створює проект Console для нас за допомогою вибраного шаблону. Коли проект завантажиться, відкрийте Program.cs , вибравши його.
Додавання логіки програми Fibonacci
Наш поточний проект пише повідомлення "Hello World" на консоль, що не дає нам багато налагодити. Натомість давайте скористаємося короткою програмою .NET, щоб обчислити N-й номер послідовності Fibonacci.
Послідовність Fibonacci – це набір чисел, який починається з чисел 0 і 1, а кожне інше наступне число – це сума двох попередніх. Послідовність продовжується, як показано тут:
0, 1, 1, 2, 3, 5, 8, 13, 21...
Наведений нижче зразок коду містить помилку, тому давайте скористаємося інструментами налагодження Visual Studio, щоб діагностувати та вирішити цю проблему.
- Замініть вміст Program.cs на такий код:
int result = Fibonacci(5);
Console.WriteLine(result);
static int Fibonacci(int n)
{
Console.WriteLine("The output is: ");
int n1 = 0;
int n2 = 1;
int sum;
for (int i = 2; i < n; i++)
{
sum = n1 + n2;
n1 = n2;
n2 = sum;
}
return n == 0 ? n1 : n2;
}
Примітка
Цей код містить помилку, яку ми налагодимо пізніше в цьому модулі. Ми не радимо використовувати її в будь-яких критично важливих програмах Fibonacci, доки ми не виправимо цю помилку.
Збережіть файл за допомогою клавіш Ctrl+S для Windows і Linux. Виберіть Cmd+S для Mac.
Давайте розглянемо, як працює оновлений код, перш ніж налагоджувати його. Запустіть програму, натиснувши зелену кнопку "Пуск" на панелі команд Visual Studio.
У кінці виходу консолі налагодження ви можете побачити, що програма записує 3 на консоль, а потім завершує роботу з кодом 0. Зазвичай код виходу програми з 0 вказує на те, що програма запускається та завершується без аварійного завершення роботи. Однак існує різниця між аварійним завершенням роботи та поверненням правильного значення.
У цьому випадку ми попросили програму обчислити п'яте значення послідовності Fibonacci:
0, 1, 1, 2, 3, 5, 8, 13, 21...
П'яте значення в цьому списку – 5, але наша програма повернула 3. Діагностуйте та виправимо цю помилку за допомогою налагоджувача.
Використання точок зупинки та покрокового виконання
Додайте точку зупинки, клацнувши ліве поле в рядку 1 на
int result = Fibonacci(5);.Знову почніть налагодження. Програма почне виконуватися. Він розриває (призупиняє виконання) у рядку 1 через встановлену точку зупинки. Використовуйте елементи керування налагоджувача, щоб увійти у
Fibonacci()функцію.
Перевірка стану змінних
Тепер перевірте значення різних змінних за допомогою вікна "Місцеві жителі ".
- Яке значення відображається для
nпараметра? - На початку виконання функції відображаються значення для локальних
n1змінних ,n2іsum?
Після цього переходите до
forциклу за допомогою елемента керування налагоджувача Крок за кроком .
Продовжуйте наступати, доки не дістанетеся першої
forлінії всередині циклу. Рядок, який ознайомлюється з:sum = n1 + n2;
Примітка
Ви можете помітити, що для переміщення рядком for(...) {} потрібно виконати кілька кроків у командах. Ця ситуація виникає, тому що є кілька операторів в цьому рядку. Під час виконання кроку ви переходите до наступної інструкції в коді. Зазвичай в одному рядку є одна інструкція. Якщо це не так, потрібно виконати кілька кроків, щоб перейти до наступного рядка.
Подумайте про код
Важлива частина налагодження полягає в тому, щоб зупинити і прийняти деякі обґрунтовані припущення про те, що, на вашу думку, намагаються зробити частини коду (як функції, так і блоки, такі як цикли). Це нормально, якщо ви не впевнені, що це частина процесу налагодження. Але активна участь у процесі налагодження допомагає знайти помилки набагато швидше.
Перш ніж копати далі, давайте пам'ятати, що послідовність Fibonacci – це ряд чисел, які починаються з чисел 0 і 1, а кожне інше наступне число – це сума двох попередніх.
Це означає, що:
Fibonacci(0) = 0
Fibonacci(1) = 1
Fibonacci(2) = 1 (0 + 1)
Fibonacci(3) = 2 (1 + 1)
Fibonacci(4) = 3 (1 + 2)
Fibonacci(5) = 5 (2 + 3)
Розуміючи, що визначення і дивлячись на цей for цикл, ми можемо вивести це:
- Цикл рахується від 2 до
n(номер послідовності Fibonacci, який ми шукаємо). - Якщо
nменше 2, цикл ніколи не запускається. Інструкціяreturnв кінці функції повертає 0, якщоn0, а 1 , якщоn1 або 2. Ці значення є нульовими, першими та другими значеннями в ряді Fibonacci за визначенням. - Більш цікавим є випадок, коли
nбільше 2. У таких випадках поточне значення визначається як сума двох попередніх значень. Таким чином,n1для цього циклу, іn2є попередніми двома значеннями, іsumє значенням для поточної ітерації. Через цю логіку щоразу, коли ми з'ясовуємо суму двох попередніх значень і встановлюємо для неїsumзначення , ми оновлюємо нашіn1таn2значення.
Гаразд, нам не потрібно переосмислювати це минуле. Ми можемо трохи спертися на наш налагоджувач. Але варто подумати про код, щоб побачити, чи він робить те, що ми очікуємо, і бути більш поінформованим, коли він не робить.
Пошук помилки з точками зупинки
Проходження коду може бути корисним, але нудним. Особливо, коли ви працюєте з циклами або іншим кодом, який викликається кілька разів. Замість того, щоб переходити циклом знову і знову, ми можемо встановити нову точку зупинки на першому рядку циклу.
Важливо бути стратегічним щодо того, де ми ставимо наші точки зупинки. Нас особливо цікавить значення sum, оскільки воно представляє поточне максимальне значення Fibonacci. Отже, давайте поставимо нашу точку зупинки на лінію після встановленняsum .
Додайте другу точку зупинки в рядку 14.
Примітка
Якщо ви помітили, що ви продовжуєте працювати з кодом, а потім крокуєте лінією або двома лініями, ви можете легко оновити точки зупинки до більш ефективних ліній.
Тепер, коли ми маємо хороший набір точок зупинки в циклі, натисніть кнопку Продовжити в елементах керування налагоджувача, щоб перейти до точки зупинки. У наших локальних змінних відображаються такі рядки:
n [int]: 5 n1 [int]: 0 n2 [int]: 1 sum [int]: 1 i [int]: 2Усі ці рядки здаються правильними. Перший цикл
sumіз двох попередніх значень – 1. Замість того, щоб переходити через лінію за рядком, ми можемо скористатися нашими точками зупинки, щоб перейти до наступного разу через петлю.Натисніть кнопку Продовжити , щоб продовжити передавання програми, доки не потрапить наступна точка зупинки, яка перебуватиме на наступному проході через цикл.
Примітка
Не турбуйтеся про пропуск через помилку під час використання функції "Продовжити". Слід очікувати, що ви можете налагодити код кілька разів, щоб знайти проблему. Часто це швидше, щоб працювати через нього кілька разів, на відміну від того, занадто обережно, коли ви проходите.
Цього разу відображаються такі значення:
n [int]: 5 n1 [int]: 1 n2 [int]: 1 sum [int]: 2 i [int]: 3Чи мають ці значення сенс? Схоже, вони роблять. Для третього номера Fibonacci ми очікуємо побачити наші
sumрівні 2, і це так.Натисніть кнопку Продовжити , щоб знову зацикляти його.
n [int]: 5 n1 [int]: 1 n2 [int]: 2 sum [int]: 3 i [int]: 4Результат правильний. Четверте значення в ряді, як очікується, буде 3.
На цьому етапі ви можете почати цікавитися, чи правильно вказано код, і ви уявили собі помилку! Давайте продовжимо з ним в останній раз через цикл. Натисніть кнопку Продовжити ще раз.
Програму завершено, а вихід – 3! Наш результат неправильний.
Тепер ми знаємо, що код проходить через цикл правильно, поки не
iдорівнює 4, але потім він виходить, перш ніж обчислити остаточне значення. Ми звужуються там, де є помилка.Давайте встановимо ще одну точку зупинки в рядку 18, яка ознайомиться з:
return n == 0 ? n1 : n2;Ця точка зупинки дає змогу перевірити стан програми перед виходом функції. Ми вже дізналися все, що ми можемо очікувати від наших попередніх точок зупинки в рядках 1 і 13, так що ми можемо очистити їх.
Видаліть попередні точки зупинки в рядках 1 і 13. Установіть точки зупинки на полях поруч із номерами рядків або зніміть прапорці точки зупинки для рядків 1 і 13 в області точок зупинки в нижньому лівому куті.
Тепер, коли ми краще розуміємо, що відбувається, і встановити точку зупинки, покликану зловити нашу програму в акті неналежної поведінки. Тепер ми повинні бути в змозі зловити цю помилку!
Запустіть налагоджувач в останній раз.
n [int]: 5 n1 [int]: 2 n2 [int]: 3 sum [int]: 3Ми спеціально попросили Fibonacci(5), і ми отримали Fibonacci(4), що є неправильним. Ця функція повертає
n2, і кожна ітерація циклу обчислює значення та набориsumn2дорівнюєsum.Виходячи з цієї інформації та нашого попереднього запуску налагодження, ми можемо бачити, що цикл вийшов, коли
iбуло 4, а не 5.Давайте розглянемо нашу
forінструкцію циклу трохи ближче.for (int i = 2; i < n; i++)Ця логіка призводить до виходу програми, як тільки верхній частині циклу бачить
iдорівнюєn. Це означає, що код циклу не запускається для випадку, колиiдорівнюєn. Схоже, що ми хотіли, щоб запустити доi <= n, замість цього:for (int i = 2; i <= n; i++)Отже, після цієї зміни оновлена програма має виглядати так:
int result = Fibonacci(5); Console.WriteLine(result); static int Fibonacci(int n) { Console.WriteLine("The output is: "); int n1 = 0; int n2 = 1; int sum; for (int i = 2; i <= n; i++) { sum = n1 + n2; n1 = n2; n2 = sum; } return n == 0 ? n1 : n2; }Зупиніть сеанс налагодження, якщо ви ще цього не зробили.
Внесіть попередні зміни до рядка 11 і залиште точку зупинки в рядку 18.
Перезапустіть налагоджувач. На цей раз, коли ми потрапили в точку зупинки в рядку 18, ми бачимо такі значення:
n [int]: 5 n1 [int]: 3 n2 [int]: 5 sum [int]: 5Салют! Схоже, ми отримали його! Чудова робота, ви зберегли день для Фібоначчі, Inc.!
Натисніть кнопку Продовжити , щоб переконатися, що програма повертає правильне значення.
5 The program '[105260] DotNetDebugging.dll' has exited with code 0 (0x0).І це повертає правильний результат.
Ви впоралися! Ви налагодження деякий код, який ви не писали за допомогою налагоджувача .NET у Visual Studio.
У наступній одиниці ви дізнаєтеся, як полегшити налагодження коду, використовуючи вбудовані в .NET функції журналювання та трасування.