Что понимают под отладкой программы

Допустим, вы написали программу, и она работает некорректно – весь код компилируется нормально, но при запуске вы получаете неверный результат. Где-то вы допустили семантическую ошибку. Как ее найти? Если вы следовали лучшим практикам, написали небольшой фрагмент кода, а затем протестировали его, у вас может быть представление о том, где находится ваша ошибка. Или вы можете вообще не догадываться.

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

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

Отладка в 1С 8.3 на примерах

Общий подход к отладке

После выявления проблемы ее отладка обычно состоит из пяти шагов:

  1. найдите основную причину проблемы (обычно это неработающая строка кода);
  2. убедитесь, что вы понимаете, почему возникает проблема;
  3. определите, как вы решите проблему;
  4. устраните проблему, вызвавшую неисправность;
  5. повторите тест, чтобы убедиться, что проблема устранена и не возникло никаких новых проблем.

Давайте воспользуемся аналогией из реальной жизни. Допустим, однажды вечером вы идете взять лед из автомата для льда в морозильной камере. Вы подносите чашку к дозатору, нажимаете, и… ничего не выходит. Ой. Вы обнаружили какой-то дефект. Чтобы вы сделали?

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

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

Проблема в льдогенераторе или в чем-то другом? Морозильник всё еще холодный, водопровод не забит, и всё остальное вроде работает, поэтому вы делаете вывод, что основная причина в том, что льдогенератор не работает.

Разберитесь в проблеме: в данном случае это просто. Ледогенератор не делает лед.

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

Или вы можете купить новую морозильную камеру. Вы решили купить новый льдогенератор.

Устраните проблему: как только льдогенератор доставлен, вы устанавливаете его.

Отладка параллельных программ на Go. Андрей Солдатенко

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

Теперь давайте применим этот процесс к нашей простой программе из предыдущего урока:

#include // Сложит два числа int add(int x, int y) < return x — y; // функция должна складывать, но это не так >int main() < std::cout

Этот код хорош в одном: ошибка очень очевидна, потому что неправильный ответ выводится на экран в строке 11. Это дает нам отправную точку для нашего исследования.

Найдите основную причину: в строке 11 мы видим, что мы передаем литералы в качестве аргументов (5 и 3), поэтому здесь нет места для ошибки. Поскольку входные данные для функции add правильные, а выходные данные – нет, совершенно очевидно, что неправильное значение должна давать функция add . Единственная инструкция в функции add – это инструкция return , которая и должна быть виновником. Мы нашли проблемную строку. Теперь, когда мы знаем, на чем сосредоточить наше внимание, вы, вероятно, заметите, что мы вычитаем, а не складываем.

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

Определите способ исправления: мы просто заменим operator- на operator+ .

Устраните проблему: это фактически замена operator- на operator+ и перекомпиляция программы.

Читайте также:
Компьютерная программа это информационная модель

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

Этот пример тривиален, но он иллюстрирует основной процесс, который вы пройдете при диагностике любой программы.

Источник: radioprog.ru

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

Локализация и исправление ошибок называется отладкой [3]. Отладка — это процесс обнаружения причин возникновения ошибки и ее последующего исправления (в отличие от тестирования, являющегося процессом обнаружения самого факта существования ошибки).

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

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

Ошибки синтаксиса языка

Как правило, в абсолютном большинстве случаев ловятся на стадии компиляции программы, или же, если вы работаете с интерпретируемым языком типа Рег1 или РНР, то при первом интерпретировании программы. Но есть один существенный момент — когда выражение допустимо, но зависит от конкретного компилятора или интерпретатора. Например, в языке Си вполне допустимыми по синтаксису, но не по смыслу, являются выражения: э [ 1++] =±; ргл_г^:? («%с! %с!» , ±++, л.++) ;. Результат этих строк не определен, так как неизвестно, в каком порядке будет инкрементироваться и вычисляться значение переменной /’. Переменная не может более 1 раза присутствовать в выражении, если ее значение изменяется в ходе вычисления этого выражения.

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

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

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

Ошибки логики взаимосвязанных CGI-программ

