Пошаговая отладка в Visual Studio. Рассказываем и показываем ОТ и ДО
Отладка кода в Visual Studio происходит довольно просто, если сравнивать это т процесс с другими IDE. Плюс отладчик Visual Studio обладает довольно широкими возможностями и позволяет отлаживать различные технологии, а если имеющихся средств не хватает, то можно воспользоваться дополнениями.
Отладка кода — это один из самых важных процессов. Без отладки в свет не выходит ни одно нормальное приложение. Потому что , независимо от опыта разработчика, код не всегда работает так , как нужно. А иногда и вообще работает совершенно не так. Вот тут как раз и приходит на помощь отладчик, который позволит разобраться , что не так , и найти изъяны. Можно , конечно , много часов провести за самостоятельным выявлением багов, но отладчиком все-таки быстрее и проще.
В то же время отладка кода — это не волшебная палочка, которая быстренько найдет и исправит все недочеты вашего кода. Отладка — это процесс, при котором код пошагово выполняется в некой программе, например , в Visual Studio. В процессе выполнения идет поиск точек, где вы могли допустить ошибку. А вы в это время можете анализировать свой код и вносить необходимые правки для устранения «косяков».
Работа с отладчиком , даже с таким простым , как Visual Studio, требует определенных знаний и понимания , что там внутри происходит. Умение работать с отладчиком вам в любом случае пригодится, если вы хотите связать свою жизнь с разработкой ПО. В этой статье мы ознакомим вас с процессом отладки при помощи Visual Studio.
Отладка кода в Visual Studio
- орфографические ошибки или опечатки,
- неправильно подключенные API,
- неправильное размещение последних корректировок в код,
- и др.
- ошибка компиляции;
- ошибка преобразования типа;
- код не поддерживает синтаксис;
- и др .
Как запустить отладчик Visual Studio
- Запустить саму программу Visual Studio.
- Откр ыть код приложения, который необходимо отладить.
- Потом при помощи нажатия клавиши «F5» запустить режим отладки. Также это можно сделать через меню, если нажать «Отладка», а потом «Начать отладку» .
-
последовательность исполнения кода;
-
работу памяти;
-
значение переменных и др.
Какая информация выводится отладчиком Visual Studio
- Breakpoints. Тут собраны сведения о ваших точках останова.
- Output. Здесь выводятся служебные сообщения от самой Visual Studio.
- Watch. Здесь расположены переменные , за которыми вы наблюдаете в коде ; внести их можно только вручную.
- Autos. Здесь находится список переменных, с которыми прямо сейчас проводится работа.
- Locals. Здесь выв о д я тся все локальные переменные.
- Immediate. Здесь выв о д я тся переменные, которые вы т ребуете.
- Call Stack. Здесь расположен список вызываемых функций.
- Threads. Тут выводится информация о б уже стартовавших потоках вашего приложения.
- Modules. Отображаются все загруженные модули.
- Processes. Отображаются процессы модулей.
- Memory. Отображается память рассматриваемых модулей.
- Disassembly. Тут можно увидеть , как отображается ваш код на языке более высокого уровня.
- Registers. Выводится регистр значения.
В заключение
Отладка в Visual Studio дает возможность довольно быстро решить проблемы с вашим кодом. Да, без определенных знаний и понимания запустить и понять отладчик Visual Studio будет нелегко, но с опытом все станет понятнее. В разработке без отладки кода — путь в никуда , п отому что стабильность работы приложения — это залог его качества. И если на самом старте разработк и игнорировать этот процесс, то нет смысла идти дальше.
Мы будем очень благодарны
если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.
Урок №26. Отладка программ: степпинг и точки останова
Как ни странно, программирование может быть сложным и ошибок может быть очень много. Ошибки, как правило, попадают в одну из двух категорий: синтаксические или семантические/смысловые.
Типы ошибок
Синтаксическая ошибка возникает, когда вы пишете код, который не соответствует правилам грамматики языка C++. Например, пропущенные точки с запятой, необъявленные переменные, непарные круглые или фигурные скобки и т.д. В следующей программе есть несколько синтаксических ошибок:
К счастью, компилятор ловит подобные ошибки и сообщает о них в виде предупреждений или ошибок.
Семантическая ошибка возникает, когда код является синтаксически правильным, но делает не то, что задумал программист.
Иногда это может привести к сбою в программе, например, если делить на ноль:
Либо делать вообще не то, что нужно:
К сожалению, компилятор не ловит подобные ошибки, так как он проверяет только то, что вы написали, а не то, что вы хотели этим сделать.
В примерах, приведенных выше, ошибки довольно легко обнаружить. Но в большинстве программ (в которых больше 40 строк кода), семантические ошибки увидеть с помощью простого просмотра кода будет не так-то и легко.
И здесь нам на помощь приходит отладчик.
Отладчик
Отладчик (или «дебаггер», от англ. «debugger») — это компьютерная программа, которая позволяет программисту контролировать выполнение кода. Например, программист может использовать отладчик для выполнения программы пошагово, последовательно изучая значения переменных в программе.
Старые дебаггеры, такие как GDB, имели интерфейс командной строки, где программисту приходилось вводить специальные команды для старта работы. Современные дебаггеры имеют графический интерфейс, что значительно упрощает работу с ними. Сейчас почти все современные IDE имеют встроенные отладчики. То есть, вы можете использовать одну среду разработки как для написания кода, так и для его отладки (вместо постоянного переключения между разными программами).
Базовый функционал у всех отладчиков один и тот же. Отличаются они, как правило, тем, как этот функционал и доступ к нему организованы, горячими клавишами и дополнительными возможностями.
Примечание: Перед тем как продолжить, убедитесь, что вы находитесь в режиме конфигурации «Debug». Все скриншоты данного урока выполнены в Visual Studio 2019.
Степпинг
Степпинг (англ. «stepping») — это возможность отладчика выполнять код пошагово (строка за строкой). Есть три команды степпинга:
Команда «Шаг с заходом»
Команда «Шаг с обходом»
Команда «Шаг с выходом»
Мы сейчас рассмотрим каждую из этих команд в индивидуальном порядке.
Команда «Шаг с заходом»
Команда «Шаг с заходом» (англ. «Step into») выполняет следующую строку кода. Если этой строкой является вызов функции, то «Шаг с заходом» открывает функцию и выполнение переносится в начало этой функции.
Давайте рассмотрим очень простую программу:
Как вы уже знаете, при запуске программы выполнение начинается с вызова главной функции main(). Так как мы хотим выполнить отладку внутри функции main(), то давайте начнем с использования команды «Шаг с заходом».
В Visual Studio, перейдите в меню «Отладка» > «Шаг с заходом» (либо нажмите F11 ):

