Как называется процесс удаления ошибок в программе

Автор статьи

Дмитрий Михайлович Беляев

Эксперт по предмету «Информатика»

Задать вопрос автору статьи

Определение 1

Отладка программы – это процесс поиска и устранения ошибок в программе, который производится после её прогона на компьютере.Тестирование – это процесс проверки правильности работы всей программы или ее составных частей.

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

Термин debugging (с англ – отладка) дословно обозначает «вылавливание жучков». Он появился в 1945 г. после случая, когда компьютер «Марк-1» прекратил работу вследствие попадания в его электрические цепи мотылька, который заблокировал одно из реле вычислительной машины.

Логотип baranka

Сдай на права пока
учишься в ВУЗе

Вся теория в удобном приложении. Выбери инструктора и начни заниматься!

Получить скидку 4 500 ₽

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

В современных системах программирования (например, Turbo C, Turbo Pascal, Turbo Basic и др.) отладку осуществляет зачастую специальное программное средство – отладчик, который позволяет исследовать внутреннее поведение программы.

Возможности отладчика:

  • выполнение пошагового исполнения программы с остановкой после каждого оператора;
  • возможность просмотра текущего значения любой переменной или нахождения значения любого выражения; в случае необходимости можно задать новое значение переменной;
  • можно установить в программе контрольные точки – точки, в которых программа временно прекращает свое выполнение. Это позволяет выполнить оценку промежуточных результатов и др.

При выполнении отладки программы нужно придерживаться следующих правил:

  • на начальном этапе проведения отладки нужно использовать простые тестовые данные;
  • возникающие ошибки устранять строго по очереди;
  • помнить, что причина ошибок – не машина. Современные ПК и программы-трансляторы наделены достаточно высокой надежностью.

«Отладка и тестирование программы» 👇

Тест и тестирование

Если программа прошла отладку и явные ошибки не выявляются, пригодность программы для работы, которая является решающей характеристикой, устанавливает контроль программы по результатам ее выполнения на системе тестов.

Отладка и тестирование программы. Автор24 — интернет-биржа студенческих работ

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

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

Для выполнения тестирования должны быть подготовлены или заранее известны эталонные результаты, которые вычислять необходимо до получения машинных результатов, а не после. В обратном случае можно получить невольно подогнанные вычисляемые значения под желаемые, которые были ранее получены на машине.

Тестовые данные

Обеспечение проверки всех возможных условий возникновения ошибок должно ложится на правильно подобранные тестовые данные:

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

Рассмотрим на примере систему тестовых данных для задачи нахождения корней квадратного уравнения ax^2+bx+c=0:

Отладка и тестирование программы. Автор24 — интернет-биржа студенческих работ

Этапы процесса тестирования

Процесс тестирования зачастую делится на 3 этапа:

  1. Проверка в нормальных условиях – проведение тестирования на основе данных, характерных для реальных условий функционирования программы.
  2. Проверка в экстремальных условиях. В тестовые данные входят граничные значения области изменения входных переменных, воспринимающиеся программой как правильные данные. Типичные примеры таких значений: очень маленькие или очень большие числа; отсутствие данных; граничные объемы данных (например, массив из слишком малого или слишком большого числа элементов).
  3. Проверка в исключительных ситуациях проводится на значениях данных, которые лежат за пределами допустимой области изменений.

При подготовке тестовых данных и проведении тестирования нужно учитывать следующие моменты:

  • каким будет результат работы программы, которая не рассчитана на обработку отрицательных или нулевых значений переменных, в случае обработки таких данных?
  • каков будет результат работы программы, которая обрабатывает массивы, если число их элементов превысит величину, указанную в объявлении массива?
  • что произойдет в случае слишком малых или слишком больших чисел?

Замечание 1

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

Находи статьи и создавай свой список литературы по ГОСТу

Поиск по теме

Создание
программного продукта – будь то учебный
проект или операционная система –
складывается из целого ряда этапов.
Очень упрощенно это выглядит так.
Начинается все с этапа разработки,
который в свою очередь состоит из
нескольких шагов. Затем следует этап
программирования.

