tehnologia (1018792), страница 48
Текст из файла (страница 48)
Кроме того, сложность отладки увеличивается также вследствие влиянияследующих факторов:• опосредованного проявления ошибок;• возможности взаимовлияния ошибок;• возможности получения внешне одинаковых проявлений разных ошибок;• отсутствия повторяемости проявлений некоторых ошибок от запуска к запуску - такназываемые стохастические ошибки;• возможности устранения внешних проявлений ошибок в исследуемой ситуации привнесении некоторых изменений в программу, например, при включении в программудиагностических фрагментов может аннулироваться или измениться внешнее проявлениеошибок;• написания отдельных частей программы разными программистами.10.2. Методы отладки программного обеспеченияОтладка программы в любом случае предполагает обдумывание и логическоеосмысление всей имеющейся информации об ошибке. Большинство ошибок можнообнаружить по косвенным признакам посредством тщательного анализа текстов программ ирезультатов тестирования без получения дополнительной информации.
При этом используютразличные методы:• ручного тестирования;• индукции;291• дедукции;• обратного прослеживания.Метод ручного тестирования. Это - самый простой и естественный способ даннойгруппы. При обнаружении ошибки необходимо выполнить тестируемую программувручную, используя тестовый набор, при работе с которым была обнаружена ошибка.Метод очень эффективен, но не применим для больших программ, программ сосложными вычислениями и в тех случаях, когда ошибка связана с неверным представлениемпрограммиста о выполнении некоторых операций.Данный метод часто используют как составную часть других методов отладки.Метод индукции.
Метод основан на тщательном анализе симптомов ошибки,которые могут проявляться как неверные результаты вычислений или как сообщение обошибке. Если компьютер просто «зависает», то фрагмент проявления ошибки вычисляют,исходя из последних полученных результатов и действий пользователя. Полученную такимспособом информацию организуют и тщательно изучают, просматривая соответствующийфрагмент программы. В результате этих действий выдвигают гипотезы об ошибках, каждуюиз которых проверяют. Если гипотеза верна, то детализируют информацию об ошибке, иначе– выдвигают другую гипотезу. Последовательность выполнения отладки методом индукциипоказана на рис. 10.3 в виде схемы алгоритма.Самый ответственный этап – выявление симптомов ошибки.
Организуя данные обошибке, целесообразно записать все, что известно о ее проявлениях, причем фиксируют, какситуации, в которых фрагмент с ошибкой выполняется нормально, так и ситуации, в которыхошибка проявляется. Если в результате изучения данных никаких гипотез не появляется, тонеобходима дополнительная информация об ошибке. Дополнительную информацию можнополучить, например, в результате выполнения сложных тестов.292В процессе доказательства пытаются выяснить, все ли проявления ошибки объясняетданная гипотеза, если не все, то либо гипотеза не верна, либо ошибок несколько.Метод дедукции. По методу дедукции вначале формируют множество причин,которые могли бы вызвать данное проявление ошибки.
Затем анализируя причины,исключают те, которые противоречат имеющимся данным. Если все причины исключены, тоследует выполнить дополнительное тестирование исследуемого фрагмента. В противномслучае наиболее вероятную гипотезу пытаются доказать. Если гипотеза объясняетполученные признаки ошибки, то ошибка найдена, иначе – проверяют следующую причину(рис. 10.4).Метод обратного прослеживания. Для небольших программ эффективноприменение метода обратного прослеживания. Начинают с точки вывода неправильногорезультата.
Для этой точки строится гипотеза о значениях основных переменных, которыемогли бы привести к получению имеющегося результата.293Далее, исходя из этой гипотезы, делают предположения о значениях переменных впредыдущей точке. Процесс продолжают, пока не обнаружат причину ошибки.10.3. Методы и средства получения дополнительной информацииДля получения дополнительной информации об ошибке можно выполнитьдобавочные тесты или использовать специальные методы и средства:• отладочный вывод;• интегрированные средства отладки;• независимые отладчики.Отладочный вывод. Метод требует включения в программу дополнительногоотладочного вывода в узловых точках.
Узловыми считают точки алгоритма, в которыхосновные переменные программы меняют свои значения. Например, отладочный выводследует предусмотреть до и после завершения цикла изменения некоторого массивазначений. (Если отладочный вывод предусмотреть в цикле, то будет выведено слишкоммного значений, в которых, как правило, сложно разбираться.) При этом предполагается, что,выполнив анализ выведенных значений, программист уточнит момент, когда были полученынеправильные значения, и сможет сделать вывод о причине ошибки.Данный метод не очень эффективен и в настоящее время практически неиспользуется, так как в сложных случаях в процессе отладки может потребоваться выводбольшого количества - «трассы» значений многих переменных, которые выводятся прикаждом изменении.
Кроме того, внесение в программы дополнительных операторов можетпривести к изменению проявления ошибки, что нежелательно, хотя и позволяет сделатьопределенный вывод о ее природе.Примечание. Ошибки, исчезающие при включении в программу или удалению из нее каких-либо«безобидных» операторов, как правило, связаны с «затиранием» памяти. В результате добавления или удаленияоператоров область затирания может сместиться в другое место и ошибка либо перестанет проявляться, либобудет проявляться по-другому.Интегрированныесредстваотладки.Большинствосовременныхсредпрограммирования (Delphi, Builder C++, Visual Studio и т. д.) включают средства отладки,которые обеспечивают максимально эффективную отладку.Они позволяют:• выполнять программу по шагам, причем как с заходом в подпрограммы, так ивыполняя их целиком;• предусматривать точки останова;• выполнять программу до оператора, указанного курсором;294• отображать содержимое любых переменных при пошаговом выполнении;• отслеживать поток сообщений и т.п.На рис.10.5 показан вид программы в момент перехода в режим пошаговоговыполнения по достижении точки останова в Delphi.
В этот момент программист имеетвозможность посмотреть значения интересующих его переменных.Применять интегрированные средства в рамках среды достаточно просто. Используютразные приемы в зависимости от проявлений ошибки. Если получено с о о б щ е н и е о бо ш и б к е, то сначала уточняют, при выполнении какого оператора программы онополучено. Для этого устанавливают точку останова в начало фрагмента, в которомпоявляется ошибка, и выполняют операторы в пошаговом режиме до проявления ошибки.Аналогично поступают при «з а в и с а н и и» к о м п ь ю т е р а.Если получены н е п р а в и л ь н ы е р е з у л ь т а т ы, то локализовать ошибкуобычно существенно сложнее. В этом случае сначала определяют фрагмент, при выполнениикоторого получаются неправильные результаты.
Для этого последовательно проверяютинтересующие значения в узловых точках. Обнаружив значения, отличающиеся отожидаемых, по шагам трассируют соответствующий фрагмент до выявления оператора,выполнение которого дает неверный результат.295Для уничтожения природы ошибки возможен анализ машинных кодов, флагов ипредставления программы и значений памяти в 16-ричном виде (рис. 10.6).Причину ошибки определяют, используя один из методов, рассмотренных в § 10.2.При этом для проверки гипотез также можно использовать интегрированные средстваотладки.Отладка с использованием независимых отладчиков. При отладке программиногда используют специальные программы – отладчики, которые позволяют выполнитьлюбой фрагмент программы в пошаговом режиме и296проверить содержимое интересующих программиста переменных. Как правило такиеотладчики позволяют отлаживать программу только в машинных командах, представленныхв 16-ричном коде.10.4.
Общая методика отладки программного обеспеченияСуммируя все сказанное выше, можно предложить следующую методику отладкипрограммного обеспечения, написанного на универсальных языках программирования длявыполнения в операционных системах MS DOS и Win32:1 этап - изучение проявления ошибки - если выдано какое-либо сообщение иливыданы неправильные или неполные результаты, то необходимо их изучить и попытатьсяпонять, какая ошибка могла так проявиться. При этом используют индуктивные идедуктивные методы отладки. В результате выдвигают версии о характере ошибки, которыенеобходимо проверить. Для этого можно применить методы и средства получениядополнительной информации об ошибке.Если ошибка не найдена или система просто «зависла», переходят ко второму этапу.2 этап - локализация ошибки - определение конкретного фрагмента, при выполнениикоторого произошло отклонение от предполагаемого вычислительного процесса.Локализация может выполняться:• путем отсечения частей программы, причем, если при отсечении некоторой частипрограммы ошибка пропадает, то это может означать как то, что ошибка связана с этойчастью, так и то, что внесенное изменение изменило проявление ошибки;• с использованием отладочных средств, позволяющих выполнить интересующих насфрагмент программы в пошаговом режиме и получить дополнительную информацию о местепроявления и характере ошибки, например, уточнить содержимое указанных переменных.При этом если были получены неправильные результаты, то в пошаговом режимепроверяют ключевые точки процесса формирования данного результата.Как подчеркивалось выше, ошибка не обязательно допущена в том месте, где онапроявилась.