Начнем с того, что разберемся что такое отладка программы и обсудим зачем и когда необходимо пользоваться отладчиком.
Отладка программы – это тот этап разработки программы, на якому програміст шукає і усуває всілякі помилки коду. Особенно нас интересуют ошибки, которые возникают на этапе выполнения программы, а не на етапі компіляції. Именно они могут привести к серьезным проблемам и сбоям программы, обнаружить причину которых бывает непросто.
Иногда, чтобы найти ошибку и посмотреть, что к ней приводит, надо пройти какой-то участок кода по шагам, по которым программа проходит в момент выполнения.
Так само цікаво побачити, як при цьому змінюються дані програми (значения переменных): какие значения они принимают в определённые моменты времени. У Microsoft Visual Studio для такої роботи, к счастью, есть отладчик. В этой статье будут рассмотрены основы работы с отладчиком.
Допустим, надо проанализировать и отладить следующий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include <iostream> using namespace std; int main() { int var55 = 55; for (int i = 3; i >= 0; i--) { cout << var55 / i << endl; } return 0; } |
Наберіть його в Visual Studio. В этом коде нет синтаксических ошибок, которые не пропустил бы компилятор до начала выполнения программы. Программа начнет выполняться, проробить певну ділянку роботи і виникне помилка:
Начнем отладку и посмотрим, в следствии чего произошла ошибка на этапе выполнения. Для этого, перебуваючи в Visual Studio, надо нажать клавишу F10. Программа начнет выполнятся и остановится на первой выполняемой строке. Ви побачите жовту стрілку біля тієї рядки програми, которая выполняется в данный момент:
Чтобы перейти к выполнению следующего шага, надо снова нажать на F10. Желтая стрелка переместится на другую строку:
Тепер подивіться вниз екрану в Visual Studio – там есть вкладка в которой можно отслеживать, как изменяются данные переменных в реальном времени.
Тут переменная только создается и хранит какой-то мусор. При следующем нажатии на F10стрелка переместится в строку 8. Во вкладке уже будет видно, что объявлена переменная i, а также какое значение приобрела переменная var55.
Нажимайте на F10 і дивіться, как изменяются данные. Когда вы будете проходить отладчиком по циклу четвертый раз, переменная i примет значение 0. Это и приводит к ошибке выполнения программы так как на 0 делить нельзя.
Для выхода из режима отладки – нажмитеShift F5. Если код большой и вам надо отладить его с какой-то определенной строки, а не с самого начала – просто встановіть курсор в потрібний рядок і натиснітьСtrl F10.
Точка останова (breakpoint) і Розумна точка зупинки
На сайте msdn есть такое определение точки останова:
Если надо выполнить программу до определённого места в коде и только достигнув его, запустить отладчик – используют точку останова.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include <iostream> using namespace std; int main() { int var55 = 55; cout << "Start!\n"; for (int i = 3; i >= 0; i--) { cout << var55 / i << endl; } cout << "Finish!\n"; return 0; } |
Чтобы установить точку останова в строку cout << var55 / i << endl; , поставьте курсор перед ней и нажмите F9. После этого можно будет увидеть возле этой строки красную точку – это она и есть.
Нажав теперь клавишу F5, запустится программа, выполнится до той строки, де ми встановили точку зупину і включиться режим відладчика.
В консоли будет отображаться то, что успело выполниться до 12-й строки.
Дальше можно отлаживать программу, как и раньше – нажимая F10 и наблюдая за переменными. Все що виконується в програмі, будет отображаться в консоли. Чтобы снять точку останова – треба поставити курсор в рядок де вона знаходиться і натиснутиF9
Если, наприклад, итераций не 3, как в нашем коде, а 333 и мы видим, що помилка з'являється на останніх ітераціях, правда не очень хочется проходить все эти шаги цикла отладчиком? Есть возможность пропустить, скажем, 330 итераций, і проаналізувати лише останні 3. Для этого воспользуемся умной точкой останова. Сначала скопируйте этот код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <iostream> using namespace std; int main() { cout << "Start!\n"; for (int i = 0; i < 333; i++) { cout << i << endl; } cout << "Finish!\n"; return 0; } |
Тепер встановіть звичайну точку зупину (F9) и щелкните по ней правой кнопкой мыши. Відкриється меню, що випадає з додатковими можливостями для неї.
Чтобы выполнить программу до 330-й итерации и перейти в режим отладки, выберите Число попаданий.
Теперь выбираем “если число попаданий равно”, пишем 330 и жмем ОК. На точке останова появится белый +. Это означает, что она обладает дополнительными условиями. Нажимаем F5, для запуска программы. Вона призупиниться і перейде в режим налагодження на 330 ітерації (на 330-му попаданні в точку зупину). Далее уже нажимая F10 проходим по циклу до последней итерации.
Это основные, але далеко не всі можливості відладчика Microsoft Visual Studio.
>> Это основные, але далеко не всі можливості відладчика Microsoft Visual Studio. Со временем рассмотрим и другие.
Я, звичайно, не знаю, що там за ще можливості в студії є. Але мені здається в статті не вистачає згадки про стек викликів і обчислюваних значень (на одній з картинок у вас видно вкладка – “контрольні значення” – це воно начебто).
Про стек викликів можна на прикладі рекурсивної функції розповісти, мені здається. Ви ж якраз недавно тему рекурсії розкрити намагалися :).
Я б не зациклювався на студії – в інших середовищах теж саме, відрізняються тільки назви і розташування віконець…
Можна було в цілому про налагодження написати – Ну наприклад, можна адже стратегічно розставляти cout і таким чином знаходити місце з помилкою )). Принаймні, поки зручних IDE не з'явилося – так і робили, та й зараз іноді це зручніше. У стандартній бібліотеці є спеціальні потоки clog і cerr, які можна юзати замість cout щоб стандартний потік виведення не забивати дурницями (ну а ще їх можна перенаправити куди-небудь). У бібліотеці Qt є метод QObject::QDebug() дозволяє виводити повідомлення для налагодження в спеціальне віконце відладчика.
“Тепер подивіться вниз екрану в Visual Studio - там є вкладка в якій можна відстежувати, як змінюються дані змінних в реальному часі.”
а якщо немає такої вкладки, як її відкрити?
ВІДЛАДКА ->Почати налагодження далі знову ОТЛАДКА-> вікна->Локальні
Спасибо, давно знайти не міг це вікно