После
того, как программа написана и как-то
работает, работа над ней не заканчивается.
Необходимо еще убедиться, что она
работает корректно во всех ситуациях,
которые могут возникнуть при ее
использовании. Если это не так – следует
найти и устранить ошибки. Иными словами,
после завершения процесса программирования
программный продукт переходит в стадию
тестирования и отладки.

Тестирование
– проверка работоспособности программного
продукта при всех возможных вариантах
его использования с целью обнаружения
ошибок.

Отладкой
называется процесс поиска и устранения
ошибок.

Отметим,
что после отладки необходимо повторить
тестирование сначала, т. к. устранение
одних ошибок нередко приводит к появлению
других.

Методы тестирования программ

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

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

Авторское
тестирование

– проверка программы исходя из ее
логики. Автор, зная внутреннюю логику
программы, подбирает тестовые примеры
так, чтобы проверить работу всех ее
блоков.

Неавторское
тестирование

(стороннее, его еще называют методом
«черного ящика») – проверка программы
с точки зрения пользователя. Тестовые
примеры подбираются исходя из реальных
ситуаций, возникающих в ходе эксплуатации.

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

Средства отладки программ в Delphi

Ошибки,
которые могут быть в программе, принято
делить на три группы:

  • синтаксические;

  • ошибки времени
    выполнения;

  • алгоритмические.

Синтаксические
ошибки называют также ошибками времени
компиляции (Compile-time error). Они наиболее
легко устранимы. Их обнаруживает
компилятор, а программисту остается
только внести изменения в текст программы
и выполнить повторную компиляцию.

Ошибки
времени выполнения (Run-time
error) возникают не при каждом запуске
программы, а лишь при определенном
наборе входных данных (например, делении
на ноль или вводе некорректной даты).
Для их выявления требуется тщательно
подготовить тестовые примеры. Если
причиной являются не программные ошибки,
а действия пользователя, то в программе
должна быть предусмотрена обработка
исключительных ситуаций (см. § 5).

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

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

Соседние файлы в папке ИТ

  • #
  • #
  • #
  • #
  • #
  • #
  • #

    17.05.2015165 б6Товары.txt

  • #

Отладка, или debugging, — это поиск (локализация), анализ и устранение ошибок в программном обеспечении, которые были найдены во время тестирования.

Виды ошибок

Ошибки компиляции

Это простые ошибки, которые в компилируемых языках программирования выявляет компилятор (программа, которая преобразует текст на языке программирования в набор машинных кодов). Если компилятор показывает несколько ошибок, отладку кода начинают с исправления самой первой, так как она может быть причиной других.

В интерпретируемых языках (например Python) текст программы команда за командой переводится в машинный код и сразу исполняется. К моменту обнаружения ошибки часть программы уже может исполниться.

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

Ошибки связаны с разрешением внешних ссылок. Выявляет компоновщик (редактор связей) при объединении модулей программы. Простой пример — ситуация, когда требуется обращение к подпрограмме другого модуля, но при компоновке она не найдена. Ошибки также просто найти и устранить.

Ошибки выполнения (RUNTIME Error)

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

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

Ошибки выполнения можно разделить на три большие группы.

Ошибки определения данных или неверное определение исходных данных. Они могут появиться во время выполнения операций ввода-вывода.

К ним относятся:

  • ошибки преобразования;
  • ошибки данных;
  • ошибки перезаписи.

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

Логические ошибки. Они могут возникать из ошибок, которые были допущены при выборе методов, разработке алгоритмов, определении структуры данных, кодировании модуля.

В эту группу входят:

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

Ошибки накопления погрешностей. Могут возникать при неправильном округлении, игнорировании ограничений разрядной сетки, использовании приближенных методов вычислений и т.д. 

Методы отладки программного обеспечения

Метод ручного тестирования

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

Метод индукции

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

Вот как выглядит процесс:

Алгоритм отладки по методу индукции

Важно, чтобы выдвинутая гипотеза объясняла все проявления ошибки. Если объясняется только их часть, то либо гипотеза неверна, либо ошибок несколько.

Метод дедукции

Сначала специалисты предлагают множество причин, по которым могла возникнуть ошибка. Затем анализируют их, исключают противоречащие имеющимся данным. Если все причины были исключены, проводят дополнительное тестирование. В обратном случае наиболее вероятную причину пытаются доказать.

