Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Козак Н.В. Лекции Основы создания программ в Си...doc
Скачиваний:
24
Добавлен:
23.09.2019
Размер:
2.24 Mб
Скачать

Отладка программ

Отла́дка — этап разработки компьютерной программы, на котором обнаруживают, локализуют и устраняют ошибки. Чтобы понять, где возникла ошибка, приходится :

  • узнавать текущие значения переменных;

  • и выяснять, по какому пути выполнялась программа.

Существуют две взаимодополняющие технологии отладки.

  • Использование отладчиков — программ, которые включают в себя пользовательский интерфейс для пошагового выполнения программы: оператор за оператором, функция за функцией, с остановками на некоторых строках исходного кода или при достижении определённого условия.

  • Вывод текущего состояния программы с помощью расположенных в критических точках программы операторов вывода — на экран, принтер, громкоговоритель или в файл. Вывод отладочных сведений в файл называется журналированием.

Программные ошибки

Можно выделить две общих категории программных ошибок: времени компиляции и времени выполнения. Каждую из них, в свою очередь, можно разделить на две категории. В первом случае это ошибки компиляции (синтаксические) и ошибки компоновки; во втором — ошибки фатальные (условно назовем их так) и ошибки логические.

Синтаксические ошибки

Это самый безобидный вид программных ошибок.. Компилятор сразу обнаруживает синтаксические ошибки в собственном смысле и выдает сообщения об ошибках. К таким ошибкам относится, например, пропуск точки с запятой в конце оператора или непарные операторные скобки. Обычный компилятор печатает имя файла и номер строки, содержащей ошибку. Интегрированный компилятор сразу высвечивает в окне редактора соответствующую строку.

Очень часто указанная строка не соответствует действительности, а лежит ниже в тексте программы, потому что, например, пропуск какой-нибудь за крывающей операторной скобки может обнаружиться только в той точке, где компилятору встретится определение следующей функции. Описание ошибки тоже может выглядеть странновато. Так что часто единственное, что молено сказать по сообщению об ошибке — это то, что ошибка есть и она локализована где-то не ниже указанной строки.

Ошибки компоновки

Эти ошибки обнаруживаются на этапе редактирования связей (компоновки) между объектными файлами программы и библиотеками, которые она использует. Как правило, компоновщик выдает сообщение о том, что отсутствует некоторый глобальный символ или, наоборот, таких символов слишком много. Дублирование глобальных символов может иметь место, например, когда забывают объявить некоторую глобальную переменную как extern (внешнюю) или static (с областью действия, ограниченной текущим файлом).

Ошибки первого типа связаны с тем, что компоновщик не находит какую-то библиотеку. Она, конечно, может вообще отсутствовать в системе, но чаще это вопрос неправильной установки маршрутов системных библиотек или просто незнание программистом того, что та или иная библиотека обязательно должна быть указана в команде компоновщика (вспомните команду компоновки в make-файле из предыдущей главы). Иногда от программиста требуется незаурядное знание системы, чтобы определить причину таких ошибок.

Фатальные ошибки времени выполнения

К ним относятся ошибки, обнаруживаемые при запуске программы. Это может быть что-то вроде деления на ноль или нарушения защиты памяти. С помощью отладчика такие ошибки локализуются довольно просто, поскольку они, так сказать, «точечные». Правда, в эту же категорию можно отнести ошибки скорее логические, такие, как выход индекса за пределы массива или удаление элемента из пустой очереди. Они могут возникать не всегда, а зависеть от некоторого стечения обстоятельств. Сюда же можно отнести фатальные ошибки, связанные с неверным форматом ввода и т.п.

Логические ошибки

Эти ошибки локализовать наиболее трудно. Программа по видимости работает, но выдает совсем не те результаты, которых ожидает программист. Такого рода ошибки обычно коренятся в изначально неверном суждении относительно работы алгоритмов программы. Тут даже отладчик может принести лишь ограниченную пользу. Программист прежде всего должен «в уме», или на бумаге, проследить действия программы и определить критические участки кода, которые могут быть ответственны за отклонение ее поведения от ожидаемого. После этого уже можно пускать в ход отладчик и путем пошагового выполнения кода с контролем значения важнейших переменных выяснить, что же на самом деле в программе происходит.