Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
DMoroz / Диплом.doc
Скачиваний:
32
Добавлен:
16.04.2013
Размер:
1.12 Mб
Скачать

2.3. Особенности отладки cgi-программ

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

Потенциальные ошибки, возникающие при написании CGI-программ на языкеPerlи взаимодействующие с базой данных, приведены на pис. 34.

Рис. 34. Потенциальные источники ошибок

2.2.1. Ошибки в Perl-программе

Если скрипт по каким-либо причинам не исполняется, то на скорее всего появится экран, сообщающий о внутренней ошибке сервера, изображённый на pис. 35. Такое сообщение может появиться как при синтаксических ошибках в самой Perl-программе, так и при неправильной конфигурацииWeb-сервера.

Рис. 35. Сообщение о внутренней ошибке сервера

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

Приведём участок файла http-лога, возникающий в случае, если программист забыл поставить точку с запятой после некоторого оператора в строке 1104 скриптаdossier.pl:

[Mon May 06 16:46:04 2002] [error] [client 127.0.0.1] Premature end of script headers: c:/home/www/oroks22/scripts/dean_office/dossier.pl

[Mon May 06 16:46:04 2002] [error] [client 127.0.0.1] syntax error at c:/home/www/oroks22/scripts/dean_office/dossier.pl line 1105, near ") {"

[Mon May 06 16:46:04 2002] [error] [client 127.0.0.1] syntax error at c:/home/www/oroks22/scripts/dean_office/dossier.pl line 1170, near "else"

[Mon May 06 16:46:04 2002] [error] [client 127.0.0.1] Execution of c:/home/www/oroks22/scripts/dean_office/dossier.pl aborted due to compilation errors.

Видим, что файлhttp-лога имеет следующий формат:

Дата и время записи

тип сообщения

IP-адрес клиента

Сообщение

Проведя анализ приведённого участка лога видим, что источник ошибок находится в районе строки 1105 файла dossier.pl. Остальные ошибки могут возникать в результате возникновения первой ошибки. Как правило, после исправления некоторой синтаксической ошибки сообщения об остальных найденных до исправления ошибках появляться не будут.

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

Отчасти это происходит благодаря несколько причудливым правилам построения идентификаторов. Кроме стандартного набора букв, цифр и символа «_» в пользовательских идентификаторах допускается использование символа «'», в том числе в качестве первого. Данная особенность приводит к появлению дополнительного (среди бесчисленного множества других) потенциального источника ошибок. Например, следующий код будет компилироваться и выполняться без ошибок, но результат, скорее всего, будет отличным от ожидаемого:

$Owner = "John";

print("That's $Owner's house.");

На терминале в таком случае будет напечатано: «That's house.»

Также заслуживают внимания формы записи целых и вещественных чисел. И здесь не обошлось без сюрпризов. Кроме стандартных форм записи целых и вещественных чисел вроде

123 # целое

123.123 # вещественное

.5 # при записи десятичных дробей ноль в целой части можно опускать

.5E-10 # экспоненциальная форма

0xABCD # шестнадцатеричные числа записываются как в C

0377 # если первая цифра - ноль, то это восьмеричное число

Perlподдерживает и такую:

9_123_456 # это, видимо, для "удобства чтения"

и даже, как показывает практика, такую:

9_1__2_3___456_____

Также возможны ошибки, если поставить символ «_» в начале числа, например:

$f = _1;

print($f + 2); # будет напечатано 2 вместо ожидаемых 3

print(_1 + 2); # а так вообще ничего не будет напечатано

Соседние файлы в папке DMoroz