Отладка по методу дедукции

Метод обратного прослеживания

Эффективен для небольших программ. Начинается с точки вывода неправильного результата. Для точки выдвигается гипотеза о значениях основных переменных, которые могли привести к ошибке. Далее на основании этой гипотезы строятся предположения о значениях переменных в предыдущей точке. Процесс продолжается до момента, пока не найдут ошибку.

Как выполняется отладка в современных IDE

Ранние отладчики, например gdb, представляли собой отдельные программы с интерфейсами командной строки. Более поздние, например первые версии Turbo Debugger, были автономными, но имели собственный графический интерфейс для облегчения работы. Сейчас большинство IDE имеют встроенный отладчик. Он использует такой же интерфейс, как и редактор кода, поэтому можно выполнять отладку в той же среде, которая используется для написания кода.

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

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

Шаг с заходом (step into)

Команда выполняет очередную инструкцию, а потом приостанавливает процесс, чтобы с помощью отладчика было можно проверить состояние программы. Если в выполняемом операторе есть вызов функции, step into заставляет программу переходить в начало вызываемой функции, где она приостанавливается.

Шаг с обходом (step over)

Команда также выполняет очередную инструкцию. Однако когда step into будет входить в вызовы функций и выполнять их строка за строкой, step over выполнит всю функцию, не останавливаясь, и вернет управление после ее выполнения. Команда step over позволяет пропустить функции, если разработчик уверен, что они уже исправлены, или не заинтересован в их отладке в данный момент.

Шаг с выходом (step out)

В отличие от step into и step over, step out выполняет не следующую строку кода, а весь оставшийся код функции, исполняемой в настоящее время. После возврата из функции он возвращает управление разработчику. Эта команда полезна, когда специалист случайно вошел в функцию, которую не нужно отлаживать.

Как правило, при пошаговом выполнении можно идти только вперед. Поэтому легко перешагнуть место, которое нужно проверить. Если это произошло, необходимо перезапустить отладку.

У некоторых отладчиков (таких как GDB 7.0, Visual Studio Enterprise Edition 15.5 и более поздних версий) есть возможность вернуться на шаг назад. Это полезно, если пропущена цель либо нужно повторно проверить выполненную инструкцию. 

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

специфики управления используемыми техническими средствами,

операционной системы,

среды и языка программирования,

реализуемых процессов,

природы и специфики различных ошибок,

методик отладки и соответствующих программных средств. 

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

Вцелом сложность отладки обусловлена следующими причинами:

требует от программиста глубоких знаний специфики управления используемыми техническими средствами, операционной системы, среды и языка программирования, реализуемых процессов, природы и специфики различных ошибок, методик отладки и соответствующих программных средств;

психологически дискомфортна, так как необходимо искать собственные ошибки и, как правило, в условиях ограниченного времени;

возможно взаимовлияние ошибок в разных частях программы, например, за счет затирания области памяти одного модуля другим из-за ошибок адресации;

отсутствуют четко сформулированные методики отладки.

Всоответствии с этапом обработки, на котором проявляются ошибки, различают (рис. 10.1):


    синтаксические ошибки — ошибки, фиксируемые компилятором (транслятором, интерпретатором) при выполнении синтаксического и частично семантического анализа программы; ошибки компоновки — ошибки, обнаруженные компоновщиком (редактором связей) при объединении модулей программы;

    ошибки выполнения — ошибки, обнаруженные операционной системой, аппаратными средствами или пользователем при выполнении программы.

Синтаксические ошибки. Синтаксические ошибки относят к группе самых простых, так как синтаксис языка, как правило, строго формализован, и ошибки сопровождаются развернутым комментарием с указанием ее местоположения. Определение причин таких ошибок, как правило, труда не составляет, и даже при нечетком знании правил языка за несколько прогонов удается удалить все ошибки данного типа.

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

if (c = n) x = 0; /* в данном случае не проверятся равенство с и n, а выполняется присваивание с значения n, после чего результат операции сравнивается с нулем, если программист хотел выполнить не присваивание, а сравнение, то эта ошибка будет обнаружена только на этапе выполнения при получении результатов, отличающихся от ожидаемых */ 

