6

我们的网站在 .NET 中,但其中也包含一些旧的 ASP 和 32 位库。它已经工作了一段时间(2年)。但是在过去的一个月里,我们在 IIS7 服务器上看到了以下错误,我们无法追踪和修复:

“故障应用程序 w3wp.exe,版本 7.0.6001.18000,时间戳 0x47919413,故障模块 kernel32.dll,版本 6.0.6001.18215,时间戳 0x4995344f,异常代码 0xe053534f,故障偏移量 0x0002f328,进程 ID 0x%9,应用程序启动时间 0%x 10。”

我们能够重现错误:

  • 我们的 .ASPX 页面之一开始加载、执行代码和查询(我们在整个页面上都有 response.flush() 以跟踪代码中断的位置),然后它突然停止并且我们在 IIS 中收到上述错误。

  • 页面停止加载,并且没有 response.flush(),它不会重定向到我们的 error.aspx 页面(在 web.config 中配置)

  • 错误不会一直发生。有时,它连续发生 3 次,然后在正确重定向到 error.aspx 的情况下不间断地工作 15 分钟。

  • 我们得到的错误是一个经典的错误:“BOF 或 EOF 为 True,或者当前记录已被删除。”

  • 发生错误时,页面会挂起,并且来自任何浏览器的同一台计算机上的所有其他会话也会挂起网页(顺便说一句,我们在测试时只允许 1 个工作进程)。从其他计算机上,该站点加载正常。

  • 我可以回收应用程序池,杀死 w3wp.exe,重新启动 IIS。什么都不会。再次成功加载页面的唯一方法是重新启动处理我们的会话状态的 MS SQL。我不知道为什么会这样,但我们猜测用户浏览器上的会话 Cookie 指向一个未正确终止的线程(由于上述崩溃)并且 IIS 正在等待它终止以处理更多代码(? )。如果有人可以更好地解释这一点,那将非常有帮助。我们可以设置一个超时来“终止”线程吗?它是与 MS SQL 相关的问题吗?

我还查看了私有和虚拟内存的使用情况,因为我认为我们的代码不是最有效的,而且我确信我们还有剩余的内存泄漏。然而,即使私有内存和虚拟内存都非常低(每个都低于 100MB),我还是看到了页面崩溃。

我已经使用了 Debug Diag 和 WinDbg,如下所示:http: //blogs.msdn.com/b/tess/archive/2009/03/20/debugging-a-net-crash-with-rules-in-debug-diag .aspx,但我们无法使 windbg 工作,这是我们目前正在尝试做的事情。

如果有人可以帮助我们或为我们指明正确的方向,那就太好了,谢谢。

4

4 回答 4

2

“BOF 或 EOF 为 True,或当前记录已被删除”表示表为空,您正在尝试执行 MoveNext。所以在你做任何动作之前检查 eof

IIS 因像这样在 w3wp.exe 中引发内核错误而臭名昭著。会话状态中的所有错误只是崩溃进程的症状。多个 APP 池无济于事——它们只是分散了错误。

我敢打赌这是由于您的用户环境发生变化而导致的 SQL 死锁。当 SQL 尝试确定要终止哪个查询时,这将导致 10 秒的延迟。一胜一负。失败者取回指向意外空表的指针,您尝试移动并随后崩溃。您也许可以将您的数据库指向一个 ODBC 连接并打开跟踪,或者想办法让 SQL 记录它。

我在 Perl 中遇到了与上述相同的症状。我能够制作一个包装器 fn() 来执行所有 SQL 查询并将所有 sql、+ 参数和任何错误记录到磁盘以跟踪问题。这是死锁,然后我们能够在自动重试中编码,最终我们重新编码查询顺序并扫描列以消除死锁。

于 2010-12-16T05:32:03.933 回答
0

在 Windows Server 2008R2 机器上安装 Windows 更新后,我们开始收到此错误。Windows Process Activation Service (WAS) 会安装一些额外的站点绑定,这些绑定会导致我们的设置出现问题。

我们从我们的网站中删除了 net.tcp、net.pipe、net.msmq 和 msmq.formatname 绑定,并且不再出现错误的应用程序异常。

于 2013-07-04T13:15:17.897 回答
0

您在某处引用/链接的程序集之一完全有可能在磁盘上随机损坏(可能发生)。您可以尝试在具有相同统计数据的新机器上复制问题,并全新安装您正在使用的最新 xyz 驱动程序吗?

我解决了一个神秘的问题,我花了几个月的时间才以这种方式隔离。看起来很干净,具有相同规格和预先要求的驱动程序的新机器可以正常工作 - 只有一些具有相同规格的旧机器始终出现故障。我最终卸载了所有东西(IIS、ASP.NET、.NET、数据库和客户端)并从头开始。当我隔离它的最终原因是旧机器上的 db 客户端驱动程序已损坏(所有旧机器都是彼此的克隆,所以我假设它们在损坏发生后被克隆),它似乎搞砸了.NET 内存空间,即使我没有直接调用它。我什至还没有回复我的“帮我调试这个怪物”发布这个答案,因为我怀疑它会帮助任何人。

于 2010-12-11T13:49:32.337 回答
0

这可能是一个边缘案例,但万一有人来到这里并且他们正在使用MVCMailer,由于邮件程序上的 .SendAsync() 方法,我遇到了同样的错误。

我将它们全部切换到 .Send() 并且崩溃停止了。

有关使用邮件程序异步和避免崩溃的方法,请参阅此 SO 答案(据称,我没有亲自实现它)

于 2014-01-22T00:09:17.760 回答