当我在Perl中打印到stderr时,为什么IIS会崩溃?

时间:2008-10-09 19:46:51

标签: perl iis

这让我发疯了。我们有IIS(6)和Windows 2008以及ActiveState Perl 5.10。出于某种原因,每当我们发出警告或鲤鱼时,它最终会破坏应用程序池。当然,这是一个非常重要的事情,因为这意味着我们的错误实际上会导致问题。

这发生在以前版本的Perl(5.8)和Windows(2003)以及IIS(5)中。无论如何,基本上我放入carpwarn并收到错误消息然后是一些垃圾文本。有什么想法吗?

4 个答案:

答案 0 :(得分:2)

检查以确保IIS和perl DLL与相同版本的C运行时库链接。 (使用depends.exe或dumpbin / dependents)。

要扩展:问题可能是IIS在一个地方有它的FILE *表,并且perl DLL认为它将在一个稍微不同的地方。当perl去寻找stderr句柄时,它会将随机内存视为文件句柄,并具有可预测的结果。

答案 1 :(得分:0)

尝试将以下内容添加到脚本的顶部:

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

我不确定你为什么会遇到这个问题。但是,上述代码将解决关于此类问题的来源的几个“疯狂”猜测。

(自从我阅读在Win32中附加文件的源代码以来已经有一段时间了,但是,我记得,>>模式加上binmode意味着从不同进程写入文件不太可能发生冲突,防止日志中的重叠文本。)

答案 2 :(得分:0)

一些建议:

  1. 确保工作人员的ID 进程具有写入权限 你正在写的目录/文件。一世 可能不会给它充分 但是,对C:的控制。更好 制作一个子目录。
  2. 使用写入事件日志而不是文件 的Win32 ::事件日志

答案 3 :(得分:0)

更新:我发现只有在警告中有变量时才会发生此错误。如果警告只是常规文本,则没有问题。此外,变量不能为空,看起来你必须有两个带有非空变量的警告才能找到错误。