Огромную роль в программировании играет процесс отладки программ, а потому данная тема не зря нами затронута и должна быть подробно рассмотрена. Если при отладке программы возникла ошибка, вы должны знать, как её исправить. Можно хорошо знать язык программирования, но не знать как исправить случайно появившуюся ошибку.
В итоге — неграмотно потраченное время на отлавливание ошибок и не законченная программа. Ошибки делают все, начинающие и даже самые искусные программисты, это лишь дело времени. Чаще всего ошибки появляются из-за не внимательности, где-то запятую пропустили или не поставили скобочку и т.д. Но даже такие банальные ошибки необходимо отлавливать и исправлять. Данная статья не является набором правил для отладки программ, моя цель — ввести Вас в суть проблемы и дать несколько рекомендаций, которые позволят вам сэкономить драгоценное время.
Есть два типа ошибок:
- синтаксические ошибки — ошибки, которые компилятор может отловить при сборке проекта. Хотя уже сейчас такого типа ошибки компилятор отлавливает ещё до сборки проекта.
- ошибки времени выполнения, эти ошибки не всегда легко определить. Проект будет собран компилятором, и даже на первый взгляд нормально работать.
Ошибки времени выполнения появляются при определённых условиях (частные случаи). В силу того, что эти ошибки отлавливаются во время работы программы, а не при компиляции, они имеют такое название.
Сергей Щегрикович — Отладка как процесс
Рассмотрим несколько простых примеров, в которых специально допустим по одной ошибке.
// синтаксическая ошибка int main( // специально пропущена закрывающая скобочка main функции
Компилятор должен сгенерировать ошибку типа:
Ошибка 1 error C2143: синтаксическая ошибка: отсутствие «)» перед «
Тут всё предельно ясно, кстати в сгенерированном сообщении об ошибке указывается строка и даже столбец, с ошибкой.
// синтаксическая ошибка int main() < return 0 // ошибка тут, пропущен символ точки с запятой >
Сообщение компилятора об ошибке:
Ошибка 1 error C2143: синтаксическая ошибка: отсутствие «;» перед «>» e:installc++snakesnakesnake.cpp 10 1 snake.
Сообщения об ошибках могут различаться, в зависимости от используемой IDE. Например данные сообщения были сгенерированы MVS2010, где C2143 — код ошибки, описание которой можно найти на сайте MSDN. Стало быть, в сообщении указываются:
- код ошибки — C2143
- тип ошибки — синтаксическая ошибка
- суть ошибки — отсутствие «;» перед «>»
- адрес исполняемого файла — e:installc++snakesnakesnake.cpp
- номер строки — 10
- столбец — 1
- имя файла — snake
По большому счёту, такие ошибки и отлавливать не требуется, это делает за нас компилятор. Наша же задача — понять сообщение об ошибке и исправить её. Что касается ошибок времени выполнения, то компилятор не может их поймать. Поэтому эта задача полностью ложится на программиста. Но вам, мои читатели, по секрету скажу, что есть инструмент отладки Valgrind, который хорошо справляется с этой работой.
Без этого вы не станете программистом! Найти ошибку в коде. Отладка. Как пользоваться отладчиком #23
Как бы то ни было, и такие ошибки можно легко отлавливать. Вот, к примеру, рассмотрим нередкий случай возникновения логической ошибки.
int counter = 1; while (counter = 1) // ОШИБКА
В этом фрагменте кода допущена ошибка в условии цикла while , вместо знака сравнения == , стоит знак присваивания = . Такую ошибку компилятор не заметит, да и программисту трудно будет её отловить. Как только начнёт работать цикл, программа перестанет нормально функционировать, просто зависнет. а всё потому, что цикл бесконечный, то есть выхода из него нет. В данном фрагменте кода, ошибку найти легко, но вот когда программа большая и в цикле выполняется несколько десятков операторов, то понять почему не работает код не просто. Для этого мы добавляем одну строку в тело цикла while .
int counter = 1; while (counter = 1) // ОШИБКА < counter—; cout
int counter = 1; while (counter == 1) // исправленная ошибка
Суть данного метода — проанализировать значения переменных по ходу работы программы и понять, в чём ошибка. Узнать более подробно о стратегиях отладки, советах и приемах, помогающих ускорить этот процесс.
Источник: cppstudio.com
11. Отладка программного обеспечения. Классификация ошибок, методы отладки программного обеспечения: ручного тестирования, индукции, дедукции, обратного прослеживания.
Отладка программы — один их самых сложных этапов разработки программного обеспечения, требующий глубокого знания:
• специфики управления используемыми техническими средствами,
• среды и языка программирования,
• природы и специфики различных ошибок,
• методик отладки и соответствующих программных средств.
Отладка — это процесс локализации и исправления ошибок, обнаруженных при тестировании программного обеспечения. Локализацией называют процесс определения оператора программы, выполнение которого вызвало нарушение нормального вычислительного процесса. Доя исправления ошибки необходимо определить ее причину , т. е. определить оператор или фрагмент, содержащие ошибку. Причины ошибок могут быть как очевидны, так и очень глубоко скрыты.
В целом сложность отладки обусловлена следующими причинами:
• требует от программиста глубоких знаний специфики управления используемыми техническими средствами, операционной системы, среды и языка программирования, реализуемых процессов, природы и специфики различных ошибок, методик отладки и соответствующих программных средств;
• психологически дискомфортна, так как необходимо искать собственные ошибки и, как правило, в условиях ограниченного времени;
• возможно взаимовлияние ошибок в разных частях программы, например, за счет затирания области памяти одного модуля другим из-за ошибок адресации;
• отсутствуют четко сформулированные методики отладки.
В соответствии с этапом обработки, на котором проявляются ошибки, различают (рис. 10.1):
синтаксические ошибки — ошибки, фиксируемые компилятором (транслятором, интерпретатором) при выполнении синтаксического и частично семантического анализа программы; ошибки компоновки — ошибки, обнаруженные компоновщиком (редактором связей) при объединении модулей программы;
ошибки выполнения — ошибки, обнаруженные операционной системой, аппаратными средствами или пользователем при выполнении программы.
Синтаксические ошибки. Синтаксические ошибки относят к группе самых простых, так как синтаксис языка, как правило, строго формализован, и ошибки сопровождаются развернутым комментарием с указанием ее местоположения. Определение причин таких ошибок, как правило, труда не составляет, и даже при нечетком знании правил языка за несколько прогонов удается удалить все ошибки данного типа.
Следует иметь в виду, что чем лучше формализованы правила синтаксиса языка, тем больше ошибок из общего количества может обнаружить компилятор и, соответственно, меньше ошибок будет обнаруживаться на следующих этапах. В связи с этим говорят о языках программирования с защищенным синтаксисом и с незащищенным синтаксисом. К первым, безусловно, можно отнести Pascal, имеющий очень простой и четко определенный синтаксис, хорошо проверяемый при компиляции программы, ко вторым — Си со всеми его модификациями. Чего стоит хотя бы возможность выполнения присваивания в условном операторе в Си, например:
if (c = n) x = 0; /* в данном случае не проверятся равенство с и n, а выполняется присваивание с значения n, после чего результат операции сравнивается с нулем, если программист хотел выполнить не присваивание, а сравнение, то эта ошибка будет обнаружена только на этапе выполнения при получении результатов, отличающихся от ожидаемых */
Ошибки компоновки. Ошибки компоновки, как следует из названия, связаны с проблемами,
обнаруженными при разрешении внешних ссылок. Например, предусмотрено обращение к подпрограмме другого модуля, а при объединении модулей данная подпрограмма не найдена или не стыкуются списки параметров. В большинстве случаев ошибки такого рода также удается быстро локализовать и устранить.
Ошибки выполнения. К самой непредсказуемой группе относятся ошибки выполнения. Прежде всего они могут иметь разную природу, и соответственно по-разному проявляться. Часть ошибок обнаруживается и документируется операционной системой. Выделяют четыре способа проявления таких ошибок:
• появление сообщения об ошибке, зафиксированной схемами контроля выполнения машинных команд, например, переполнении разрядной сетки, ситуации «деление на ноль», нарушении адресации и т. п.;
• появление сообщения об ошибке, обнаруженной операционной системой, например, нарушении защиты памяти, попытке записи на устройства, защищенные от записи, отсутствии файла с заданным именем и т. п.;
• «зависание» компьютера, как простое, когда удается завершить программу без перезагрузки операционной системы, так и «тяжелое», когда для продолжения работы необходима перезагрузка;
• несовпадение полученных результатов с ожидаемыми.
Примечание . Отметим, что, если ошибки этапа выполнения обнаруживает пользователь, то в двух первых случаях, получив соответствующее сообщение, пользователь в зависимости от своего характера, степени необходимости и опыта работы за компьютером, либо попробует понять, что произошло, ища свою вину, либо обратится за помощью, либо постарается никогда больше не иметь дела с этим продуктом. При «зависании» компьютера пользователь может даже не сразу понять, что происходит что-то не то, хотя его печальный опыт и заставляет волноваться каждый раз, когда компьютер не выдает быстрой реакции на введенную команду, что также целесообразно иметь в виду. Также опасны могут быть ситуации, при которых пользователь получает неправильные результаты и использует их в своей работе.
Причины ошибок выполнения очень разнообразны, а потому и локализация может оказаться крайне сложной. Все возможные причины ошибок можно разделить на следующие группы:
• неверное определение исходных данных,
• накопление погрешностей результатов вычислений (рис. 10.2).
Н е в е р н о е о п р е д е л е н и е и с х о д н ы х д а н н ы х происходит, если возникают любые ошибки при выполнении операций ввода-вывода: ошибки передачи, ошибки преобразования, ошибки перезаписи и ошибки данных. Причем использование специальных технических средств и программирование с защитой от ошибок (см.§ 2.7) позволяет обнаружить и предотвратить только часть этих ошибок, о чем безусловно не следует забывать.
Л о г и ч е с к и е о ш и б к и имеют разную природу. Так они могут следовать из ошибок, допущенных при проектировании, например, при выборе методов, разработке алгоритмов или определении структуры классов, а могут быть непосредственно внесены при кодировании модуля.
К последней группе относят:
ошибки некорректного использования переменных , например, неудачный выбор типов данных, использование переменных до их инициализации, использование индексов, выходящих за границы определения массивов, нарушения соответствия типов данных при использовании явного или неявного переопределения типа данных, расположенных в памяти при использовании нетипизированных переменных, открытых массивов, объединений, динамической памяти, адресной арифметики и т. п.;
ошибки вычислений , например, некорректные вычисления над неарифметическими переменными, некорректное использование целочисленной арифметики, некорректное преобразование типов данных в процессе вычислений, ошибки, связанные с незнанием приоритетов выполнения операций для арифметических и логических выражений, и т. п.;
ошибки межмодульного интерфейса , например, игнорирование системных соглашений, нарушение типов и последовательности при передачи параметров, несоблюдение единства единиц измерения формальных и фактических параметров, нарушение области действия локальных и глобальных переменных;
другие ошибки кодирования , например, неправильная реализация логики программы при кодировании, игнорирование особенностей или ограничений конкретного языка программирования.
Н а к о п л е н и е п о г р е ш н о с т е й результатов числовых вычислений возникает, например, при некорректном отбрасывании дробных цифр чисел, некорректном использовании приближенных методов вычислений, игнорировании ограничения разрядной сетки представления вещественных чисел в ЭВМ и т. п.
Все указанные выше причины возникновения ошибок следует иметь в виду в процессе отладки. Кроме того, сложность отладки увеличивается также вследствие влияния следующих факторов:
опосредованного проявления ошибок;
возможности взаимовлияния ошибок;
возможности получения внешне одинаковых проявлений разных ошибок;
отсутствия повторяемости проявлений некоторых ошибок от запуска к запуску – так называемые стохастические ошибки;
возможности устранения внешних проявлений ошибок в исследуемой ситуации при внесении некоторых изменений в программу, например, при включении в программу диагностических фрагментов может аннулироваться или измениться внешнее проявление ошибок;
написания отдельных частей программы разными программистами.
Методы отладки программного обеспечения
Отладка программы в любом случае предполагает обдумывание и логическое осмысление всей имеющейся информации об ошибке. Большинство ошибок можно обнаружить по косвенным признакам посредством тщательного анализа текстов программ и результатов тестирования без получения дополнительной информации. При этом используют различные методы:
ручного тестирования;
обратного прослеживания.
Метод ручного тестирования. Это — самый простой и естественный способ данной группы. При обнаружении ошибки необходимо выполнить тестируемую программу вручную, используя тестовый набор, при работе с которым была обнаружена ошибка.
Метод очень эффективен, но не применим для больших программ, программ со сложными вычислениями и в тех случаях, когда ошибка связана с неверным представлением программиста о выполнении некоторых операций.
Описание процесса отладки программы
Отладка — этап разработки компьютерной программы, на котором обнаруживают, локализуют и устраняют ошибки. Чтобы понять, где возникла ошибка, приходится:
· узнавать текущие значения переменных;
· выяснять, по какому пути выполнялась программа.
Существуют две взаимодополняющие технологии отладки.
· Использование отладчиков — программ, которые включают в себя пользовательский интерфейс для пошагового выполнения программы: оператор за оператором, функция за функцией, с остановками на некоторых строках исходного кода или при достижении определённого условия.
· Вывод текущего состояния программы с помощью расположенных в критических точках программы операторов вывода — на экран, принтер, громкоговоритель или в файл. Вывод отладочных сведений в файл называется журналированием.
Процесс отладки выполняется примерно по такому алгоритму: после того как написан рабочий код производятся тестовые запуски программы на различных наборах тестовых данных. При этом тестер или программист заранее должны получить контрольный результат, с которым будет идти сверка работы проверяемого кода. Например, заранее произвести вычисления.
В случае обнаружения расхождений между контрольным и фактическим результатами, начинается поиск проблемного участка кода и выявление ошибок вышеуказанными способами. Сейчас получают довольно мощное распространение средства автоматического тестирования исходного кода программ. Основной прием здесь это создание тестов исходного текста, которые будут применены к тестируемому участку кода, в системе тестирования сообщит об их результатах.
Тестирование программного обеспечения — процесс исследования программного обеспечения (ПО) с целью получения информации о качестве продукта.
Существует множество подходов к решению задачи тестирования и верификации ПО, но эффективное тестирование сложных программных продуктов — это процесс в высшей степени творческий, не сводящийся к следованию строгим и чётким процедурам или созданию таковых.
Качество программных средств можно определить как совокупную характеристику исследуемого ПО с учётом следующих составляющих:
Обработка ошибок в программе
Возникновение ошибок — это часто встречающаяся неприятность в программном обеспечении. Для получения нормальных результатов работы, пользователь должен уметь вовремя замечать и устранять возникающие ошибки.
Самый лучший способ повысить качество ПО это стараться не допускать ошибок в процессе ввода исходного текста.
Первый шаг на пути предотвращения ошибок это осознание того, что ошибки действительно можно предотвратить. Больше всего препятствует контролю над ошибками распространенное убеждение в том, что ошибки неизбежны. Ошибки сами по себе не появляются, их вносит в текст разработчик.
В ходе проверки программного комплекса было обнаружено наличие ошибок таких как:
Неправильная работа запросов (ошибка при вводе формулы). Эти ошибки были устранены путем введения правильных формул.
Ошибка при вводе фамилии клиента, при вводе даты несоответствующего формата, при вводе несуществующего номера абонента.
Эти ошибки были устранены путем правильного ввода соответствующих сведений.
Также в данной программе ошибка возникает, например, при вводе данных неправильного типа, противоположно указанных в базе данных. Примером является введение в заявление любого типа вместо цифр номера паспорта символов, т.к. тип данных данного поля является числовой.
Инструкция пользователю
Разработанную программу можно запустить несколькими способами. Например, из программы Microsoft Access из папки, в которой установлена программа «Подключение абонентов к сети». Рекомендуется запустить программу, используя ярлык на Рабочем столе.
После запуска программы «Подключение абонентов к сети» на экране появляется форма запуска программы, в которой имеются две кнопки: кнопка запуска главной формы проекта и кнопка выхода.
При нажатии на кнопку запуска программы на экране появляется главная кнопочная форма проекта.
Кнопочная форма — обыкновенная форма с кнопками, обеспечивающая возможность выполнения запросов, открытия форм и вывод на печать отчетов.
Главная кнопочная форма проекта имеет 3 вкладки: Формы, Шаблоны заявлений и Отчеты.
В первой вкладке «Формы» имеются 5 кнопок, отображающие переходы к соответствующим формам системы. Рассмотрим их подробнее:
Сведения о абонентах;
Сведения о номерах;
Сведения о тарифах.
1. Форма «Реестр подключений» позволяет ввести сведения о всех подключениях салона сотовой связи «РИТМ»
. Форма «Реестр заявлений» позволяет ввести сведения об операциях, связанных с заполнением заявлений по образцу.
1. Форма «Сведения о абонентах»» позволяет ввести данные о клиентах салона сотовой связи «РИТМ»
2. Форма «Сведения о номерах» позволяет ввести данные о абонентских номерах клиентов и подключенных тарифных планах.
. Форма «Сведения о тарифах» позволяет ввести данные об услугах тарифов сети «Мегафон»
Во второй вкладке «Шаблоны заявлений» представлены 6 кнопок, отображающие разновидности шаблонов заявлений по различным проблемам:
· Заявление на восстановление закрытого номера — оформляется в случае прекращения использования абонентского номера более 3-х месяцев по причине блокировки либо потери SIM-карты.
· Заявление на замену SIM карты — оформляется в случае порчи SIM-карты, не подлежащей физическому восстановлению.
· Заявление на перенос ошибочного платежа — оформляется в случае неверного занесения абонентского номера при пополнении счета. Возможно только в случае ошибки при занесении не более 2-х цифр номера.
· Заявление на переоформление договора — оформляется в случае переоформления номера телефона с одного абонента на другого при предоставлении паспорта и при условии регистрации данного номера.
· Заявление на подключение/отключение услуг — оформляется по просьбе абонента в случае добровольного подключения к предоставляемым услугам сети либо отказа от них.
· Заявление на смену абонентского номера — оформляется при добровольном согласии абонента сменить один номер телефона на другой. Возможна замена определенного количества цифр старого абонентского номера при условии, если данный номер не зарегистрирован уже на другого пользователя.
По итогам каждого дня формируется документ «Отправленные заявления», в котором указаны все сведения о абонентах и поданных ими заявлениях, которые рассматриваются и проверяются. Каждому заявлению присваивается статус: Выполнено/Не выполнено. После чего данные направляются в главный центр салона в г.Кисловодск. В итоге по полученным данным сведения заносятся в форму «Отправленные заявления».
Вкладка «Отчеты» главной кнопочной формы включает шесть простых отчетов: Реестр подключений, Реестр заявлений», «Сведения о абонентах», «Сведения о номерах», «Сведения о тарифах», «Отправленные заявления» и пять отчетов по выборке, созданных на основе запросов программы.
Рассмотрим подробнее простые отчеты:
1. Отчет «Реестр заявлений» включает поля: абонентский номер, дата заявления, абонентский номер новый, тип заявления, серия/номер паспорта, ФИО абонента.
2. Отчет «реестр подключений»включает поля: Абонентский номер, серия номер паспорта, дата подключения, тарифный план, подключен.
. Отчет «Сведения о абонентах» включает поля: ФИО абонента, серия номер паспорта, паспорт выдан, домашний адрес.
. Отчет «Сведения о номерах» включает поля: абонентский номер и тарифный план.
. Отчет «Сведения о тарифах» включает поля: тарифный план, Условия тарифа.
Программа формирует следующие отчеты на выборку:
· По номеру абонента;
· По статусу отправленного заявления;
· По тарифному плану;
· По типу заявления;
· По ФИО абонента.
1. Отчет «По номеру абонента» создавался на основе запроса «Выборка по абонентскому номеру».
В представленной форме размещено одно поле с фиксированным списком: Абонентский номер. Поле предназначено для ввода данных, с помощью которых совершается поиск по данному критерию.
В появившемся окне вводим номер телефона, после чего открывается отчет.
2. Отчет «По статусу отправленного заявления» создавался на основе запроса «Выборка по статусу отправленного заявления».
Выбор критерия поиска будет производиться по двум полям: Статус и Создан.
. Отчет «По тарифному плану» создавался на основе запроса «тарифный план по дате».
Выбор критерия поиска будет производиться по двум полям: Дата подключения и Тарифный план.
. Отчет «По типу заявления» создавался на основе запроса «Выборка по типу заявления».
Выбор критерия поиска будет производиться по двум полям: Дата подключения и Тип заявления.
. Отчет «По ФИО абонента» создавался на основе запроса «Выборка по ФИО».
Выбор критерия поиска будет производиться по одному полю: ФИО абонента.
Завершение работы с программой осуществляется с помощью нажатия на кнопку «Выход».
ЭКОНОМИЧЕСКАЯ ЧАСТЬ
Источник: infopedia.su