2008-10-09 62 views
2

這一直讓我發瘋。我們有IIS(6)和Windows 2008以及ActiveState Perl 5.10。出於某種原因,每當我們發出警告或鯉魚時,它最終都會破壞應用程序池。當然,這是一個非常大的交易,因爲這意味着我們的錯誤實際上會導致問題。爲什麼在我打印到Perl中的stderr時IIS會崩潰?

這發生在Perl(5.8)和Windows(2003)和IIS(5.)的前一版本中,無論如何,基本上我把或warn和我得到一個錯誤消息,然後一些垃圾文本。有什麼想法嗎?

回答

0

嘗試添加以下到腳本的頂部:

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

我不知道你爲什麼會出現這個問題。但是,上述代碼將解決針對此類問題的來源的幾個「瘋狂」猜測。 (我已經有一段時間了,因爲我讀了Win32中附加文件的源代碼,但是,我記得>>模式加binmode意味着從不同進程寫入文件不太可能發生衝突,重疊文本日誌中)

+0

由於某種原因,這不起作用。它清楚地創建了我要求它登錄的文件,但它仍然會轉到舊的日誌文件。我甚至試圖通過打印STDERR'foo'來強制它,並且它仍然打印到舊文件。 – 2008-10-13 18:00:34

0

一對夫婦的建議:

  1. 確保工人 進程的ID具有寫權限 目錄/文件你正在寫。但是我可能不會給它充分的控制權: 。更好地到 做一個子目錄。
  2. 寫入到事件日誌,而不是使用 的Win32 ::事件日誌
2

檢查以確保IIS和perl的DLL與相同版本的C運行時庫的鏈接的文件。 (使用depends.exe或者dumpbin/dependents)。

要展開:這個問題可能是IIS有FILE *表中的一個地方,perl的DLL認爲這將是在一個稍微不同的地方。當perl去查找stderr句柄時,它會將隨機內存視爲文件句柄,並帶有可預測的結果。

+0

安裝iis的任何想法?我似乎無法找到任何東西...... – 2008-10-13 15:46:07

0

更新:我發現這個錯誤只發生在警告中有一個變量時。如果警告只是常規文本,則不存在任何問題。此外,該變量不能爲空,它看起來像你必須有兩個警告與非空變量來擊中該錯誤。

相關問題