Если вы используете другую IDE, то найдите в меню команду «Step Into/Шаг с заходом» и выберите её.
Когда вы это сделаете, должны произойти две вещи. Во-первых, так как наше приложение является консольной программой, то должно открыться консольное окно. Оно будет пустым, так как мы еще ничего не выводили. Во-вторых, вы должны увидеть специальный маркер слева возле открывающей скобки функции main(). В Visual Studio этим маркером является жёлтая стрелочка (если вы используете другую IDE, то должно появиться что-нибудь похожее):

Стрелка-маркер указывает на следующую строку, которая будет выполняться. В этом случае отладчик говорит нам, что следующей строкой, которая будет выполняться, — будет открывающая фигурная скобка функции main(). Выберите «Шаг с заходом» еще раз — стрелка переместится на следующую строку:

Это значит, что следующей строкой, которая будет выполняться, — будет вызов функции printValue(). Выберите «Шаг с заходом» еще раз. Поскольку printValue() — это вызов функции, то мы переместимся в начало функции printValue():

Выберите еще раз «Шаг с заходом» для выполнения открывающей фигурной скобки printValue(). Стрелка будет указывать на std::cout << nValue; .
Теперь выберите «Шаг с обходом» (F10). Вы увидите число 5 в консольном окне.
Выберите «Шаг с заходом» еще раз для выполнения закрывающей фигурной скобки printValue(). Функция printValue() завершит свое выполнение и стрелка переместиться в функцию main(). Обратите внимание, в main() стрелка снова будет указывать на вызов printValue():

