LINQ to SQL:间歇性的 AccessViolationException 包裹在 TargetInvocationException 中

LINQ to SQL: intermittent AccessViolationException wrapped in TargetInvocationException

几周以来,我们的 ASP.Net 网络应用程序遇到了 W3WP 崩溃。这些是在我们的网络服务器更新后开始的。我们的应用没有变化,多年来一直稳定。
我们的情况似乎很像 this earlier question. And this question 也可能是相关的,但在我们的例子中,查询 运行 在 99.9% 的使用次数中都很好。

我们使用了大量未编译的 LINQ 查询并尝试编译它们是否可以防止这些崩溃。崩溃的数量急剧减少,但它们仍然会发生。

也将我们的查询包装在 try catch 中,然后捕获 TargetInvocationException 是行不通的。没有捕获异常。

发生崩溃时,我们会收到 WER 报告并可以检索崩溃转储。
来自未编译查询的转储的堆栈跟踪通常如下所示:

at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
at System.Delegate.DynamicInvokeImpl(Object[] args)
at System.Data.Linq.SqlClient.QueryConverter.VisitInvocation(InvocationExpression invoke)
at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node)
at System.Data.Linq.SqlClient.QueryConverter.VisitExpression(Expression exp)
at System.Data.Linq.SqlClient.QueryConverter.VisitBinary(BinaryExpression b)
at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node)
at System.Data.Linq.SqlClient.QueryConverter.VisitExpression(Expression exp)
at System.Data.Linq.SqlClient.QueryConverter.VisitBinary(BinaryExpression b)
at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node)
at System.Data.Linq.SqlClient.QueryConverter.Visit(Expression node)
at System.Data.Linq.SqlClient.QueryConverter.VisitWhere(Expression sequence, LambdaExpression predicate)
at System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc)
at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node)
at System.Data.Linq.SqlClient.QueryConverter.VisitWhere(Expression sequence, LambdaExpression predicate)
at System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc)
at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node)
at System.Data.Linq.SqlClient.QueryConverter.VisitSelect(Expression sequence, LambdaExpression selector)
at System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc)
at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node)
at System.Data.Linq.SqlClient.QueryConverter.VisitDistinct(Expression sequence)
at System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc)
at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node)
at System.Data.Linq.SqlClient.QueryConverter.ConvertOuter(Expression node)
at System.Data.Linq.SqlClient.SqlProvider.BuildQuery(Expression query, SqlNodeAnnotations annotations)
at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)
at System.Data.Linq.DataQuery'1.System.Collections.Generic.IEnumerable.GetEnumerator()
at System.Linq.Buffer'1..ctor(IEnumerable'1 source)
at System.Linq.Enumerable.ToArray[TSource](IEnumerable'1 source)

已编译查询的转储堆栈跟踪如下所示:

at System.RuntimeMethodHandle.InvokeMethod(System.Object, System.Object[], System.Signature, Boolean)
at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(System.Object, System.Object[], System.Object[])
at System.Delegate.DynamicInvokeImpl(System.Object[])
at System.Data.Linq.SqlClient.SqlProvider.AssignParameters(System.Data.Common.DbCommand, System.Collections.ObjectModel.ReadOnlyCollection`1, System.Object[], System.Object)
at System.Data.Linq.SqlClient.SqlProvider.Execute(System.Linq.Expressions.Expression, QueryInfo, System.Data.Linq.SqlClient.IObjectReaderFactory, System.Object[], System.Object[], System.Data.Linq.SqlClient.ICompiledSubQuery[], System.Object)
at System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(System.Linq.Expressions.Expression, QueryInfo[], System.Data.Linq.SqlClient.IObjectReaderFactory, System.Object[], System.Data.Linq.SqlClient.ICompiledSubQuery[])
at System.Data.Linq.SqlClient.SqlProvider+CompiledQuery.Execute(System.Data.Linq.Provider.IProvider, System.Object[])
at System.Data.Linq.CompiledQuery.ExecuteQuery(System.Data.Linq.DataContext, System.Object[])

有谁知道什么可能改变了我们的应用程序的行为?我们知道它是 "an update"(但不完全是哪一个),但我们更感兴趣的是它的技术背景。
当然,我们也欢迎一个解决方案来防止我们的应用程序崩溃。

如果没有看到您的任何 Linq 代码,很难判断,但我大胆猜测这是您正在使用的 Linq 库的内部(转换)错误。

正如您提到的,您最近升级了
(您从哪个 .NET 版本升级到哪个版本?)

我遇到了类似的问题,通过安装 windows 更新解决了,您说您已经完成并取得了一些成功?

尝试识别导致错误的用户输入。尝试自己处理转换而不是依赖 Linq

我想我会 post 我们找到了这个问题的解决方案,因为我们最近开始遇到这个问题。

我们有很多服务器 运行 我们的代码很好,但只有 1 台服务器每周因这个错误崩溃几次。我相信此服务器是在 .net 4.5.2 上。

由于未处理的异常发生在他们的堆栈中,我们向 Microsoft 开了一个工单。

他们查看了我们的转储并返回了这个有效的解决方案。

A new fix is available at https://support.microsoft.com/en-us/kb/3139544

It would be better if you move to .net 4.6.1

我希望这个解决方案能帮助任何发现自己阅读本文的人。