Огромную роль в программировании играет процесс отладки программ, а потому данная тема не зря нами затронута и должна быть подробно рассмотрена. Если при отладке программы возникла ошибка, вы должны знать, как её исправить. Можно хорошо знать язык программирования, но не знать как исправить случайно появившуюся ошибку.
В итоге — неграмотно потраченное время на отлавливание ошибок и не законченная программа. Ошибки делают все, начинающие и даже самые искусные программисты, это лишь дело времени. Чаще всего ошибки появляются из-за не внимательности, где-то запятую пропустили или не поставили скобочку и т.д. Но даже такие банальные ошибки необходимо отлавливать и исправлять. Данная статья не является набором правил для отладки программ, моя цель — ввести Вас в суть проблемы и дать несколько рекомендаций, которые позволят вам сэкономить драгоценное время.
Есть два типа ошибок:
- синтаксические ошибки — ошибки, которые компилятор может отловить при сборке проекта. Хотя уже сейчас такого типа ошибки компилятор отлавливает ещё до сборки проекта.
- ошибки времени выполнения, эти ошибки не всегда легко определить. Проект будет собран компилятором, и даже на первый взгляд нормально работать.
Ошибки времени выполнения появляются при определённых условиях (частные случаи). В силу того, что эти ошибки отлавливаются во время работы программы, а не при компиляции, они имеют такое название.
Зачем нужна отладка по USB в Андроид? Как включить отладку по USB в Андроид?
Рассмотрим несколько простых примеров, в которых специально допустим по одной ошибке.
// синтаксическая ошибка int main( // специально пропущена закрывающая скобочка main функции
Компилятор должен сгенерировать ошибку типа:
Ошибка 1 error C2143: синтаксическая ошибка: отсутствие «)» перед «
Тут всё предельно ясно, кстати в сгенерированном сообщении об ошибке указывается строка и даже столбец, с ошибкой.
// синтаксическая ошибка int main() < return 0 // ошибка тут, пропущен символ точки с запятой >
Сообщение компилятора об ошибке:
Ошибка 1 error C2143: синтаксическая ошибка: отсутствие «;» перед «>» e:installc++snakesnakesnake.cpp 10 1 snake.
Сообщения об ошибках могут различаться, в зависимости от используемой IDE. Например данные сообщения были сгенерированы MVS2010, где C2143 — код ошибки, описание которой можно найти на сайте MSDN. Стало быть, в сообщении указываются:
- код ошибки — C2143
- тип ошибки — синтаксическая ошибка
- суть ошибки — отсутствие «;» перед «>»
- адрес исполняемого файла — e:installc++snakesnakesnake.cpp
- номер строки — 10
- столбец — 1
- имя файла — snake
По большому счёту, такие ошибки и отлавливать не требуется, это делает за нас компилятор. Наша же задача — понять сообщение об ошибке и исправить её. Что касается ошибок времени выполнения, то компилятор не может их поймать. Поэтому эта задача полностью ложится на программиста. Но вам, мои читатели, по секрету скажу, что есть инструмент отладки Valgrind, который хорошо справляется с этой работой.
Без этого вы не станете программистом! Найти ошибку в коде. Отладка. Как пользоваться отладчиком #23
Как бы то ни было, и такие ошибки можно легко отлавливать. Вот, к примеру, рассмотрим нередкий случай возникновения логической ошибки.
int counter = 1; while (counter = 1) // ОШИБКА
В этом фрагменте кода допущена ошибка в условии цикла while , вместо знака сравнения == , стоит знак присваивания = . Такую ошибку компилятор не заметит, да и программисту трудно будет её отловить. Как только начнёт работать цикл, программа перестанет нормально функционировать, просто зависнет. а всё потому, что цикл бесконечный, то есть выхода из него нет. В данном фрагменте кода, ошибку найти легко, но вот когда программа большая и в цикле выполняется несколько десятков операторов, то понять почему не работает код не просто. Для этого мы добавляем одну строку в тело цикла while .
int counter = 1; while (counter = 1) // ОШИБКА < counter—; cout
int counter = 1; while (counter == 1) // исправленная ошибка
Суть данного метода — проанализировать значения переменных по ходу работы программы и понять, в чём ошибка. Узнать более подробно о стратегиях отладки, советах и приемах, помогающих ускорить этот процесс.
Источник: cppstudio.com
22.Отладка. Общие принципы, методы отладки. Взаимосвязь процессов тестирования и отладки, использование автоматических средств отладки
Использование языков программирования высокого уровня, таких как Java, обычно упрощает отладку, поскольку содержат такие средства как обработка исключений, сильно облегчающие поиск источника проблемы. В некоторых низкоуровневых языках, таких как Ассемблер, ошибки могут приводить к незаметным проблемам — например, повреждениям памяти или утечкам памяти, и бывает довольно трудно определить, что стало первоначальной причиной ошибки. В этих случаях, могут потребоваться изощрённые приёмы и средства отладки.
Отладка = Тестирование + Поиск ошибок + Редактирование
Виды отладки ПО, включая тестирование (в нашей стране).
- Автономная отладка. Последовательное раздельное тестирование различных частей программ, входящих в ПО, с поиском и исправлением в них фиксируемых при тестировании ошибок. Она фактически включает отладку каждого программного модуля и отладку сопряжения модулей.
- Комплексная отладка. Тестирование ПО в целом с поиском и исправлением фиксируемых при тестировании ошибок во всех документах (включая тексты программ ПО), относящихся к ПО в целом. К таким доку-ментам относятся определение требований к ПО, спецификация качества ПО, функциональная спецификация ПО, описание архитектуры П.О. и тексты программ ПО.
- Синтаксическая отладка. Синтаксические ошибки выявляет компилятор, поэтому исправлять их достаточно легко.
- Семантическая (смысловая) отладка. Ее время наступает тогда, когда синтаксических ошибок не осталось, но результаты программа выдает неверные. Здесь компилятор сам ничего выявить не сможет, хотя в среде программирования обычно существуют вспомогательные средства отладки, о которых мы еще поговорим.
Взаимосвязь процессов тестирования и отладки через алгоритм отладки.
После того как написан рабочий код производятся тестовые запуски программы на различных наборах тестовых данных.
При этом тестер или программист заранее должны получить контрольный результат с которым будет идти сверка работы проверяемого кода.
В случае обнаружения расхождений между контрольным и фактическим результатами, начинается поиск проблемного участка кода и выявление ошибок вышеуказанными способами.
Средства автоматического тестирования исходного кода программ.
Основной прием здесь это создание тестов исходного текста, которые будут применены к тестируемому участку кода, а система тестирования сообщит об их результатах.
Примерами таких систем могут быть: встроенный модуль doctest в Python и мультиязыковая библиотека тестирования xUnit, распространяемая на условиях GNU/GPL и LGPL. Основа применения всех этих средств и техник это разбиение одной большой задачи на ряд четких и более маленьких задач.
Источник: studfile.net
Урок №26. Отладка программ: степпинг и точки останова
Синтаксическая ошибка возникает, когда вы пишете код, который не соответствует правилам грамматики языка C++. Например, пропущенные точки с запятой, необъявленные переменные, непарные круглые или фигурные скобки и т.д. В следующей программе есть несколько синтаксических ошибок:1
#include ; // директивы препроцессора не заканчиваются точкой с запятой
return 0 // пропущена точка с запятой в конце стейтмента
К счастью, компилятор ловит подобные ошибки и сообщает о них в виде предупреждений или ошибок.
Семантическая ошибка возникает, когда код является синтаксически правильным, но делает не то, что задумал программист.
Иногда это может привести к сбою в программе, например, если делить на ноль:
Иногда это может привести к неверным результатам:
Либо делать вообще не то, что нужно:
int add ( int x , int y )
return x — y ; // функция должна выполнять сложение, но выполняет вычитание
К сожалению, компилятор не ловит подобные ошибки, так как он проверяет только то, что вы написали, а не то, что вы хотели этим сделать.
В примерах, приведенных выше, ошибки довольно легко обнаружить. Но в большинстве программ (в которых больше 40 строк кода), семантические ошибки увидеть с помощью простого просмотра кода будет не так-то и легко.
И здесь нам на помощь приходит отладчик.
Отладчик
Отладчик (или «дебаггер» , от англ. «debugger» ) — это компьютерная программа, которая позволяет программисту контролировать выполнение кода. Например, программист может использовать отладчик для выполнения программы пошагово, последовательно изучая значения переменных в программе.
Более ранние дебаггеры, такие как GDB , имели интерфейс командной строки, где программисту приходилось вводить специальные команды для старта работы. Более современные дебаггеры уже имеют «графический» интерфейс, что значительно упрощает работу с ними. Сейчас почти все современные IDE имеют встроенные отладчики. То есть, вы можете использовать одну среду разработки как для написания кода, так и для его отладки (вместо постоянного переключения между разными программами).
Базовый функционал у всех отладчиков один и тот же. Отличаются они, как правило, тем, как этот функционал и доступ к нему организованы, горячими клавишами и дополнительными возможностями.
Примечание: Перед тем как продолжить, убедитесь, что вы находитесь в режиме конфигурации «Debug» . Все скриншоты данного урока выполнены в Visual Studio 2019.
Степпинг
Степпинг (англ. «stepping» ) — это возможность отладчика выполнять код пошагово (строка за строкой). Есть три команды степпинга:
- Команда «Шаг с заходом»
- Команда «Шаг с обходом»
- Команда «Шаг с выходом»