Может показаться, будто отладчик намеревается еще раз повторить цикл с функцией printValue(), но в действительности он нам просто сообщает, что он только что вернулся из этой функции.
Выберите «Шаг с заходом» два раза. Готово, все строки кода выполнены. Некоторые дебаггеры автоматически прекращают сеанс отладки в этой точке. Но Visual Studio так не делает, так что если вы используете Visual Studio, то выберите «Отладка» > «Остановить отладку» (или Shift+F5 ):

Таким образом мы полностью остановили сеанс отладки нашей программы.
Команда «Шаг с обходом»
Как и команда «Шаг с заходом», команда «Шаг с обходом» (англ. «Step over») позволяет выполнить следующую строку кода. Только если этой строкой является вызов функции, то «Шаг с обходом» выполнит весь код функции в одно нажатие и возвратит нам контроль после того, как функция будет выполнена.
Примечание для пользователей Code::Blocks: Команда «Step over» называется «Next Line».
Отладка кода Node.js в Visual Studio Code
Редактор Visual Studio Code предлагает огромное количество встроенных функций. Кроме того, он предоставляет поддержку приложений по отладке кода. В этом руководстве мы расскажем, как настроить VS Code для отладки кода Node.js. Для этого мы загрузим расширение Debugger для Chrome, затем создадим и запустим конфигурацию отладки, а также установим точки останова.
Требования
- Локальная установка Node.js (чтобы найти инструкции по установке, выберите соответствующую систему: mac OS, Debian, CentOS, Ubuntu).
- Последняя версия Visual Studio Code.
- Расширение Debugger, установленное в Visual Studio Code.
В данном мануале мы выполним отладку кода приложения по имени Quick Chat. Конечно, описанные здесь инструкции вы можете протестировать на любом своем проекте JavaScript, который можно запустить на сервере Node.
Если у вас нет такого проекта, создайте простой тестовый проект.
1: Создание тестового приложения (опционально)
Разумеется, чтобы выполнить примеры из этого мануала, вам нужно подготовить проект. Как сказано выше, здесь мы используем в этих целях приложение Quick Chat.
С помощью Git клонируйте репозиторий приложения Design-and-Build-a-Chat-Application-with-Socket.io. Помимо этого, вы можете скачать zip-файл и распаковать его.
В этом руководстве мы будем использовать код из 8 части проекта. Прежде всего найдите минутку, чтобы ознакомиться с тем, как в идеале должно работать приложение.
Перейдите в каталог проекта, а затем в каталог part-8:
cd Design-and-Build-a-Chat-Application-with-Socket.io
cd part-8
Далее установите пакеты npm для данного проекта:
Наконец, запустите сервер:
Если вы откроете адрес 127.0.0.1:3000 в Chrome, браузер запросит имя пользователя. Введите имя и нажмите кнопку Chat!, после чего вы будете перенаправлены в приложение и увидите следующее:
User joined the chat.
Если ввести в поле внизу окна какой-то текст и нажать кнопку Send, ваше сообщение отобразится в чате.
Если вы откроете новую вкладку браузера и посетите тот же URL, вы сможете войти в систему как другой пользователь. Таким образом, вы сможете читать сообщения чата в обеих вкладках браузера. Это нормальное и ожидаемое поведение нашего приложения.
2: Создание точки останова
Далее мы создадим в приложении точку останова – такие точки позволяют приостановить выполнение кода и проверить его.
Quick Chat – это приложение Node/Express, которое использует Socket.io, чтобы пользователи могли общаться друг с другом в режиме реального времени. Давайте добавим точку останова при подключении клиента к серверу.
Чтобы создать такую точку в VS Code, кликните на пустое пространство слева от номеров строк.
Создайте точку останова внутри функции, которая вызывается при каждом подключении пользователя, это 15 по счету строка. При этом слева от номера строки появится красный кружок.
// .
io.on(‘connection’, socket => <
console.log(‘a user connected’);
// .
>);
Даже если вы отлаживаете другое приложение, создайте в нем свою точку останова, которую будет легко запустить: например, при запуске приложения, вызове маршрута и т.д.
3: Панель отладки VS Code
Обратите внимание на боковую панель редактора (по умолчанию она находится слева). Чтобы открыть панель отладки, найдите в этой панели кнопку с перечеркнутым жуком и нажмите ее. Здесь вы увидите четыре разных раздела: variables, watch, call stack и breakpoints.
В верхней части панели вы увидите зеленую кнопку воспроизведения и выпадающий список – на нем будет надпись No Configurations, если вы еще не создали конфигурацию отладки. Соответственно, если ранее вы создали конфигурацию, вы увидите ее в этом списке.
VS Code хранит конфигурации отладки в файле launch.json внутри папки .vscode. VS Code помогает создать не только эту папку и файл, но в том числе и предопределенные конфигурации. Давайте попробуем создать нашу первую конфигурацию.
Итак, чтобы создать исходный файл launch.json, кликните на выпадающий список No Configurations и выберите Add Configuration. На экране появится всплывающее окно, которое можно проигнорировать. Приступим же к созданию нашей первой конфигурации.
Ключевыми компонентами конфигурации отладки являются:
- name – имя вашей конфигурации, отображаемое в выпадающем списке.
- request – тип действия, которое вы хотите выполнить.
- type – тип отладчика конфигурации. Это может быть Node, Chrome, PHP и т.д.
Кроме того, VS Code поможет определить другие свойства через IntelliSense.
4: Отладка с помощью программы запуска
Первая конфигурация запустит приложение Node в режиме отладки. Запуск в этом режиме позволяет VS Code подключаться к приложению через определенный порт. Кроме того, нам нужно определить файл программы, которая будет запускаться. В итоге конфигурация выглядит так:
Чтобы запустить эту конфигурацию, выберите ее в выпадающем списке и нажмите зеленую кнопку воспроизведения. В правом верхнем углу появится панель действий отладки с кнопками step, continue, restart и stop.
В дальнейшем используйте флаг –inspect, чтобы запустить приложение Node в режиме отладки.
5: Отладка по идентификатору процесса
Вторая конфигурация, которую мы рассмотрим, – это подключение к процессу Node по ID этого процесса. Подобный сценарий будет актуален для приложений, которые уже запущены в вашей локальной среде.
Для этого перед запуском конфигурации отладки нам нужно самостоятельно запустить сервер Node. Используйте следующую команду для запуска вашего сервера (вместе с флагом –inspect, как говорилось ранее). Замените app.js именем вашего файла.
node —inspect app.js
Теперь, когда сервер запущен, вы можете запустить конфигурацию отладки. При появлении запроса выберите процесс Node, соответствующий команде, которую вы только что выполнили для запуска сервера.
После этого соединение будет установлено успешно.
6: Отладка через подключение к порту
Третий пример конфигурации – подключение к существующему приложению Node, работающему по заданному порту.
<
«type»: «node»,
«request»: «attach»,
«name»: «Attach to Port»,
«port»: 9229
>,
9229 – стандартный порт для отладки при использовании флага –inspect, поэтому мы и будем использовать его здесь.
Мы уже запустили наш сервер с помощью предыдущей конфигурации, поэтому мы можем продолжить работу. Выберите конфигурацию Attach to Port в списке и нажмите кнопку воспроизведения.
Если вы указываете port, localRoot и remoteRoot, вы можете также выполнить отладку, подключившись через сетевое соединение к удаленному компьютеру.
7: Отладка через подключение к порту и Nodemon
Это наш последний пример конфигурации. Здесь мы настроим предыдущую конфигурацию для поддержки автоматической перезагрузки с помощью Nodemon. Nodemon – это пакет, который автоматически перезагружает ваш сервер Node и при этом сохраняет все файлы. Обычно он устанавливается глобально через npm. Этот пакет значительно упрощает параллельное внесение изменений и тестирование.
<
«type»: «node»,
«request»: «attach»,
«name»: «Nodemon Debug»,
«port»: 9229,
«restart»: true
>,
Примечание: Современные версии VS Code поддерживают параметр runtimeExecutable, который можно использовать для другой конфигурации Node.js+Nodemon.
Чтобы установить Nodemon, используйте следующую команду:
npm install -g nodemon
Пакет Nodemon автоматически перезапускает сервер, поэтому мы установили значение true для свойства restart в конфигурации отладки. Таким образом, при перезапуске сервера отладчик подключится повторно. Чтобы проверить, как это работает, запустите свой сервер с помощью этой команды (заменив node на nodemon):
nodemon —inspect app.js
Затем запустите вашу конфигурацию.
Здесь мы используем Nodemon, значит, наш сервер будет автоматически перезагружен, если мы внесем изменения в файл и сохраним его.
Итак, мы определили конфигурацию отладки для обработки этого сценария и повторного подключения. Внесите небольшие изменения в свой файл, сохраните его и убедитесь, что при перезапуске сервера ваш отладчик смог подключиться повторно.
Отладка кода