Ошибки компоновки. Ошибки компоновки, как следует из названия, связаны с проблемами,

обнаруженными при разрешении внешних ссылок. Например, предусмотрено обращение к подпрограмме другого модуля, а при объединении модулей данная подпрограмма не найдена или не стыкуются списки параметров. В большинстве случаев ошибки такого рода также удается быстро локализовать и устранить.

    Ошибки выполнения. К самой непредсказуемой группе относятся ошибки выполнения. Прежде всего они могут иметь разную природу, и соответственно по-разному проявляться. Часть ошибок обнаруживается и документируется операционной системой. Выделяют четыре способа проявления таких ошибок:

• появление сообщения об ошибке, зафиксированной схемами контроля выполнения машинных команд, например, переполнении разрядной сетки, ситуации «деление на ноль», нарушении адресации и т. п.;

появление сообщения об ошибке, обнаруженной операционной системой, например, нарушении защиты памяти, попытке записи на устройства, защищенные от записи, отсутствии файла с заданным именем и т. п.;

«зависание» компьютера, как простое, когда удается завершить программу без перезагрузки операционной системы, так и «тяжелое», когда для продолжения работы необходима перезагрузка;

несовпадение полученных результатов с ожидаемыми.

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

Причины ошибок выполнения очень разнообразны, а потому и локализация может оказаться крайне сложной. Все возможные причины ошибок можно разделить на следующие группы:

неверное определение исходных данных,

логические ошибки,

накопление погрешностей результатов вычислений (рис. 10.2).

Н е в е р н о е о п р е д е л е н и е и с х о д н ы х д а н н ы х происходит, если возникают любые ошибки при выполнении операций ввода-вывода: ошибки передачи, ошибки преобразования, ошибки перезаписи и ошибки данных. Причем использование специальных технических средств и программирование с защитой от ошибок (см.§ 2.7) позволяет обнаружить и предотвратить только часть этих ошибок, о чем безусловно не следует забывать.

Л о г и ч е с к и е о ш и б к и имеют разную природу. Так они могут следовать из ошибок, допущенных при проектировании, например, при выборе методов, разработке алгоритмов или определении структуры классов, а могут быть непосредственно внесены при кодировании модуля.

Кпоследней группе относят:

ошибки некорректного использования переменных, например, неудачный выбор типов данных, использование переменных до их инициализации, использование индексов, выходящих за границы определения массивов, нарушения соответствия типов данных при использовании явного или неявного переопределения типа данных, расположенных в памяти при использовании нетипизированных переменных, открытых массивов, объединений, динамической памяти, адресной арифметики и т. п.;

ошибки вычислений, например, некорректные вычисления над неарифметическими переменными, некорректное использование целочисленной арифметики, некорректное преобразование типов данных в процессе вычислений, ошибки, связанные с незнанием приоритетов выполнения операций для арифметических и логических выражений, и т. п.;

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

другие ошибки кодирования, например, неправильная реализация логики программы при кодировании, игнорирование особенностей или ограничений конкретного языка программирования.

На к о п л е н и е п о г р е ш н о с т е й результатов числовых вычислений возникает, например, при некорректном отбрасывании дробных цифр чисел, некорректном использовании приближенных методов вычислений, игнорировании ограничения разрядной сетки представления вещественных чисел в ЭВМ и т. п.

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

опосредованного проявления ошибок;

возможности взаимовлияния ошибок;

возможности получения внешне одинаковых проявлений разных ошибок;

отсутствия повторяемости проявлений некоторых ошибок от запуска к запуску – так называемые стохастические ошибки;

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

написания отдельных частей программы разными программистами.

Методы отладки программного обеспечения

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

ручного тестирования;

индукции;

дедукции;

обратного прослеживания.

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

Метод очень эффективен, но не применим для больших программ, программ со сложными вычислениями и в тех случаях, когда ошибка связана с неверным представлением программиста о выполнении некоторых операций.

Данный метод часто используют как составную часть других методов отладки.

