Отладка (debugging) – это процесс поиска и устранения ошибок, найденных в коде на этапе тестирования. Это неотъемлемая составляющая разработки любого программного продукта.
Разновидности ошибок
Ошибка компиляции
К этой категории относятся легко устраняемые ошибки, которые компилятор находит самостоятельно. Последний представляет собой специальную программу, которая позволяет переводить код на язык программирования в понятные для процессора команды. Когда компилятор находит целый набор ошибок, они исправляются последовательно. Довольно часто первая ошибка становится причиной возникновения всех остальных.
В интерпретируемых ЯП (PHP, Python) программный код построчно преобразовывается в машинные команды, после чего сразу же начинает выполняться. В результате его часть может выполняться еще до того, как была обнаружена первая ошибка.
Ошибка компоновки
Данные баги связаны с внешними ссылками и за их выявление отвечает редактор связей. Как правило, они возникают при подключении разных модулей одной программы. Предположим, в ходе выполнения кода происходит обращение к стороннему модулю, но его по какой-то причине не удается найти. Подобные ошибки довольно легко обнаружить и исправить.
Ошибка выполнения или RUNTIME Error
Такие ошибки могут быть обнаружены пользователем, операционной системой или аппаратным обеспечением. Они не проявляются на этапе компоновки и компиляции, поэтому их называют непредсказуемыми. Ошибки выполнения могут проявляться по-разному:
- сообщением об обнаружении проблем схемами контроля – в этом случае причиной может стать деление на ноль, проблемы с адресацией, переполнение разрядной сетки и прочее;
- сообщением об обнаружении проблем операционной системой – чаще всего именно ОС отвечает за документирование ошибок. Причиной появления может стать отсутствие файла с нужным именем или проблемы с защитой памяти. Иногда RUNTIME Error возникает при попытке записать данные на устройство, имеющее защиту от записи;
- зависанием компьютера или полным прекращением работы – в этом случае ошибка может быть решена перезапуском программы или перезагрузкой ПК;
- получением некорректных результатов, отличающихся от ожидаемых – в ходе работы программы не возникает сбоев, но она выдает неправильный результат.
Ошибки выполнения можно распределить по трем основным категориям. К первой относятся баги, вызванные некорректным определением исходных данных. Обычно они проявляются во время ввода и вывода информации. В этом случае речь может идти об ошибке данных, ошибке преобразования или ошибке перезаписи.
Чаще всего для отладки разработчики пользуются специальными средствами, например, профилировщиками или API-логгерами. Но даже они не могут обнаружить все ошибки. Как правило, после их использования удается найти и устранить лишь часть проблем.
Ко второй категории относятся ошибки логического характера. Причина их возникновения может скрываться в некорректном выборе методов или нарушениях, допущенных при работе со структурами данных и алгоритмами. В данную группу можно отнести:
- ошибки, вызванные некорректной работой с переменными – это может быть неправильно выбранный тип данных, использование переменной до ее инициализации, присвоение элементу массива неверного индекса и т.д.;
- вычислительные ошибки – неверное преобразование типов данных в ходе выполнения вычислительных операций;
- ошибки взаимодействия между разными модулями одной программы – в этом случае причина чаще всего кроется в нарушении типов, которое происходит в момент передачи определенных параметров. Кроме этого, стоит обратить внимание на область видимости переменных и соответствие единиц измерения различных параметров;
- ошибки, допущенные на этапе разработке логики программного продукта.
К третьей категории относятся так называемые ошибки погрешностей. Причиной возникновения становится некорректное округление, переполнение разрядной сетки или работа с приближенными методами вычислений.
Методы отладки программных продуктов
Ручное тестирование
В этом случае отладка проводится в ручном режиме при помощи специального тестового набора. Метод довольно эффективный, однако подходит далеко не в каждой ситуации. Его не получится использовать при работе над большими проектами или программами, позволяющими проводить объемные и сложные математические вычисления. Чаще всего данная разновидность тестирования является одной из составляющих других способов отладки.
Метод индукции
Проверка системы подразумевает тщательное изучение всех проявлений обнаруженного бага. Они могут проявляться в виде соответствующих уведомлений или ошибочных результатов вычислений. Предположим, что во время работы с программой ПК завис или вовсе выключился. Первое, что нужно сделать – изучить все последние действия, которые совершил пользователь. Во время отладки специалисты формируют гипотезы, которые впоследствии проверяют. Когда гипотеза подтверждается, начинается процесс более детального изучения конкретной ошибки.
При формировании гипотезы важно следить за тем, чтобы она объясняла все обнаруженные проявления ошибки. Если с ее помощью можно объяснить лишь их часть, то это говорит о том, что ошибок больше, либо гипотеза неверна.
Метод дедукции
Данный метод заключается в том, что специалисты собирают перечень причин, которые могли вызывать ошибку. После этого каждая из них анализируется и в случае противоречия исходным данным исключается из списка. Если после данной процедуры все причины оказались вычеркнуты, то начинается дополнительное тестирование. В противном случае выбирается и доказывается наиболее вероятная причина.
Обратное прослеживание
Применяется при отладке небольших программ. Свое начало процесс берет с точки появления некорректного результата. На этом этапе формируется гипотеза, в которой перечисляются переменные, чьи неправильные значения могли стать причиной возникновения бага. На основании данной гипотезы специалисты составляют перечень предположений о значениях, которые принимали переменные в предыдущих контрольных точках. Данный процесс реализуется до тех пор, пока не будет обнаружена ошибка.
Отладка программного кода в IDE
Первые отладчики были самостоятельными программами с примитивным интерфейсом в виде командной строки. Позднее стали появляться более продвинутые решения с пользовательским графическим интерфейсом, что значительно упрощало процесс отладки.
Сегодня практически каждая IDE оснащена собственным отладчиком. Он интегрирован в пользовательский интерфейс редактора, поэтому отладка происходит в той же среде, что и написание программы.
Благодаря отладчику у программистов появилась возможность не только следить за состоянием программы, но и корректировать его. К примеру, отладчик дает возможность выполнять код построчно, параллельно проверяя значения всех задействованных переменных. Сравнивая полученные и ожидаемые результаты, а также понимая логику выполнения программного кода, специалист довольно быстро может обнаружить семантические ошибки.
Пошаговое выполнение представляет собой перечень определенных процедур отладчика, который дает возможность поэтапно выполнять программу.
Шаг с заходом
Команда позволяет выполнять текущую инструкцию, после чего приостановить процесс для проверки состояния всей программы. Иногда выполняемый оператор содержит вызов другой функции. В этом случае данная команда переводит программу в начало вызванной процедуры, после чего процесс вновь останавливается.
Шаг с обходом
Как и в предыдущем случае, команда начнет выполнять текущую инструкцию. Однако при вызове функции данная команда не будет выполнять ее построчно, она выполнит ее полностью. Таким образом, разработчик может пропускать процедуры, в корректности которых он полностью уверен. Это значительно ускоряет процесс отладки программы.
Шаг с выходом
Главное отличие этой команды от всех предыдущих в том, что она позволяет выполнять всю функцию, исполняемую в момент отладки. Сразу после выхода из функции управление передается обратно разработчику. С помощью этой команды последний может быстро выйти из процедуры, которая не нуждается в отладке.
Как правило, пошаговое выполнение подразумевает движение вперед. Поэтому случаются ситуации, когда разработчик перешагнул место, которое нужно проверить. В этом случае придется заново запускать отладку. У некоторых современных отладчиков есть команда, позволяющая вернуться назад. Особенно это полезно, когда нужно перепроверить инструкцию.