Шаг 13.
Методы локализации ошибок

    На этом шаге мы рассмотрим методы локализации ошибок.

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

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

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

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

    Программистов, успешно проводящих поиск ошибок в программе, можно условно разделить на "аналитиков" и "экспериментаторов" [1].

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

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

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

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

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

    Учтите следующие принципы Г.Майерса [2].

  1. Думайте! Наиболее эффективный метод отладки заключается в глубоком анализе информации об ошибках. Для ее эффективного проведения


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


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

  3. Избегайте экспериментирования! Пользуйтесь им только как последним средством. Наиболее общей ошибкой, которую допускают начинающие программисты, занимающиеся отладкой, является попытка решить задачу посредством внесения в программу экспериментальных изменений ("Я не знаю, что неправильно, но я изменю этот оператор IF и посмотрю, что получится"). Этот абсолютно неверный подход не может даже рассматриваться как отладка; он основан на случайности. Экспериментирование не только уменьшает вероятность успеха, но часто и усложняет задачу, поскольку при этом в программу вносятся новые ошибки.
  4. Если Вы зашли в тупик, отложите рассмотрение программы. Наше подсознание является мощным механизмом решения проблем. То, что мы часто приписываем вдохновению, оказывается всего лишь выполненной подсознанием работой по решению задачи, тогда как наша сознательная деятельность в это время связана с чем-нибудь другим, например с едой, прогулкой или просмотром кинофильма. Если Вы не можете локализовать ошибку в приемлемые сроки (предположительно за 30 минут для небольших программ и за несколько часов для больших), прекратите поиски и займитесь каким-нибудь другим делом, так как эффективность Вашей работы значительно снизится. Проблему следует "забыть" до тех пор, пока Вы либо подсознательно не найдете ее решения, либо отдохнете и будете готовы вновь рассмотреть симптомы ошибки.

        И, наконец,


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

    Далее мы начнем рассматривать некоторые способы получения программистом промежуточных результатов, вырабатываемых отлаживаемой программой. В различных системах программирования они сильно отличаются друг от друга. Мы остановимся на Microsoft Access 97, Borland Pascal 7.0, Borland Delphi 4.0, Microsoft Visual C++ 5.0, Turbo Prolog 2.0..

   


(1) Безбородов Ю.М. Индивидуальная отладка программ. - М.: Наука, 1982.
(2) Майерс Г. Искусство тестирования программ. - М.: Финансы и статистика, 1982.

    Со следующего шага мы начнем рассматривать средства отладки в Microsoft Access.




Предыдущий шаг Содержание Следующий шаг