Метод индукции. Метод основан на тщательном анализе симптомов ошибки, которые могут проявляться как неверные результаты вычислений или как сообщение об ошибке. Если компьютер просто «зависает», то фрагмент проявления ошибки вычисляют, исходя из последних полученных результатов и действий пользователя. Полученную таким образом информацию организуют и тщательно изучают, просматривая соответствующий фрагмент программы. В результате этих действий выдвигают гипотезы об ошибках, каждую из которых проверяют. Если гипотеза верна, то детализируют информацию об ошибке, иначе — выдвигают другую гипотезу. Последовательность выполнения отладки методом индукции показана на рис. 10.3 в виде схемы алгоритма.

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

В процессе доказательства пытаются выяснить, все ли проявления ошибки объясняет данная гипотеза, если не все, то либо гипотеза не верна, либо ошибок несколько.

Метод дедукции. По методу дедукции вначале формируют множество причин, которые могли бы вызвать данное проявление ошибки. Затем анализируя причины, исключают те, которые противоречат имеющимся данным. Если все причины исключены, то следует выполнить дополнительное тестирование исследуемого фрагмента. В противном случае наиболее вероятную гипотезу пытаются доказать. Если гипотеза объясняет полученные признаки ошибки, то ошибка найдена, иначе — проверяют следующую причину (рис. 10.4).

Метод обратного прослеживания. Для небольших программ эффективно применение метода обратного прослеживания. Начинают с точки вывода неправильного результата. Для этой точки строится гипотеза о значениях основных переменных, которые могли бы привести к получению имеющегося результата. Далее, исходя из этой гипотезы, делают предложения о значениях переменных в предыдущей точке. Процесс продолжают, пока не обнаружат причину ошибки.

Добавлено 24 апреля 2021 в 20:31

Краткое резюме

Синтаксическая ошибка – это ошибка, возникающая при написании инструкции, недопустимой в соответствии с грамматикой языка C++. Компилятор ее поймает.

Семантическая ошибка возникает, когда инструкция синтаксически корректна, но не выполняет то, что задумал программист.

Процесс поиска и устранения ошибок в программе называется отладкой.

Для отладки мы можем использовать процесс из пяти этапов:

  1. найти первопричину;
  2. понять проблему;
  3. определить, как исправить;
  4. устранить проблему;
  5. выполнить повторное тестирование.

Обнаружение ошибки обычно является самой сложной частью отладки.

Инструменты статического анализа – это инструменты, которые анализируют ваш код и ищут семантические проблемы, которые могут указывать на проблемы с кодом.

Возможность надежного воспроизведения проблемы – первый и самый важный шаг в отладке.

Есть несколько тактик, которые мы можем использовать для поиска проблем:

  • закомментирование кода;
  • использование инструкций вывода для проверки последовательности выполнения кода;
  • вывод значений.

При использовании инструкций печати используйте std::cerr вместо std::cout. Но лучше, избегайте отладки с помощью инструкций печати.

Файл журнала (лог-файл, log file) – это файл, в котором записываются события, происходящие в программе. Процесс записи информации в лог-файл называется логгированием.

Процесс реструктуризации кода без изменения того, что он на самом деле делает, называется рефакторингом.

Модульное тестирование (юнит-тестирование, unit testing) – это метод тестирования программного обеспечения, с помощью которого тестируются небольшие блоки исходного кода, чтобы определить их правильность.

Защитное программирование – это метод, с помощью которого программист пытается предвидеть все способы неправильного использования программного обеспечения. Это некорректное использование часто можно обнаружить и смягчить.

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

Отладчик – это инструмент, который позволяет программисту контролировать выполнение программы и проверять ее состояние во время выполнения. Встроенный отладчик – это отладчик, который интегрируется в редактор кода.

Пошаговое выполнение – это название набора связанных функций отладки, которые позволяют выполнять пошаговое выполнение кода инструкция за инструкцией.

Шаг с заходом (step into) выполняет следующую инструкцию в обычном пути выполнения программы, а затем приостанавливает выполнение. Если инструкция содержит вызов функции, шаг с заходом заставляет программу перейти к началу вызываемой функции.

Шаг с обходом (step over) выполняет следующую инструкцию в обычном пути выполнения программы, а затем приостанавливает выполнение. Если инструкция содержит вызов функции, шаг с обходом выполняет эту функцию и возвращает управление вам после ее выполнения.