В C#, как и в других появившихся до .NET языках, главная методика по отладке состоит в добавлении точек останова и изучении того, что происходит в коде в конкретные моменты во время его выполнения.
Точки останова
Точку останова (breakpoint) в Visual Studio можно помещать на любую строку кода, которая в действительности выполняется. Самый простой способ — щелчок на необходимой строке в окне редактора кода внутри затененной области вдоль левого края окна документа (или выделение нужной строки и нажатие клавиши <F9>). Это приводит к размещению в данной строке точки останова, которая вызывает прерывание процесса выполнения и передачу управления отладчику. Как и в предыдущих версиях Visual Studio, точка останова обозначается большим кружком слева от соответствующей строки в окне редактора кода. Кроме того, Visual Studio выделяет саму строку, отображая ее текст и фон разными цветами. Щелчок на кружке приводит к удалению точки останова.
Если останов на определенной строке каждый раз не подходит для решения имеющейся проблемы, можно создать так называемую условную точку останова. Для этого выберите в меню Debug (Отладка) пункт Windows — Breakpoints (Окнo — Точки останова). Откроется диалоговое окно, позволяющее указать желаемые детали для точки останова. В этом окне можно выполнять следующие действия:
Указать, что выполнение должно прерываться лишь после прохождения точки останова определенное количество раз.
Указать, что точка останова должна вступать в действие при каждом n-ном достижении строки, например, при каждом 20-м ее выполнении (это удобно при отладке больших циклов).
Задать точки останова относительно переменных, а не команд. В таком случае наблюдение будет вестись за значением указанной переменной, и точки останова будут активизироваться при каждом изменении значения этой переменной. Однако этот вариант может сильно замедлить выполнение кода, поскольку на проверку, не изменилось ли значение отслеживаемой переменной после выполнения каждой очередной инструкции, будет тратиться дополнительное время процессора.
Слежения
После срабатывания точки останова обычно необходимо просмотреть значения переменных. Проще всего это сделать, наведя курсор мыши на имя интересующей переменной прямо в окне редактора кода. Это приводит к появлению небольшого всплывающего окошка, в котором показано значение данной переменной; это окошко можно развернуть, чтобы просмотреть дополнительные детали.
Для просмотра значений переменных можно также использовать окно Autos (Автоматические). Окно Autos представляет собой окно с вкладками, которое появляется лишь тогда, когда программа выполняется в режиме отладки. Если вы его не видите, попробуйте выбрать в меню Debug (Отладка) пункт Windows — Autos (Окна — Автоматические).
В этом окне рядом с переменными, которые являются классами или структурами, отображается пиктограмма с изображением знака «плюс», щелчок на которой позволяет развернуть представление переменной и просмотреть значения ее полей.
Три предлагаемых в этом окне вкладки предназначены для наблюдения за переменными трех разных категорий:
Вкладка Autos (Автоматические) позволяет просматривать значения нескольких последних переменных, к которым осуществлялся доступ в процессе выполнения программы.
Вкладка Locals (Локальные) позволяет просматривать значения переменных, к которым получается доступ в методе, выполняемом в текущий момент
Вкладка Watch (Слежение) позволяет просматривать значения любых интересующих переменных за счет явного указания их имен непосредственно в окне Watch.
Исключения
Исключения являются замечательным средством для обеспечения надлежащей обработки ошибок в поставляемом приложении. В случае правильного применения они позволяют обрести уверенность в том, что приложению удастся справиться с трудностями, а перед пользователем никогда не появится диалоговое окно с техническим описанием неполадки. К сожалению, во время отладки исключения не столь замечательны. На то имеются :
Если исключение возникает во время отладки, часто не нужно, чтобы оно обрабатывалось автоматически, особенно если это подразумевает аккуратное завершение программы. Напротив, отладчик должен помочь выяснить, по какой причине возникло это исключение. Конечно же, трудность состоит в том, что в случае написания качественного надежного и отказоустойчивого кода, программа будет автоматически обрабатывать практически все, в том числе и неполадки, которые требуется обнаружить.
Если возникло исключение, для которого не было предусмотрено обработчика, исполняющая среда .NET все равно будет пытаться его найти. К сожалению, к моменту, когда она обнаружит, что обработчик не существует, выполнение программы будет завершаться. Никакого стека вызовов, следовательно, не останется, и просматривать значения каких-либо переменных будет невозможно, потому что все они будут находиться за пределами области видимости.
Конечно, можно устанавливать точки останова в блоках catch, но это часто особо не помогает, поскольку при достижении блока catch поток управления по определению покинет соответствующий блок try. Это означает, что переменные, значения которых, скорее всего, следовало изучить для выяснения того, что пошло не так, покинут область видимости. Не будет даже возможности просматривать трассировочные данные стека для выяснения, какой метод выполнялся во время срабатывания оператора throw, поскольку управление уже покинет этот метод. Разумеется, помещение точки останова в оператор throw позволит решить эту проблему, но надо учитывать, что при написании кода защищенным образом операторов throw будет в коде очень много. Как тогда угадать, какой из них срабатывает и приводит к генерации исключения?
На самом деле в Visual Studio предлагается очень действенное решение. Если заглянуть в меню Debug (Отладка), то можно будет обнаружить там пункт Exceptions (Исключения). В случае выбора этого пункта открывается диалоговое окно Exceptions (Исключения). Это окно позволяет указывать, что должно происходить при выдаче исключения. Здесь можно указать, что выполнение должно продолжаться или же останавливаться с переходом в режим отладки, в случае чего произойдет останов, а отладчик окажется прямо на самом операторе throw:

