Как я могу диагностировать свой сценарий CGI Perl?

У меня есть сценарий Perl, который не работает, и я не знаю, как начать сужать проблему. Что я могу сделать?


Примечание: Я добавляю вопрос, потому что я действительно хочу добавить свой очень длинный ответ Stackoverflow. Я продолжаю внешне связываться с ним в других ответах, и это имеет право быть здесь. Не стесняйтесь редактирования моего ответа, если у Вас есть что-то для добавления.

99
задан 2 revs 29 January 2010 в 20:53
поделиться

3 ответа

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

-121--2165055-

Да, вы можете просто загрузить его.

Параметр java.sql.Date фактически является представлением типа SQL Date, в котором заполнены только год, месяц и день.

-121--3518759-

Этот ответ предназначен в качестве общей рамки для работы через проблемы со сценариями Perl CGI и первоначально появлялись на Perlmonks как Устранение неполадок сценариев Perl CGI . Это не полное руководство для каждого проблема, с которой вы можете столкнуться, или учебное пособие по скрещиванию ошибок. Это это всего лишь кульминация моего опыта отладки сценариев CGI в течение двадцати (плюс!) лет. На этой странице, кажется, было много разных домов, и я, кажется, чтобы забыть, что он существует, поэтому я добавляю его в StackOverflow. Вы может отправить мне любые комментарии или предложения по адресу bdfoy@cpan.org. Это также wiki сообщества, но не заходите слишком с ума.:)


Используете ли вы встроенные функции Perl, чтобы помочь вам найти проблемы?

Включите предупреждения, чтобы позволить Perl предупредить вас о сомнительных частях вашего кода. Это можно сделать из командной строки с помощью переключателя -w , чтобы не изменять код или добавлять прагматику в каждый файл:

 % perl -w program.pl

Однако вы должны заставить себя всегда очищать сомнительный код, добавив предупреждения pragma ко всем вашим файлам:

 use warnings;

Если требуется больше информации, чем короткое предупреждающее сообщение, используйте diagnostics pragma для получения дополнительной информации или обратитесь к документации perldiag :

 use diagnostics;

Выводили ли вы сначала действительный заголовок CGI?

Сервер ожидает, что первый вывод из сценария CGI будет заголовком CGI. Обычно это может быть так же просто, как печать «Content-type: text/plain\n\n»; или с CGI.pm и его производными, заголовок печати () . Некоторые серверы чувствительны к появлению ошибок (на STDERR ) перед стандартным выводом (на STDOUT ).

Попробуйте отправить ошибки в браузер

Добавьте эту строку

 use CGI::Carp 'fatalsToBrowser';

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

Что сказал журнал ошибок?

Серверы ведут журналы ошибок (или они должны, по крайней мере). Вывод ошибки с сервера и из сценария должен появись там. Найдите журнал ошибок и узнайте, что там написано. Нет стандартного места для файлов журнала. Посмотрите в конфигурация сервера для их расположения или спросите сервер admin. можно также использовать такие инструменты, как CGI:: Carp для хранения собственных файлов журнала.

Каковы разрешения сценария?

Если вы видите такие ошибки, как "Разрешение отклонено" или "Метод не реализовано, "это, вероятно, означает, что ваш сценарий не читаемый и исполняемый пользователем веб-сервера. На ароматизаторы в Unix рекомендуется изменить режим на 755: имя файла chmod 755 . Никогда не устанавливайте режим 777!

Используете ли вы строгие ?

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

Компилируется ли сценарий?

Можно ли проверить наличие ошибок компиляции с помощью -c выключатель. Сконцентрируйтесь на первых сообщенных ошибках. Полоскание, повториться. Если вы получаете действительно странные ошибки, обратитесь к убедитесь, что сценарий имеет правильные окончания строк. Если вы FTP в двоичном режиме, извлечение из CVS или что-то еще не обрабатывает перевод конца строки, веб-сервер может видеть ваш сценарий как одна большая строка. Передача сценариев Perl в ASCII режим.

Жалуется ли сценарий на небезопасные зависимости?

Если сценарий жалуется на небезопасные зависимости, вы вероятно, используют переключатель -T для включения режима наката, который является хорошая вещь, поскольку она держит вас без контроля передавать данные в оболочку. Если он жалуется, что делает свою работу, чтобы помочь нам писать более безопасные сценарии. Любой данные, исходящие из внешних источников программы (т.е. из среды) считается испорченным. Переменные среды, такие как PATH и LD_LIBRARY_PATH особенно хлопотны. Необходимо установить для них безопасное значение или полностью их отменить, как я рекомендую. Вы должны использовать абсолютный все равно пути. Если проверка запотевания жалуется на что-то еще, убедитесь, что данные не повреждены. См. раздел perlsec для получения подробной информации.

Что происходит при запуске из командной строки?

Выводит ли сценарий ожидаемое значение при запуске из в командной строке? Является ли вывод заголовка первым, за которым следует пустая строка? Помните, что STDERR может быть объединен с STDOUT если вы находитесь на терминале (например, интерактивный сеанс), и из-за буферизации может появиться в перескоченном порядке. Включить Функция автоматической очистки Perl путем установки $ | в значение истинное значение. Обычно вы можете видеть $ | + +; в Программы CGI. После установки, каждая печать и запись будет немедленно перейти к выходу вместо буферизации. Вы должны установить это для каждой файловой системы. Выберите для change default filehandle, например:

