Отладка (англ. debugging) — это исследование, анализ причин и исправление ошибок в программном обеспечении. После того как было произведено тестирование продукта, происходит устранение ошибок — это и называют в современным мире «отлаживанием».
Какие бывают ошибки
Ошибки, возникающие в языках программирования, требующих компиляции, обычно обнаруживаются компилятором — программой, преобразующей текст на языке программирования в машинный код. Если компилятор сообщает о нескольких ошибках, то отладку следует начать с исправления самой первой, так как именно она может быть причиной возникновения других ошибок.
В случае интерпретируемых языков программирования, таких как Python, текст программы постепенно переводится в машинный код и сразу же выполняется. Поэтому при обнаружении ошибки часть программы может уже быть выполнена.
Ошибка в компоновке возникает, когда возникает проблема с разрешением внешних ссылок. Она обнаруживается компоновщиком, отвечающим за связи между модулями программы.
Приведу небольшой пример: когда программа требует использовать определенную подпрограмму, но в результате процесса компоновки она не может быть найдена. Устранение ошибок в компоновке не представляет сложностей и может быть выполнено достаточно легко.
Ошибки, которые возникают в процессе выполнения программы и обнаруживаются операционной системой, аппаратными устройствами или самими пользователями. Они считаются неожиданными и проявляются после успешной компиляции и компоновки программы.
Можно выделить четыре типа таких ошибок:
- Сообщения об ошибках, которые зафиксированы схемами контроля машинных команд. Примерами могут быть переполнение разрядной сетки (когда результат операции не помещается в выделенную область памяти), деление на ноль, нарушение адресации и другие подобные ситуации.
- Сообщения об ошибках, которые зафиксированы операционной системой и обычно документированы. Это может быть нарушение защиты памяти, отсутствие файла с заданным именем, попытка записи на устройство, защищенное от записи и т.д.
- Прекращение работы компьютера или его зависание. Это могут быть как простые ошибки, требующие только перезагрузки компьютера, так и более сложные ситуации, при которых необходимо выключать ПК.
- Получение результатов, отличающихся от ожидаемых. В этом случае программа может работать стабильно, но выдавать некорректный результат, который пользователь воспринимает как верный.
Ошибки во время выполнения можно классифицировать на три основные группы:
- Возможные ошибки определения данных или неправильного определения исходных данных могут возникать в процессе выполнения операций ввода-вывода. К этой категории ошибок можно отнести ошибки преобразования, ошибки данных и ошибки перезаписи. Обычно использование специализированных технических средств для отладки, таких как API-логгеры, логи операционной системы, профилировщики и т.д., а также программирование с учетом защиты от ошибок позволяет обнаружить и решить только некоторую часть подобных ситуаций.
- Возникновение логических ошибок обусловлено неправильным выбором методов, разработкой алгоритмов, определением структуры данных и кодированием модулей. В данную категорию включаются следующие виды ошибок:
- некорректное использование переменных, к которому относится неправильное выбор типов данных, использование индексов, выходящих за пределы определения массивов, использование переменных до присвоения им начального значения и нарушение соответствия типов данных.
- ошибки вычислений, которые возникают из-за некорректной работы с переменными и ошибочного преобразования типов данных в процессе вычислений.
- ошибки взаимодействия между модулями или межмодульного интерфейса, при которых нарушаются типы и последовательность передачи параметров, области действия локальных и глобальных переменных, а также несоблюдение единства единиц измерения формальных и фактических параметров.
- неправильная реализация логики при программировании.
- Ошибки при накоплении погрешностей возникают из-за неправильного округления, пренебрежения ограничениями разрядной сетки, а также использования приближенных методов вычислений и других факторов.
Методы отладки ПО
Процесс отладки программы включает в себя ручное тестирование с использованием специального набора тестов, наличие ошибки в котором требует исправления.
Так выглядит процесс отладки ручного тестирования:
Несмотря на то, что этот подход является эффективным, его применение ограничено для больших программ или программ с сложными вычислениями. Ручное тестирование выполняется как часть комплексных методов отладки.
Метод индукции, применяемый для отладки системы, основан на тщательном анализе проявлений ошибки. Эти проявления могут выражаться в сообщениях об ошибке или неправильных результатов вычислений. Когда, например, компьютер зависает в процессе выполнения программы, необходимо исследовать последние действия пользователя, чтобы найти фрагмент, где проявляется ошибка.
На этапе отладки программы формулируются гипотезы, каждая из которых проверяется. Если гипотеза подтверждается, информация об ошибке детализируется, а если нет, то выдвигаются новые гипотезы.
Наглядный процесс отладки методом индукции:
Важно, чтобы выдвинутая гипотеза объясняла все проявления ошибки. Если она объясняет только часть проявлений, то либо гипотеза ошибочна, либо ошибок несколько.
Метод дедукции является одним из эффективных подходов к выявлению возможных ошибок. Специалисты начинают с составления широкого списка потенциальных причин, которые могли спровоцировать возникновение ошибки. Затем происходит тщательный анализ каждой причины, иные предположения исключаются в том случае, если они противоречат имеющимся данным.
Процесс отладки методом дедукции:
В случае исключения всех потенциальных причин, специалисты проводят дополнительное тестирование с целью подтвердить свои выводы. Если же после анализа остается одна или несколько наиболее вероятных причин, специалисты стремятся доказать их последовательность и уровень влияния на возникновение ошибки.
Это насыщенный смыслом подход, непременно приносящий плоды в случае коротких программ. Путь к результату, которым мы будем довольны, начинается с нахождения точки вывода. Именно здесь зарождается гипотеза о причинах, скрытых в основных переменных, которые могут оказаться проклятием нашей ошибки.
Шаг за шагом эта гипотеза превращается в предположения о значениях переменных в более ранних точках нашего творения. Так продолжается процесс, пока мы не отыщем ту самую ошибку, которая бесстыдно усердствует в недрах кода.
Eduson Academy
С трудоустройством
Длит.: от 9 мес
Skillbox
С трудоустройством
Длит.: 12 мес
Отладка в современных IDE
Отладка программного кода — важный этап в разработке приложений, с помощью которого разработчики могут контролировать выполнение программы и проверять ее состояние. Ранее отладчики были представлены отдельными программами с командными интерфейсами, однако с развитием технологий появились более совершенные инструменты. Большинство современных IDE включают в себя встроенные отладчики, что позволяет выполнять отладку в той же среде, где происходит написание кода.
Одной из ключевых функций отладчика является пошаговое выполнение программы. Этот набор связанных функций позволяет разработчику выполнить код поэтапно, что особенно полезно при отслеживании и исправлении ошибок. В ходе пошагового выполнения можно проверять значения переменных на каждом шаге, а также сравнивать фактические и ожидаемые значения, что помогает выявить логические или семантические ошибки в коде.
Помимо этого, отладчик позволяет управлять выполнением программы и вносить изменения в ее состояние. Благодаря этому разработчики могут активно участвовать в процессе отладки, искать и исправлять ошибки, что в итоге повышает качество и надежность программных продуктов. В современных IDE отладчики интегрированы непосредственно с редактором кода, что облегчает процесс отладки и повышает эффективность работы разработчика.
Команда проводит последовательное выполнение инструкции, затем временно приостанавливает процесс, чтобы проверить состояние программы с использованием отладчика. Если в выполняемом операторе имеется обращение к функции, шаг внутрь позволяет программе перейти в начало вызываемой функции, где она останавливается.
Эта команда позволяет выполнить следующую инструкцию программы. Однако, в отличие от команды step into, которая заходит в вызовы функций и выполняет их строка за строкой, команда step over полностью выполняет функцию, не останавливаясь, и возвращает управление после ее выполнения. Таким образом, команда step over позволяет пропустить функции, если программист уверен, что они уже исправлены, или не заинтересован в их отладке в данный момент.
В отличие от step into и step over, команда step out не выполняет следующую строку кода, а сразу выполняет все оставшиеся строки кода в текущей функции. По завершении функции, управление возвращается разработчику. Это очень полезная команда, которая помогает избежать отладки ненужных функций, в которые специалист случайно попал.
Обычно, при пошаговом выполнении отладки можно двигаться только вперед. Иногда возникает ситуация, когда мы пропускаем место, которое необходимо проверить. Если это происходит, то приходится перезапускать отладку заново.
Некоторые отладчики (например, GDB 7.0, Visual Studio Enterprise Edition 15.5 и более поздние версии) имеют возможность вернуться на шаг назад. Это очень удобная функция, особенно когда мы пропустили целевую часть кода или требуется повторно проверить уже выполненную инструкцию.