Visual Studio известно обо всех классах исключений, которые доступны в базовых классах .NET, и о многих таких исключениях, которых могут выдаваться за пределами среды .NET. Распознавать автоматически специальные классы исключений, создаваемые разработчиками, Visual Studio не умеет, но позволяет вручную добавлять такие классы исключений в список и, следовательно, указывать, какие из таких исключений должны приводить к немедленному прекращению выполнения приложения. Для этого необходимо щелкнуть на кнопке Add (Добавить), которая активизируется при выборе самого верхнего узла в дереве, и ввести имя специального класса исключения.
Дополнительные команды отладки исходного кода
Компиляция практически всего коммерческого программного обеспечения на стадии отладки и на стадии подготовки окончательной версии продукта должна проводиться немного по-разному. Среда Visual Studio способна понимать это, поскольку сохраняет информацию обо всех параметрах, которые ей надлежит передавать компилятору. Для поддержки разных вариантов компоновки проекта Visual Studio потребуется сохранять подобную информацию в более чем одном экземпляре. Разные экземпляры такой информации называются конфигурациями. При создании проекта Visual Studio автоматически предлагает на выбор две таких конфигурации, которые называются, соответственно, Debug (Отладка) и Release (Выпуск):
Конфигурация Debug обычно указывает, что никакие операции по оптимизации выполняться не должны, в исполняемом коде должна присутствовать дополнительная отладочная информация, а компилятор должен предполагать, что в коде определен препроцессорный символ отладки Debug, если только он не был явно отменен с помощью директивы #undefined.
Конфигурация Release указывает, что компилятор должен проводить в отношении компилируемого кода оптимизацию, в исполняемом коде не должно присутствовать никакой дополнительной информации, а компилятор не должен предполагать наличие препроцессорного символа Debug.
Можно также определять собственные конфигурации. Это необходимо, например, для компоновки приложения с несколькими отличающимися версиями. Раньше из-за проблем, связанных с поддержкой кодировки Unicode в Windows NT, но не в Windows 95, для многих проектов на С++ было принято создавать две конфигурации — одну для Unicode, а вторую для (multibyte character set — набор многобайтных символов).