Ошибки данного типа лежат во взаимосвязанных CGI-программах. Рассмотрим в качестве примера тестовую систему (см. сайт http://test.itsoft.ru). При сдаче теста в цикле работают два скрипта. Первый показывает вопрос, а второй проверяет правильность ответа. Если в тесте 10 вопросов, то эти CGI-скрипты вызываются парно в цикле 10 раз. Но что будет, если пользователь нажмет кнопку «Обновить» в броузере?

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

Ошибки многопользовательского доступа

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

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

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

Читайте также:
Запуск программы невозможен так как на компьютере отсутствует uplay r1 loader dll

Непонятным образом некоторые студенты после сдачи теста получали не результаты, а сбой системы. На исправление этой ошибки ушло два рабочих дня. Оказалось, что проблема в скрипте на JavaScript, который отправлял данные HTML-формы на сервер после истечения допустимого времени ответа на вопрос.

Проблема в том, что если время подходило к концу и пользователь нажимал кнопку «Ответить», а в это же время уже начала работать функция JavaScript form.submit(), то отправка данных HTML-формы происходила дважды, т. е. скрипт проверки правильности ответа вызывался 2 раза. А это за собой тянуло ошибку во взаимосвязанных CGI-скриптах, и внешнее проявление сбоя системы мы наблюдали уже при подсчете результатов, а не непосредственно сразу после двойной отправки HTML-формы.

Сам код JavaScript был написан верно, и с теоретической точки зрения даже если пользователь нажимает кнопку «Отправить» в последнюю секунду, HTML-форма должна была отправляться только 1 раз. Но на практике все оказалось совсем по-другому. На самом деле ничего мистического нет, или, как говорится, чудес на свете не бывает. Просто невозможно воспроизвести условия, в которых наблюдалась невоспроизводимая ошибка. Надо искать в программе случайности: одновременный доступ к одному ресурсу, генератор случайных чисел, неинициализированные переменные, некорректная работа с памятью или преобразование типов, которые могут проявлять себя не каждый раз.

Ошибки инструментария и других компонентов системы

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

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

Никакая самая лучшая методика не найдет и не ускорит поиск ошибки, если вы не «включите» мозги по полной программе и не сосредоточитесь целиком и полностью на поимке ошибки. Итак, допустим, вами, пользователем или тестирующим, было зафиксировано некорректное поведение программы. Что делать? Ниже перечислены методы в порядке их приоритетности, которые используют многие программисты.

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

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

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

  • • точки останова на конкретных строчках кода;
  • • остановка на /7-й итерации цикла;
  • • остановка при изменении переменных;
  • • остановка при присваивании конкретного значения;
  • • прохождение кода строчка за строчкой;
  • • откат по программе (далеко не все);
  • • исследование всех данных в программе, включая типы, определенные пользователем;
  • • присваивание новых значений переменным;
  • • продолжение исполнения программы;
  • • многоязыковая отладка (язык1, язык2, ассемблер. );
  • • запоминание установок.
  • 1. Какие виды ошибок существуют?
  • 2. Что такое тест? Какими свойствами должен обладать тест?
  • 3. Каковы критерии выбора тестов?
  • 4. Дайте краткую характеристику каждому критерию выбора теста.
  • 5. Опишите последовательность разработки тестов.
  • 6. Что входит в понятие надежности ПО?
  • 7. Какие виды отказов существуют?
  • 8. Каковы количественные характеристики надежности программ?
  • 9. Что представляют собой методы оценки и измерения характеристик надежности ПО?
  • 10. Перечислите достоинства парного программирования.

Источник: studref.com

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

Суммируя все сказанное выше, можно предложить следующую методику отладки программного обеспечения, написанного на универсальных языках программирования для выполнения в операционных системах MS DOS и Win32:

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

Читайте также:
Устройства компьютера основные и прикладные программы

Если ошибка не найдена или система просто «зависла», переходят ко второму этапу.

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

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

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

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

5-й этап — повторное тестирование — повторение всех тестов с начала, так как при исправлении обнаруженных ошибок часто вносят в программу новые.

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

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

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

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

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

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

Контрольные вопросы

  • 1. Какой процесс называют отладкой? В чем его сложность?
  • 2. Назовите основные типы ошибок. Как они проявляются при выполнении программы?
  • 3. Перечислите основные методы отладки. В чем заключается различие между ними? Возьмите любую программу, содержащую ошибки, и попробуйте найти ошибку, используя каждый из перечисленных методов. Какой метод для вас проще и естественней и почему?
  • 4. Какие средства получения дополнительной информации об ошибках вы знаете? Вспомните, какие ошибки вы искали дольше всего и почему. В каких случаях дополнительная информация позволяет найти ошибку?

Источник: bstudy.net

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru