такую комбинацию входных данных и настроек, которые гарантированно приводят к
ошибке, затем сделайте так, что эту ошибку можно было бы вызвать несколькими
нажатиями клавиш. Если ошибка сложна, то при поиске проблемы вам придется
повторять ее снова и снова, поэтому, упростив воспроизведение ошибки, вы
сэкономите свое время.
Если ошибка появляется от случая
к случаю, попытайтесь понять причину этого.
Может быть, при каких-то условиях она появляется чаще? Даже если вы не в
состоянии повторить ее каждый раз, то, сократив время ее ожидания, вы найдете ее
быстрее.
Если программа способна выдавать отладочную информацию, включите ее.
Программа случайного моделирования, например программа markov из третьей
главы,
должна иметь ключ командной строки, выдающий такую отладочную
информацию, как, например, стартовое число генератора случайных чисел — это
нужно для того, чтобы выдачу программы можно было воспроизвести; другой ключ
должен позволять устанавливать это стартовое значение. Многие программы имеют
подобные ключи командной строки, неплохо и вам сделать так же.
Разделяй и властвуй. Можно
ли уменьшить объем входных данных, приводящих к
"падению" программы? Сужайте диапазон возможностей, создавая наименьший
набор данных, при котором ошибка все еще проявляется. При каких изменениях
ошибка исчезает? Попытайтесь обнаружить важные тестовые случаи, специально
фокусирующиеся на ошибке. Каждый тест должен быть нацелен на получение
определенного результата, который подтверждает или опровергает какую
-нибудь
гипотезу о происходящем.
Попробуйте двоичный поиск. Отбросьте половину входных данных и посмотрите,
осталась ли ошибка в выходных данных; если нет, то вер-j нитесь к предыдущему
состоянию и отбросьте другую половину входных данных. Тот же самый процесс
двоичного поиска можно применять и к тексту программы: удалите участок кода,
который, по
идее, не относится к ошибке, и посмотрите, не исчезла ли она. При
сокращении данных для тестирования и больших программ полезен текстовый
редактор с возможностью отмены редактирования.
Изучайте нумерологию ошибок. Иногда определенная регулярность чисел,
сопровождающих ошибку, подсказывает, на что нужно обратить внимание. Однажды
в новой главе этой книги мы обнаружили серию опечаток
, заключавшихся в
пропадании случайных букв. Ситуация выглядела таинственной. Текст]$ыл создан
посредством вырезания и вставки кусков другого файла,лшэтому казалось, что
проблемы были в этих самых командах вырезйния и вставки. Откуда начать поиск?
Мы взглянули на данные и заметили, что пропавшие символы были равномерно
распределены по тексту. При измерении интервалов
оказалось, что расстояние
между пропавшими буквами было равно 1023 байтам — подозрительно круглое
значение. Поиск в исходном тексте редактора нашел несколько кандидатов — чисел
в районе 1024. Одно из этих чисел находилось в новом коде, поэтому мы
исследовали именно его и немедленно обнаружили классическую "ошибку на
единицу", где нулевой байт перезаписывал последний символ в 1024-байтовом
буфере.
Изучение структуры чисел, связанных с ошибкой, указало прямо на нее. А
затраченное время? Пара минут озадаченности, пять минут рассмотрения данных,
чтобы обнаружить закономерность в пропадании символов, минута на поиск
вероятных мест ошибки и еще одна минута, чтобы устранить ее. Такую ошибку