C# 随机获取System.AccessViolationException的程序

C# 随机获取System.AccessViolationException的程序,c#,debugging,runtime-error,C#,Debugging,Runtime Error,好的,我在调试方面遇到了很多问题。我正在使用VS2013 Pro和Windows 8.1。两者都是最新的。问题是,当我开始调试时,有一半的时间会抛出此错误: 类型为“System.AccessViolationException”的未处理异常 发生在System.Windows.Forms.dll中 其他信息:尝试读取或写入受保护内存。 这通常表示其他内存已损坏 这也不是我的代码的错。我做了一个简单的测试,作为下面的一个例子。请注意,我没有引用此应用程序中的System.Windows.Form

好的,我在调试方面遇到了很多问题。我正在使用VS2013 Pro和Windows 8.1。两者都是最新的。问题是,当我开始调试时,有一半的时间会抛出此错误:

类型为“System.AccessViolationException”的未处理异常 发生在System.Windows.Forms.dll中

其他信息:尝试读取或写入受保护内存。 这通常表示其他内存已损坏

这也不是我的代码的错。我做了一个简单的测试,作为下面的一个例子。请注意,我没有引用此应用程序中的System.Windows.Forms

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace ConsoleApplication2
    {
        class Program
        {
            static void Main(string[] args)
            {
                List<int> testing = new List<int>();
                for(int i =0; i < 50; i++)
                {
                    testing.Add(i);
                }

                for (int i = 0; i < 50; i++)
                {
                    Console.WriteLine(testing[i].ToString());

                }

                Console.ReadLine();
            }
        }
    }
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
命名空间控制台应用程序2
{
班级计划
{
静态void Main(字符串[]参数)
{
列表测试=新列表();
对于(int i=0;i<50;i++)
{
增加(i);
}
对于(int i=0;i<50;i++)
{
Console.WriteLine(测试[i].ToString());
}
Console.ReadLine();
}
}
}
我不知道是什么原因造成的。如果我单击“确定”并再次运行它,大多数时候它都会工作。有时我不得不做两次

有什么想法吗

堆栈跟踪:


没有任何东西看起来可能会导致问题

您是否尝试启用异常时中断?这将导致代码在遇到异常时暂停


在某些情况下,VS/.net framework似乎存在内存占用问题。我真的希望当有人说什么东西坏了的时候,人们不要再说“不可能”了。

我可以证实这个问题。它发生在一个小的(非常琐碎的)WinForms程序中,该程序与我自己的商业应用程序一起分发。这在VS2005之前的版本中从未发生过,包括在同一台机器上运行的版本。它只发生在VS2013年。我的VS版本没有第三方加载项,只有VS本身安装的加载项。即使注释掉“Main()”中的所有代码,也会出现问题。我尝试过重新启动、禁用病毒检查器、防火墙等。我的应用程序针对的是哪一个版本(2.0、3.5、4.0,随便什么)都没有区别。它经常发生,但随机发生。有时有效,有时无效。如图所示。

将平台目标更改为x86对我来说是可行的,在没有前面提到的异常的情况下,单步执行代码是不可能的。我运行Win 8.1 64位和Visual Studio 2013。

我在使用Visual Studio express2015的Windows 10上也遇到了这个问题。构建到x86并没有解决我的问题,但以下解决方法解决了问题:

此问题是由收集返回值的代码引起的。可以通过禁用托管返回值来解决此问题

  • 转到系统属性(Win8:WinKey+X,选择“系统”,Win7:从我的计算机打开“属性”)
  • 高级系统设置
  • 环境变量
  • 单击“新建”并添加
    • 名称:VSDebug_DisableManagedReturnValue
    • 价值:1

  • 来源:

    在我的案例中,这种VS行为是由Comodo防火墙引起的

    解决方案是将VS Projects文件夹添加到Comodo HIPS排除列表中(即使HIPS已关闭!)


    下面是一个相关的线程Comodo论坛:

    通过编写控制台应用程序,您可以在
    System.Windows.Forms.dll
    中获得该异常。你确定只要运行你的代码就可以重现这个异常吗?这正是我的观点。这不是我的密码。但我想这和VisualStudio有关。如果有必要,我可以制作一个视频lol来证明代码产生了错误。可能是调试器探测/反射变量…@JABFreeware,可能是Visual studio扩展?这段视频会很好,因为它可以帮助我们了解异常是从哪里产生的。您所描述的可能性很小。解决方案中还有其他项目吗?不在调试器下运行时是否会发生这种情况?您的控制台程序是否链接到Windows.Forms.Dll?您是否启用了任何Visual Studio扩展?(如果是,请禁用它们。)我无法重现您的问题。显然,这里的其他人也不能。因此,您的配置中肯定有一些不同的地方。这似乎是IDE的一个问题。如果我不单步执行,代码可以正常运行,但当我执行时,会遇到访问冲突。我没有解决问题的方法,但这几乎肯定不是IDE问题。这种行为通常表示线程问题,即你会得到某种竞态条件,这种竞态条件在单步通过时是单向的,在直接运行时是反向的。我刚刚发现它讨论了许多可能影响这种情况的场景。安装.NET4.5.2并不能解决我的问题,但将“平台目标”从“任何CPU”更改为“x86”就解决了(在“构建”属性页上)。这不是一个理想的情况,但这只是一个开始。我在VS 2015 Enterprise中调试相当复杂的Windows窗体应用程序时了解到这一点。IBM iDbAccess库正在抛出该错误,并且在调试时始终发生该错误。如果我不单步执行,我的错误日志仍然会记录它,因此调试会导致程序在异常时中断,但异常仍在幕后发生。我还没有检查版本配置是否存在此问题,而且它似乎从未影响已编译的可执行文件。我遇到了一个类似于Joseph Morgan所描述的问题。我只有在分步执行外部.NET库中的反汇编代码时才会出现错误。我认为IDBAccess可能是我问题的根源,尽管错误是由…unsafentiveMethods.IMsoComponentManager.FPushMessageLoop引发的。是否还有其他人遇到访问问题