.Net 2.0:帮助排除System.AccessViolationException故障。 100%托管代码

时间:2009-09-29 21:51:19

标签: asp.net .net-2.0 debugging access-violation

这是my previous question的重复,虽然我的问题的目标现在完全不同了。

我时不时地,每周一次,只在我的开发机器中,在我做的Web应用程序中出现System.AccessViolationException。

由于我的机器有一些不能很好地运行的东西(比如偶尔出现蓝屏),我假设它可能是RAM故障。运行memtest 24小时后,我很确定它不是......

所以,情况就是这样:这是一个wep App,VB.Net 2.0,100%托管代码,不使用COM,Interop或类似的东西。它在Windows Server 2008 SP2上运行 我正在做的唯一“奇怪”事情就是在应用程序启动时启动我自己的3个线程,在appdomain中执行“cron like”内容,并且此应用程序正在处理的大多数请求都是异步处理的,并且很多它们在没有响应的情况下保持打开状态长达30秒。 (我正在做Comet长期投票)。

此外,我已经在这个代码上工作了大约一年了,而且大约一个月前才开始这样做。 在最近改变的整个网络应用程序中,我无法想到我改变了什么重大或重要的事情。我几乎完全在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,但找不到任何真正有用的东西......

一个月之前HAS发生变化的一件事,就是我想到的,是我在我的开发机器中从Server 2003 x86迁移到Server 2008 x64(因此,IIS6到IIS7)。也许这就是原因,但是,我仍然不确定该怎么做......

我的意思是,这会将问题完全排除在我的代码库之外,对吗?


更新按照建议here,将App Pool集成转为“Classic”似乎可以解决问题。我仍然在寻找一个不错的解决方案,或者至少是一个解释。

3 个答案:

答案 0 :(得分:0)

不知道你的代码,我不知道这是多么实用,但你可以评论大量的代码,直到异常不再发生?如果可以,您可以使用binary search方法找出异常发生的位置。

答案 1 :(得分:0)

检查防病毒/病毒是否正在播放。这些程序可能会为每个进程安装错误的挂钩。

答案 2 :(得分:0)

我遇到类似“故障模块未知”类型崩溃的问题。就我而言,我有相反的情况,它正在SBS 2008机器上进行生产。我怀疑这是Windows的版本问题,但我不能确定。我通过记录缩小了它(这是一项服务,所以我能够写入事件日志)我会建议你可以选择,可能在

之内
#If DEBUG
    ...
#End If

块。

您也可以按照JeffH的建议执行某些代码部分,也使用DEBUG测试,这样您只能在生产中执行该代码。

记录将是我的起点,因为它为您提供了崩溃发生时刚刚发生的事情的线索。如果它只发生了几天,那么我再次只在您的机器上写日志文件,以避免在日志文件变大时出现性能问题!

祝你好运......