这与我之前的问题有点重复,尽管我的问题的目标现在完全不同了。
我不时地每周一次,仅在我的开发机器中,在我制作的网络应用程序中出现 System.AccessViolationException。
由于我的机器有一些不能很好地工作的东西(比如不时出现蓝屏),我之前假设它可能是内存故障。运行 memtest 24 小时后,我很确定它不是......
所以,情况就是这样:这是一个 wep 应用程序,VB.Net 2.0,100% 托管代码,不使用 COM、Interop 或类似的东西。它在 Windows Server 2008 SP2 机器上运行。
我正在做的唯一“奇怪”的事情是在应用程序启动时启动我自己的 3 个线程,这些线程在 appdomain 内执行“类似 cron”的操作,而且这个应用程序正在处理的大多数请求都是异步处理的,其中许多它们保持打开状态长达 30 秒没有响应。(我正在做彗星长轮询)。
另外,我已经在这个代码上工作了大约一年,而且大约一个月前才开始这样做。在我最近更改的整个 Web 应用程序上,我想不出任何重大或重要的更改。我几乎完全在 Javascript 前端工作。
当异常发生时,我会收到一个典型的弹出窗口,询问我是否要调试。当我这样做时,我看到所有 ASP.Net 线程加上我的 3 个线程。
我的 3 个线程正在调用 Sleep(),这是正常的。所有其他 ASP.Net 线程根本没有调用堆栈。
在 Visual Studio 告诉我出现异常的线程中,我什么也没看到。
所以我不确定错误发生在哪里,甚至不知道它是否每次都发生在同一个地方。
我能在“应用程序”事件日志中找到一个线索:
Faulting application w3wp.exe, version 7.0.6002.18005, time stamp 0x49e03238,
faulting module unknown, version 0.0.0.0, time stamp 0x00000000, exception code
0xc0000005, fault offset 0x0000000002358fe8, process id 0x1f4c, application
start time 0x01ca41395c564ed9.
在那之后,另一个事件是这样的:
An unhandled exception occurred and the process was terminated.
Application ID: DefaultDomain
Process ID: 6632
Exception: System.AccessViolationException
Message: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
StackTrace: at System.Web.Hosting.UnsafeIISMethods.MgdIndicateCompletion(IntPtr pHandler, RequestNotificationStatus& notificationStatus)
at System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(IntPtr managedHttpContext, IntPtr nativeRequestContext, IntPtr moduleData, Int32 flags)
at System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(IntPtr managedHttpContext, IntPtr nativeRequestContext, IntPtr moduleData, Int32 flags)
我用谷歌搜索了 MgdIndicateCompletion ,但找不到任何真正有用的东西......
大约一个月前发生了变化,现在我想起来了,就是我在我的开发机器上从 Server 2003 x86 迁移到了 Server 2008 x64(因此,从 IIS6 迁移到 IIS7)。也许这就是原因,但我仍然不知道该怎么做......
我的意思是,这会将问题完全排除在我的代码库之外,对吗?
更新:如此处所建议,将应用程序池集成转为“经典”似乎可以解决此问题。不过,我仍在寻找一个体面的解决方案,或者至少是一个解释。