120 Часть I: Основы
дурой обработки ошибок, а может быть и результатом сбоя в рабо-
те самой программы, которая потеряла контроль над ситуацией.
Несколько курсоров. Если на экране появилось сразу два курсора,
это может означать, что программа находится в промежуточном
состоянии или что ее нормальная работа нарушена.
Сдвинутый текст. Строки текста на экране или на бумаге слегка
сдвинуты. Может быть, сместилась только одна строка, а возможно,
несколько.
Повторяющиеся или пропущенные символы. Если компьютер печа-
тает слово ошииибка вместо ошибка, это может быть опечаткой
программиста, а может сигнализировать и о проблемах с чтением
или записью данных.
Горящий индикатор активности устройства, которое не должно
участвовать в работе. Индикаторы активности имеются у многих
устройств — они показывают, когда компьютер читает или записы-
вает данные в их память. Если, например, индикатор активности
диска загорелся, когда точно известно, что программа не должна
обращаться в это время к диску, это может означать, что, работая на
языке достаточно низкого уровня, программист записал данные не
по тому адресу, и вместо определенного места памяти они попали на
диск. При низкоуровневом программировании это достаточно рас-
пространенная ошибка, последствия которой могут быть самыми
разрушительными.
Отслеживание действий программы
Чтобы лучше отследить работу программы, можно воспользоваться от-
ладчиком исходного кода. С его помощью можно узнать много полезного,
например, какой процесс в данный момент активен, какой объем памяти
и сколько других ресурсов компьютера он использует, насколько заполнен
стек и т.д. Вот примеры ошибок, о которых можно узнать с помощью
отладчика.
• Определенная подпрограмма забывает освобождать после себя стек,
и, если она выполнится много раз, это приведет к его переполне-
нию.
• После получения сообщения от другого процесса определенный
процесс программы забывает сообщить операционной системе, что
она может освободить выделенную для этого сообщения память.
(Сообщения, которыми обмениваются процессы, — это просто
структуры данных в памяти. При создании сообщения операцион-
ная система выделяет для него память, а после его получения адре-
Глава 5: Документирование и анализ ошибок 121
сатом должна эту память получить обратно.) Если процессы актив-
но обмениваются сообщениями, в определенный момент из-за их
неаккуратности свободная память может быть исчерпана. Это вы и
увидите в отладчике, как и то, кто является узурпатором.
Это только два примера, но они показывают, какие возможности рас-
крываются перед тестировщиком, владеющим основами программирования.
Однако не стоит тратить на работу с отладчиком слишком много времени.
Не забывайте, что основная ваша работа — это тестирование "черного
ящика", а с отладчиком программист может поработать и сам.
Еще одним способом анализа работы программы является распечатка ее
экранов и изменений в файлах данных. Помните, что с листом бумаги
всегда легче работать, чем с экраном компьютера.
Если содержимое экрана очень быстро меняется, можно попробовать
поработать на менее скоростном компьютере, или найти еще какой-нибудь
способ замедлить работу программы — например, эксплуатировать ее в
многопользовательской среде с повышенной нагрузкой. В результате иногда
можно увидеть нечто важное, что в противном случае мгновенно промель-
кнет на экране и останется незамеченным.
Выявив критический шаг, тщательно протестируйте
его последствия
Предположим, что если пользователь выполняет шаги А, Б, В, то на
шаге В что-то происходит не так. Вы выяснили, что виновником происше-
ствия является шаг Б. Попробуйте поменять последовательность действий,
посмотрите, как поведет себя программа, если после шага Б выполнить не
В, а Г. Будут ли последствия такими же? Возможно, обнаружится более
серьезная проблема, чем та, которую вы встретили вначале. Например,
программа не просто отобразит неверную информацию, но вообще "завис-
нет".
Поищите дальнейшие ошибки
Даже если вам не удалось точно установить, на каком именно шаге в
программе происходит ошибка, все равно продолжайте ее тестировать,
чтобы посмотреть, как она поведет себя дальше. За найденной ошибкой с
большой вероятностью последуют другие, и информация об этих послед-
ствиях первой ошибки может очень помочь программисту в ее поиске и
исправлении. Однако не забывайте, что следующая найденная вами ошибка
не обязательно является следствием предыдущей. Поэтому постарайтесь
протестировать ее отдельно, особенно если ее можно вызвать каким-нибудь
другим способом, в котором первая ошибка участвовать не будет.