【问题标题】:Why does IIS crash when I print to stderr in Perl?为什么当我在 Perl 中打印到 stderr 时 IIS 会崩溃?
【发布时间】:2010-09-16 09:02:57
【问题描述】:

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

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

【问题讨论】:

    标签: perl iis


    【解决方案1】:

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

    扩展:问题可能在于 IIS 将其 FILE* 表放在一个位置,而 perl DLL 认为它将位于一个稍微不同的位置。当 perl 去寻找 stderr 句柄时,它把随机内存当作一个文件句柄,结果是可预测的。

    【讨论】:

      【解决方案2】:

      尝试在脚本顶部添加以下内容:

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

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

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

      【讨论】:

      • 由于某种原因这不起作用。它清楚地创建了我要求它登录的文件,但它仍然转到旧的日志文件。我什至试图通过 print STDERR 'foo' 来强制它,它仍然打印到旧文件。
      【解决方案3】:

      几个建议:

      1. 确保工人的 id 进程具有写入权限 您正在编写的目录/文件。一世 可能不会给它完整的 控制C:,虽然。更好地 创建一个子目录。
      2. 写入事件日志而不是使用文件 Win32::EventLog

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-03-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-21
          • 1970-01-01
          • 2016-07-09
          • 2010-11-25
          相关资源
          最近更新 更多