IIS7:错误应用程序w3wp.exe,这些崩溃的根本原因是什么?

时间:2010-12-11 13:27:05

标签: iis iis-7 application-pool w3wp

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

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

我们能够重现错误:

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

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

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

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

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

  • 我可以回收应用程序池,杀死w3wp.exe,重启IIS。没什么可做的。再次成功加载页面的唯一方法是重新启动处理会话状态的MS SQL。我不知道为什么会这样,但我们猜测用户浏览器上的Session Cookies指向一个未正确终止的线程(由于上述崩溃)并且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 个答案:

答案 0 :(得分:2)

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

IIS因为像w3wp.exe这样抛出内核错误而臭名昭着。会话状态中的所有错误都只是崩溃过程的症状。多个APP池无济于事 - 它们只会传播错误。

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

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

答案 1 :(得分:0)

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

我解决了一个神秘的问题,花了我几个月的时间来隔离这种方式。它似乎很干净,具有相同规格和预先驱动的驱动程序的新机器可以正常工作 - 只有一些具有相同规格的旧机器始终如一地失败。我最终卸载了所有(IIS,ASP.NET,.NET,数据库和客户端)并从头开始。我隔离它的最终原因是旧客机上的db客户端驱动程序已损坏(并且所有旧机器都是彼此的克隆,因此我假设它们在发生损坏后被克隆),即使我没有直接调用它,它似乎也在乱用.NET内存空间。我还没有用这个答案回复我的"help me debug this monster"帖子,因为我怀疑它会对任何人有所帮助。

答案 2 :(得分:0)

在Windows Server 2008R2计算机上安装Windows更新后,我们开始收到此错误。 Windows进程激活服务(WAS)会安装一些其他站点绑定,这会导致我们的设置出现问题。

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

答案 3 :(得分:0)

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

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

请参阅this SO answer了解如何使用邮件程序异步并避免崩溃(据称,我没有亲自实施)