Ответ 1
Этот ответ предназначен в качестве общей основы для проблемы с сценариями Perl CGI и первоначально появились на Perlmonks как Устранение неполадок Perl CGI Scripts. Это не полное руководство для каждого проблема, с которой вы можете столкнуться, или учебник по раздаче ошибок. Это является лишь кульминацией моего опыта отладки сценариев CGI за десять (плюс!) года. На этой странице было много разных домов, и мне кажется чтобы забыть его, поэтому я добавляю его в StackOverflow. Вы может отправлять любые комментарии или предложения мне по адресу [email protected] Это также сообщество wiki, но не стоит слишком гадко.:)
Используете ли вы встроенные функции Perl, чтобы помочь вам найти проблемы?
Включите предупреждения, чтобы Perl предупредил вас о сомнительных частях вашего кода. Это можно сделать из командной строки с помощью переключателя -w
, поэтому вам не нужно изменять какой-либо код или добавлять прагму в каждый файл:
% perl -w program.pl
Однако вы должны заставить себя всегда прояснять сомнительный код, добавляя прагму warnings
ко всем вашим файлам:
use warnings;
Если вам нужна дополнительная информация, чем короткое предупреждающее сообщение, используйте прагму diagnostics
, чтобы получить дополнительную информацию, или посмотрите perldiag документация:
use diagnostics;
Сначала вы выводили допустимый заголовок CGI?
Сервер ожидает первого выхода из CGI
script - заголовок CGI. Обычно это может быть
просто как print "Content-type: text/plain\n\n";
или CGI.pm и его производные, print
header()
. Некоторые серверы чувствительны к выходу ошибок
(на STDERR
) до стандартного вывода (на STDOUT
).
Попробуйте отправить ошибки в браузер
Добавьте строку
use CGI::Carp 'fatalsToBrowser';
на ваш script. Это также отправляет ошибки компиляции в окно браузера. Обязательно удалите это, прежде чем переходить в производственную среду, поскольку дополнительная информация может представлять угрозу безопасности.
Что сказал журнал ошибок?
Серверы сохраняют журналы ошибок (или они должны, по крайней мере). Ошибка вывода с сервера и вашего script должна там появляются. Найдите журнал ошибок и посмотрите, что он говорит. Не существует стандартного места для файлов журналов. Посмотрите в конфигурации сервера для их местоположения или спросить сервер админ. Вы также можете использовать такие инструменты, как CGI::Carp чтобы сохранить ваши собственные файлы журналов.
Какие существуют разрешения script?
Если вы видите ошибки, такие как "Разрешение отказа", или "Метод не
реализован ", это, вероятно, означает, что ваш script не является
читаемый и исполняемый пользователем веб-сервера. О вкусах
Unix, рекомендуется изменить режим на 755:
chmod 755 filename
. Никогда не устанавливайте режим на 777!
Используете ли вы use strict
?
Помните, что Perl автоматически создает переменные, когда
вы сначала используете их. Это функция, но иногда она может
вызывают ошибки, если вы ошибочно называете имя переменной. Прагма
use strict
поможет вам найти такие виды
ошибки. Это раздражает, пока вы не привыкнете к нему, но
программирование значительно улучшится через некоторое время и
вы сможете свободно совершать разные ошибки.
Скомпилирован ли script?
Вы можете проверить ошибки компиляции с помощью -c
переключатель. Сосредоточьтесь на первых сообщенных ошибках. Полоскание,
повторение. Если вы получаете действительно странные ошибки, проверьте
убедитесь, что ваш script имеет правильные окончания строки. если ты
FTP в двоичном режиме, проверка из CVS или что-то еще, что
не обрабатывает перевод строки, веб-сервер может видеть
ваш script как одна большая строка. Перенос Perl-скриптов в ASCII
Режим.
Является ли script жалобой на небезопасные зависимости?
Если ваш script жалуется на небезопасные зависимости, вы
вероятно, используют переключатель -T
, чтобы включить режим taint, который
хорошая вещь, поскольку она позволяет вам передавать неконтролируемые данные в оболочку. Если
он жалуется, что делает свою работу, чтобы помочь нам написать более безопасные скрипты. Любые
данные, происходящие вне программы (т.е. окружающая среда)
считается испорченным. Переменные среды, такие как PATH
и
LD_LIBRARY_PATH
особенно хлопотно. Вы должны установить их в безопасное значение
или полностью отключить их, как я рекомендую. Вы должны использовать абсолютный
пути в любом случае. Если проверка жалости жалуется на что-то еще,
убедитесь, что вы не очистили данные. См. perlsec
man page для деталей.
Что происходит, когда вы запускаете его из командной строки?
Выводит ли script то, что вы ожидаете при запуске с
командная строка? Сначала вывод заголовка, за которым следует
пустая строка? Помните, что STDERR
можно объединить с STDOUT
если вы находитесь на терминале (например, в интерактивном сеансе) и
из-за буферизации может появиться в беспорядочном порядке. Включить
Функция автозапуска Perl, установив $|
на
истинное значение. Обычно вы можете видеть $|++;
в
Программы CGI. После установки каждая печать и запись будут
немедленно перейдите на вывод, а не буферизируйте.
Вы должны установить это для каждого дескриптора файла. Используйте select
для
измените дескриптор файла по умолчанию, например:
$|++; #sets $| for STDOUT
$old_handle = select( STDERR ); #change to STDERR
$|++; #sets $| for STDERR
select( $old_handle ); #change back to STDOUT
В любом случае, первым делом должен быть заголовок CGI за которым следует пустая строка.
Что происходит, когда вы запускаете его из командной строки с помощью CGI-подобной среды?
Обычно среда веб-сервера намного ограничена чем в командной строке, и имеет дополнительные возможности информацию о запросе. Если ваш script работает нормально из командной строки вы можете попробовать имитировать веб-сервер Окружающая среда. Если проблема возникает, у вас есть проблема окружающей среды.
Отменить или удалить эти переменные
-
PATH
-
LD_LIBRARY_PATH
- все
ORACLE_*
переменные
Установите эти переменные
-
REQUEST_METHOD
(устанавливается вGET
,HEAD
илиPOST
в зависимости от ситуации) -
SERVER_PORT
(обычно устанавливается на 80) -
REMOTE_USER
(если вы делаете защищенный доступ)
Последние версии CGI.pm
( > 2.75) требуют, чтобы флаг -debug
получить старое (полезное) поведение, поэтому вам, возможно, придется добавить его в
ваш CGI.pm
импорт.
use CGI qw(-debug)
Используете ли вы die()
или warn
?
Эти функции печатаются до STDERR
, если вы не переопределили
их. Они также не выводят заголовок CGI. Вы можете получить
такая же функциональность с такими пакетами, как CGI::Carp
Что произойдет после очистки кеша браузера?
Если вы считаете, что ваш script делает правильные вещи, и при выполнении запроса вручную вы получаете право вывода, браузер может быть виновником. Очистить кеш и установите размер кеша равным нулю во время тестирования. Помните, что некоторые браузеры действительно глупы и фактически не перезагружаются новый контент, даже если вы говорите ему об этом. Это особенно распространены в тех случаях, когда URL-путь является но изменение содержимого (например, динамические изображения).
Является ли script, где вы думаете?
Путь файловой системы к script не обязательно напрямую связанный с URL-адресом пути к script. Убедиться у вас есть правильный каталог, даже если вам нужно написать короткий тест script, чтобы проверить это. Кроме того, уверены ли вы что вы изменяете правильный файл? Если вы не видите любой эффект с вашими изменениями, вы можете изменить другого файла или загрузки файла в неправильное место. (Это, кстати, моя самая частая причина таких неприятностей ;)
Используете ли вы CGI.pm
или его производную?
Если ваша проблема связана с разбором ввода CGI, и вы
не используют широко проверенный модуль, например CGI.pm
, CGI::Request
,
CGI::Simple
или CGI::Lite
, используйте модуль и продолжайте жить.
CGI.pm
имеет режим совместимости cgi-lib.pl
, который может помочь вам решить ввод
проблемы из-за более старых реализаций CGI-парсера.
Использовали ли вы абсолютные пути?
Если вы используете внешние команды с
system
, обратные тики или другие объекты МПК,
вы должны использовать абсолютный путь к внешней программе.
Вы не только знаете точно, что вы используете, но вы
избегайте некоторых проблем с безопасностью. Если вы открываете
файлы для чтения или записи, используйте абсолютный путь.
CGI script может иметь другое представление о текущем
чем вы. Кроме того, вы можете сделать
явный chdir()
, чтобы поставить вас в нужное место.
Проверяли ли вы возвращаемые значения?
Большинство функций Perl скажут вам, работают ли они или нет
и установит $!
при сбое. Вы проверили
вернуть значение и проверить $!
на сообщения об ошибках? Ты проверил
[email protected]
, если вы использовали eval
?
Какую версию Perl вы используете?
Последняя стабильная версия Perl - 5.16.2. Используете ли вы более старую версия? Различные версии Perl могут иметь разные представления о предупреждениях.
Какой веб-сервер вы используете?
Различные серверы могут действовать по-разному в одном и том же ситуация. Тот же серверный продукт может действовать по-разному с различные конфигурации. Включите столько как можно в любом запросе о помощи.
Проверяли ли вы документацию сервера?
Серьезные программисты CGI должны знать о сервера, в том числе не только функции сервера и поведение, но также и локальную конфигурацию. документация для вашего сервера может быть недоступна для вас если вы используете коммерческий продукт. В противном случае документация должна быть на вашем сервере. Если это не так, посмотрите для него в Интернете.
Вы искали архивы comp.infosystems.www.authoring.cgi
?
Вероятно, у кого-то была ваша проблема раньше, и что кто-то (возможно, я) ответил на это в этом телеконференция. Хотя эта новостная группа прошла свой расцвет, собранная мудрость из прошлого иногда может быть полезна.
Можете ли вы воспроизвести проблему с коротким тестом script?
В больших системах может быть сложно отследить ошибку так как происходит так много вещей. Попробуйте воспроизвести проблему поведение с максимально возможной script. Знание проблемы это большая часть исправления. Это может потребовать много времени, но вы пока не нашли проблему, и у вас заканчиваются варианты.:)
Вы решили пойти посмотреть фильм?
Серьезно. Иногда мы можем быть настолько обернуты проблемой, что мы разработать "сужение перцепции" (туннельное зрение). Взять перерыв, получить чашку кофе или взорвать некоторых плохих парней в [Duke Nukem, Quake, Doom, Halo, COD] может дать вам свежую перспективу, в которой вам нужно вернуться к проблеме.