C# 查找System.AccessViolationException的原因
我们的应用程序遇到异常致命的System.AccessViolationException。我们在配置AppDomain.CurrentDomain.UnhandledException事件以记录异常时看到了这些异常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
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项目和C++项目都放在同一个解决方案中,并确保.NET项目引用C++项目。如果您发布有关您的环境的更多详细信息,我可能会给出更具体的建议。
堆栈跟踪指向本机dispatch messenger的MSG参数中的错误数据。您是否尝试过从Microsoft加载符号并检查堆栈跟踪的参数如果不知道用户界面上的控件以及您连接到的任何事件,就很难确定到底是什么问题 我也有类似的问题,与@BartRead不同,我一直都有。对我来说,一些CLI代码在一个简单的windows窗体应用程序中运行得很好,但当我把它放在一个更大的插件生态系统(多线程)中时,需要用Application.Run或Application.DoEvents来发送消息。如果您可以访问正在抽取的代码,那么最好的办法(对我来说是这样)是在保持功能的同时注释掉越来越多的代码片段。事实证明,我并没有GC::Alloc’d回调/委托,并且在被固定和仍然被引用的情况下,已经在内存中移动或直接向上标记以进行收集
如果你使用GC-Alloc,一定要自己清理 我在使用ADO执行存储过程时遇到了这个问题。 此错误有两个原因:
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" />