c# - 奇怪的访问冲突异常

标签 c# .net multithreading access-violation

我对 AccessViolationException 的出现感到困惑.有一个干净的复制品相当不可能(见答案),但一般的想法是:

class MyClass 
{
  public List<SomeType> MyMethod(List<string> arg)
  {
     // BREAKPOINT here
     // Simple stuff here, nothing fancy, no external libs used
  }
}

delegate List<SomeType> MyDelegate(List<string> arg);

... 

var myObject = new MyClass();

Func<List<string>, List<SomeType>> myFunc = myObject.MyMethod;
MyDelegate myDelegate = myObject.MyMethod;

myFunc(null)            // works fine
myDelegate(null)        // works fine
myObject.MyMethod(null) // throws AccessViolationException

奇怪的是我没有使用任何不安全的代码。我在任何地方(以及整个程序执行 AFAIK 的任何地方)都没有对外部库的任何依赖。

最奇怪的是这是 100% 可重现的,甚至在稍微重构代码之后,将方法调用移到别处,在它之前放置额外的代码等等 - 在所有情况下 AccessViolationException仍然会在该特定方法调用时抛出。直接调用时永远不会进入该方法(不会命中断点)。通过委托(delegate)或 Func<> 调用它工作正常。

关于可能导致它的原因或如何调试它的任何线索?

更新

继 antiduh 的问题之后:在附近的任何地方都没有从构造函数调用虚方法。发生这种情况时的实际堆栈跟踪非常简单,只有两个静态方法和一个简单的实例方法。

唯一的线索似乎是线程。有 Parallel.ForEach()Thread.Sleep()在程序执行中调用之前(不在调用堆栈中)。关于线程处理不当(使用常规托管类)如何导致 AVE 的任何线索?

更新

将其缩小为 VS 错误,请参阅我的回答。

最佳答案

这似乎是一个VS 错误。看看this full solution .代码很简单:

using System;
using System.Collections.Generic;

namespace Foo
{
    public class MyClass
    {
        public virtual object Foo(object o1, object o2, object o3, object o4)
        {
            return new object();
        }
    }

    public sealed class Program
    {
        public static void Main(string[] args)
        {
            var myClass = new MyClass();
            object x = new object();
            myClass.Foo(null, null, null, new object()); // put a breakpoint here and once it stops, step over (F10) - AccessViolationException should be thrown in VS
        }
    }
}

我之前错过的重要事实是代码在正常运行时实际上工作正常。仅当在 VS (F10) 中跨过该特定行时,才会发生访问冲突,并且它实际上发生在 VS 托管进程中(即使最终堆栈框架是我的代码)。可以继续正常执行。

这个问题发生在我的 VS 2013 版本 12.0.21005.1 REL 上。它也发生在我测试过的其他 3 台机器上。

更新

正在安装 .NET Framework 4.5.2解决了这个问题。

关于c# - 奇怪的访问冲突异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24513384/

相关文章:

java - Oracle Form 频繁挂起

c# - 用于过滤导航属性和集合的 Linq 动态表达式

c# - 什么是生活模拟器的好架构

c# - 使用 Microsoft.ApplicationInsights.NLogTarget 的 Azure Application Insights 中没有日志条目

c# - 101 Rx 示例

c# - kernel32.dll Sleep 和 Thread.Sleep() 之间的任何区别

c# - 通过反射访问抽象类的属性

c# - 将数据从 dotnetcore api 发布到 .net api 不起作用

javascript - AngularJS 路由器和 .NET 后端 - 在 templateUrl 上获取重定向

java - 完全相同的代码(使用多线程)无法在两台不同的计算机上运行