Почему происходит сбой IIS при печати в stderr в Perl? - PullRequest
2 голосов
/ 09 октября 2008

Это сводит меня с ума. У нас есть IIS (6) и Windows 2008 и ActiveState Perl 5.10. По какой-то причине всякий раз, когда мы делаем предупреждение или карпа, это в конечном итоге портит пул приложений. Конечно, это довольно большое дело, поскольку это означает, что наши ошибки действительно вызывают проблемы.

Это произошло с предыдущей версией Perl (5.8) и Windows (2003) и IIS (5.). Во всяком случае, в основном я вставляю carp или warn, и я получаю сообщение об ошибке, а затем немного мусора текст. Есть мысли?

Ответы [ 4 ]

2 голосов
/ 12 октября 2008

Убедитесь, что IIS и Perl DLL связаны с одной и той же версией библиотеки времени выполнения C. (Используйте зависимости.exe или dumpbin /dependents).

Чтобы расширить: проблема может заключаться в том, что IIS имеет свою таблицу FILE * в одном месте, а библиотека Perl думает, что она будет находиться в немного другом месте. Когда Perl отправляется на поиск дескриптора stderr, он обрабатывает случайную память как дескриптор файла с предсказуемыми результатами.

0 голосов
/ 13 октября 2008

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

0 голосов
/ 11 октября 2008

Пара предложений:

  1. Убедитесь, что идентификатор работника процесс имеет разрешение на запись в каталог / файл, который вы пишете. я вероятно, не дал бы это полностью контроль C :, хотя. Лучше, чтобы создать подкаталог.
  2. Запись в журнал событий вместо файла с использованием Win32 :: EventLog
0 голосов
/ 11 октября 2008

Попробуйте добавить следующее в начало ваших скриптов:

BEGIN {
    open STDERR, '>> c:/iisError.log'
        or  die "Can't write to c:/issError.log: $!\n";
    binmode STDERR;
}

Я не уверен, почему у вас возникла эта проблема. Но несколько «диких» предположений относительно источников такой проблемы будут рассмотрены в приведенном выше коде.

(Прошло много времени с тех пор, как я прочитал исходный код для добавления к файлам в Win32, но, насколько я помню, режим >> mode plus binmode означает, что запись в файл из разных процессов вряд ли будет конфликтовать, предотвращая перекрытие текст в журнале.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...