Начнем с того, что разберемся что такое отладка программы и обсудим зачем и когда необходимо пользоваться отладчиком.
Отладка программы – это тот этап разработки программы, на котором программист ищет и устраняет всевозможные ошибки кода. Особенно нас интересуют ошибки, которые возникают на этапе выполнения программы, а не на этапе компиляции. Именно они могут привести к серьезным проблемам и сбоям программы, обнаружить причину которых бывает непросто.
Иногда, чтобы найти ошибку и посмотреть, что к ней приводит, надо пройти какой-то участок кода по шагам, по которым программа проходит в момент выполнения.
Так же интересно увидеть, как при этом меняются данные программы (значения переменных): какие значения они принимают в определённые моменты времени. В 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 – там есть вкладка в которой можно отслеживать, как изменяются данные переменных в реальном времени.”
а если нет такой вкладки, как ее открыть?
ОТЛАДКА ->НАЧАТЬ ОТЛАДКУ далее снова ОТЛАДКА-> ОКНА->ЛОКАЛЬНЫЕ
Спасибо, давно найти не мог это окно