Шаг с выходом (step out) выполняет весь оставшийся код в функции, которая выполняется в настоящее время, а затем возвращает управление вам, когда выполнен возврат из этой функции.

Выполнение до курсора (run to cursor) выполняет программу до тех пор, пока не достигнет инструкции, выбранной курсором мыши.

Команда продолжить (continue) запускает выполнение программы до тех пор, пока программа не завершится или не будет достигнута точка останова.

Команда запуск (run) такая же, как и команда продолжить, только работает с начала программы.

Точка останова – это специальный маркер, который сообщает отладчику остановить выполнение программы при его достижении.

Отслеживание переменной позволяет вам проверять значение переменной во время выполнения программы в режиме отладки. Окно просмотра позволяет вам отслеживать значения переменных или выражений.

Стек вызовов – это список всех активных функций, которые были выполнены для перехода к текущей точке выполнения. Окно стека вызовов – это окно отладчика, которое показывает стек вызовов.

Небольшой тест

Вопрос 1

Используйте встроенный отладчик, чтобы пошагово выполнить следующую программу и отследить значение x. На основании полученной информации исправьте программу:

#include <iostream>
 
int readNumber(int x)
{
	std::cout << "Please enter a number: ";
	std::cin >> x;
	return x;
}
 
void writeAnswer(int x)
{
	std::cout << "The sum is:" << x;
}
 
int main()
{
	int x {};
	readNumber(x);
	x = x + readNumber(x);
	writeAnswer(x);
 
	return 0;
}

Ответ

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

#include <iostream>
 
int readNumber()
{
	std::cout << "Please enter a number: ";
	int x {};
	std::cin >> x;
	return x;
}
 
void writeAnswer(int x)
{
	std::cout << "The sum is:" << x;
}
 
int main()
{
	int x { readNumber() };
	x = x + readNumber();
	writeAnswer(x);
 
	return 0;
}

Вопрос 2

Используйте встроенный отладчик для пошагового выполнения следующей программы. Для входных данных введите 8 и 4. На основе полученной информации исправьте программу:

#include <iostream>
 
int readNumber()
{
	std::cout << "Please enter a number:";
	int x {};
	std::cin >> x;
	return x;
}
 
void writeAnswer(int x)
{
	std::cout << "The quotient is:" << x;
}
 
int main()
{
	int x{ };
	int y{ };
	x = readNumber();
	x = readNumber();
	writeAnswer(x/y);
 
	return 0;
}

Ответ

Проблема здесь в том, что второй вызов readNumber случайно присваивает значение x вместо y, что приводит к делению на 0, что приводит к сбою программы.

#include <iostream>
 
int readNumber()
{
	std::cout << "Please enter a number:";
	int x {};
	std::cin >> x;
	return x;
}
 
void writeAnswer(int x)
{
	std::cout << "The quotient is:" << x;
}
 
int main()
{
	int x{ readNumber() };
	int y{ readNumber() };
	writeAnswer(x/y);
 
	return 0;
}

Вы можете заметить, что, когда второе вводимое число не делит без остатка первое, эта программа дает неправильный ответ. При делении с целыми числами C++ отбрасывает любые дробные части частного. Мы обсудим это более подробно при обсуждении целых чисел (в следующей главе).


Вопрос 3

Как выглядит стек вызовов в следующей программе, когда точка выполнения находится в строке 4? Для этого упражнения нужны только имена функций, а не номера строк, указывающие точки возврата.

#include <iostream>
 
void d()
{ // здесь
}
 
void c()
{
}
 
void b()
{
	c();
	d();
}
 
void a()
{
	b();
}
 
int main()
{
	a();
 
	return 0;
}

Ответ

Примечание автора


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

Теги

C++ / CppDebugLearnCppДля начинающихМодульное тестирование / Юнит-тестирование / Unit testingОбучениеОтладкаОтладчик / DebuggerПрограммированиеРефакторингСтек вызовов

Понравилась статья? Поделить с друзьями:
  • Как называется процесс поиска и исправления ошибок в программе
  • Как называется процесс исправления ошибок в тексте ответ информатика
  • Как называется процесс исправления ошибок в тексте одно слово
  • Как называется процесс изменения ошибок в тексте
  • Как называется процесс выявления ошибок в программном продукте