| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: разработка для Web > Странная ошибка |
| Автор: UncleAndy 12.1.2011, 00:12 |
| Система CentOS - apache 2.2.3+mod_perl 2.0.4, perl 5.8.8 штатные. Для сайта использую Template Toolkit 2.22 В непредсказуемые моменты один или несколько процессов httpd (отследил через $$) начинают вести себя странно. У меня есть процедура которая обрабатывает данные и выдает шаблоны - do_template($apache_rec, $karkas, $params, $only_return). Параметры - переменная apache request из mod_perl, имя шаблона, параметры шаблона, флаг определяющий что делать с результатом компиляции шаблона - если 0 - сразу выводить, если 1 - возвращать его. Для отладки понаставил строк типа open(LOG, '>>/tmp/dbg.log'); print LOG 'do_template: 0', "\n"; close(LOG); и дождался глюка. Результат поставил меня в тупик. Во время глюков процедура, которая вызывает данную отрабатывает нормально, а вот запись в лог из самой процедуры (ставил строку даже перед получением параметров процедуры) НЕ происходит. Кроме того, при последнем параметра = 1 производится странное действие, такое как будто этот параметр == 0. Процедура возвращает 1 и выводит шаблон в STDOUT. В чудеса я не верю, но не могу понять в чем проблема. Если навскидку не распознаете ситуацию, подскажите хотя-бы какими средствами можно ее попробовать отладить. |
| Автор: Leshak 13.1.2011, 13:02 |
ситуация знакомая - неоднократно попадал в такое однозначно определить причину не смогу, но это может происходить из-за разного если не путаю - то дольше всего искал причину оказавшейся пропущенным знаком препинания запятой или точкой с запятой.. из моих любимых ошибок: - корявость в регулярном выражении - неаккуратность с глобальными/локальными данными - в том числе - ошибки в именах! в таких случаях мне помогают - отладочные выводы после каждой строки кода - заглушки - заново переписать код вот... Успехов |
| Автор: UncleAndy 13.1.2011, 13:16 |
| Пока нашел только путаницу с именами переменных. Внутри процедуры использовал локальную переменную с таким-же именем как и глобальная. Пока грешу на это. Буду смотреть повториться-ли ошибка. |
| Автор: srl 17.1.2011, 00:02 | ||
Хм-м, эта фраза наводит на размышления. Осознаёшь ли ты, чем работа скрипта под mod_perl отличается от обычного CGI? Так же, осознаёшь ли ты, что по дефолту запущено несколько процессов веб-сервера, и каждый из них может выполнять разные версии скрипта (пока ты вносишь изменения, не перезапуская веб-сервер)? |
| Автор: UncleAndy 17.1.2011, 11:11 | ||
Осознаю конечно. С такими скриптами несколько лет работал на довольно крупном проекте. Просто сейчас совсем уж непонятное происходит (если не учитывать то что нашел дублирование имен переменных). Кстати, еще такой вопрос, связанный с предыдущим. Если у меня есть две версии сайта - основная и тестовая и в них используется библиотека подключаемая по required, не может-ли их апачь путать из-за того что у них одно имя package (но находятся они в разных каталогах). Может это конечно и ложная тревога, но последние глюки натолкнули на эту мысль. |