Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 查找System.AccessViolationException的原因_C#_.net_Exception_Access Violation - Fatal编程技术网

C# 查找System.AccessViolationException的原因

C# 查找System.AccessViolationException的原因,c#,.net,exception,access-violation,C#,.net,Exception,Access Violation,我们的应用程序遇到异常致命的System.AccessViolationException。我们在配置AppDomain.CurrentDomain.UnhandledException事件以记录异常时看到了这些异常 Exception: System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is cor

我们的应用程序遇到异常致命的System.AccessViolationException。我们在配置AppDomain.CurrentDomain.UnhandledException事件以记录异常时看到了这些异常

Exception: System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
   at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
   at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.Run(Form mainForm)
   at Bootstrap.Run() in e:\build-dir\src\Bootstrap.cs:line 25
异常本身似乎只包含“试图读取或写入受保护内存。这通常表示其他内存已损坏”的消息

  • 我们现在可以采取什么步骤来找出问题的原因
  • 有没有办法确定导致崩溃的非法地址或指针值
  • 我们能找出是什么本机库代码导致了这个问题吗
  • 我们是否可以启用更多的调试/跟踪
更新

  • 这可能是因为以前使用WinForms API时没有线程安全吗

您所经历的完全等同于“程序遇到问题,现在将关闭”,只是它被.NET运行时捕获,而不是被操作系统捕获

查看堆栈跟踪,它不是由您的代码触发的,这使我认为它来自您正在使用的库或自定义控件生成的工作线程

跟踪类似情况的唯一方法是在调试器下运行本机库,调试器应该在访问冲突冒泡到CLR层之前捕获它。这可能是容易的,也可能是困难的


如果本机代码是自己的项目,那么最容易设置的方法是将.NET项目和C++项目都放在同一个解决方案中,并确保.NET项目引用C++项目。如果您发布有关您的环境的更多详细信息,我可能会给出更具体的建议。

堆栈跟踪指向本机dispatch messenger的MSG参数中的错误数据。您是否尝试过从Microsoft加载符号并检查堆栈跟踪的参数


如果不知道用户界面上的控件以及您连接到的任何事件,就很难确定到底是什么问题

我也有类似的问题,与@BartRead不同,我一直都有。对我来说,一些CLI代码在一个简单的windows窗体应用程序中运行得很好,但当我把它放在一个更大的插件生态系统(多线程)中时,需要用Application.Run或Application.DoEvents来发送消息。如果您可以访问正在抽取的代码,那么最好的办法(对我来说是这样)是在保持功能的同时注释掉越来越多的代码片段。事实证明,我并没有GC::Alloc’d回调/委托,并且在被固定和仍然被引用的情况下,已经在内存中移动或直接向上标记以进行收集


如果你使用GC-Alloc,一定要自己清理

我在使用ADO执行存储过程时遇到了这个问题。 此错误有两个原因:

  • 错误的连接字符串
  • 参数类型未匹配(将long传递给db-int32或long传递给更短的nvarchar(10))

  • stacktrace什么都不告诉您:-(。您可以更新您的包以查看异常是否消失吗?我看到System.AccessViolationException在从workerthread访问属性时没有Threadsafe Com对象。因此,是的,我可以想象异常是由使用某个API的早期非Threadsafe版本引起的

    我通过添加

    方法,在该方法中,我从COM对象访问这些冲突属性。 我还必须添加

    <legacyCorruptedStateExceptionsPolicy enabled="true" />
    
    
    
    设置为my app.config,并且能够捕获这些异常并明智地处理

    更多信息 通过处理损坏的状态异常,并且不关闭进程,您就离开了“CLR为程序正确性和内存安全提供了一些非常有力的保证”的道路


    归功于

    它不是工作线程,它在主UI线程上消亡。注意Application.Run()同意Hans的意见。我们偶尔会在.NET Reflector:Application.Run()中的用户机器上收到这样的报告抛出AccessViolationException,但我们不知道为什么。它非常罕见,我们从未在内部看到过,因此我们无法调试它。我希望了解出了什么问题,这样我们至少可以向用户指出一些有用的信息,但,唉,到目前为止我被拒绝了。您是否尝试过使用debu运行此功能附加了gger,还加载了足够的符号,以提供有用的调用堆栈?
    <legacyCorruptedStateExceptionsPolicy enabled="true" />