$|++;                            #sets $| for STDOUT
$old_handle = select( STDERR );  #change to STDERR
$|++;                            #sets $| for STDERR
select( $old_handle );           #change back to STDOUT

В любом случае первым выводом должен быть заголовок CGI за которым следует пустая строка.

Что происходит при запуске из командной строки с CGI-подобной средой?

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

Сброс или удаляет эти переменные

  • ПУТЬ
  • LD_LIBRARY_PATH
  • весь ORACLE_ * переменные

Набор эти переменные

  • REQUEST_METHOD (набор к ДОБИРАЮТСЯ , ГОЛОВА , или ПОЧТА как соответствующий)
  • SERVER_PORT (набор к 80, обычно)
  • REMOTE_USER (если вы делаете защищенный материал доступа)

Недавние версии , CGI.pm (> 2.75) требует - отладка флаг к получить старое (полезное) поведение, поэтому вам, возможно, придется добавить его в импорт CGI.pm .

use CGI qw(-debug)

Используете ли Вы die () или warn ?

Эти функции печатаются в STDERR , если не было переопределено их. Они также не выводят заголовок CGI. Вы можете получить те же функции с пакетами, такими как CGI:: Carp

Что произойдет после очистки кэша браузера?

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

Вы думаете, что это сценарий?

Путь файловой системы к сценарию не обязательно напрямую связан с URL-путем к сценарию. Убедитесь, что у вас есть правильный каталог, даже если вы должны написать короткий сценарий тестирования для проверки этого. Кроме того, вы уверены что вы изменяете правильный файл? Если вы не видите любой эффект с вашими изменениями, вы можете изменить другой файл или выгрузка файла в неправильное место. (Это, кстати, моя самая частая причина таких неприятностей ;)

Используете ли вы CGI.pm или производную от него?

Если ваша проблема связана с анализом ввода CGI и вы не используют широко проверенный модуль, такой как CGI.pm , CGI:: Request , CGI:: Простой или CGI:: Lite , используйте модуль и продолжайте жить. CGI.pm имеет режим совместимости cgi-lib.pl , который может помочь решить проблему ввода проблемы из-за старых реализаций синтаксического анализатора CGI.

Вы использовали абсолютные пути?

Если выполняете внешние команды с система , обратные клещи или другие средства IPC, следует использовать абсолютный путь к внешней программе. Вы не только точно знаете, что вы бежите, но вы избегайте также некоторых проблем с безопасностью. Если вы открываете файлы для чтения или записи,используйте абсолютный путь. Сценарий CGI может иметь другое представление о текущем каталог, чем вы. Кроме того, можно выполнить явный chdir () , чтобы поставить вас в нужное место.

Проверяли ли вы возвращаемые значения?

Большинство функций Perl скажут вам, работали они или нет и установит $! при отказе. Вы проверили вернуть значение и проверить $! для сообщений об ошибках? Вы проверили $ @ Если используется eval ?

Какая версия Perl используется?

Последняя стабильная версия Perl - 5,28 (или нет, в зависимости от того, когда она была отредактирована в последний раз). Вы используете более старую версию? Различные версии Perl могут иметь разные идеи предупреждений.

Какой веб-сервер вы используете?

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

Проверяли ли вы документацию сервера?

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

Вы провели поиск в архивах comp.infosystems.ww.w.authoring.cgi ?

Это использование было полезным, но все хорошие плакаты либо умерли, либо исчезли.

Вполне вероятно, что кто-то имел ваши проблемы раньше, и что кто-то (возможно, я) ответил на него в этом группа новостей. Хотя эта группа новостей прошла свой расцвет, собранная мудрость из прошлого иногда может быть полезной.

Можете ли вы воспроизвести проблему с помощью короткого тестового сценария?

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

Вы решили пойти посмотреть фильм?

Серьезно. Иногда мы можем так погрузиться в проблему, что мы развитие «сужения восприятия» (туннельное зрение). Делая перерыв, получить чашку кофе или взорвать несколько плохих парней в [Duke Nukem, Quake, Doom, Halo, COD] может дать вам новая перспектива, что вам нужно, чтобы вернуться к проблеме.

Вы снова осознали проблему?

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

125
ответ дан 24 November 2019 в 05:05
поделиться

Я думаю CGI :: Debug также стоит также упомянуть.

10
ответ дан 24 November 2019 в 05:05
поделиться

Вы используете обработчик ошибок, когда вы отладки?

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

Один из способов сделать это - звонить

   use CGI::Carp qw(fatalsToBrowser);

в верхней части вашего сценария. Этот звонок будет установлен $ SIG {__ die __} обработчик (см. Perlvar ) Отображение фатальных ошибок в вашем браузере, при необходимости подготовит ему действительный заголовок. Еще один хитрость отладки CGI, который я использовал, прежде чем я когда-либо слышал CGI :: CARP Используйте EVAL с с помощью данных и __ __ __ сооружений на скрипте, чтобы поймать ошибки времени компиляции:

   #!/usr/bin/perl
   eval join'', <DATA>;
   if ($@) { print "Content-type: text/plain:\n\nError in the script:\n$@\n; }
   __DATA__
   # ... actual CGI script starts here

Это более многослойная техника имеет небольшое преимущество в течение CGI :: CARP в том, что он поймает больше ошибок времени компиляции.

Обновление: Я никогда не использовал его, но выглядит как CGI :: Debug , как Микаэль С Предложенный, также является очень полезным и настраиваемым инструментом для этой цели.

7
ответ дан 24 November 2019 в 05:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: