我们的应用程序经历了奇怪致命的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
异常本身似乎不包含任何信息,而不是消息“尝试读取或写入受保护的内存。这通常表明其他内存已损坏。”
更新
答案 0 :(得分:6)
您遇到的情况与“程序遇到问题并且现在将关闭”完全相同,除非它被.NET运行时捕获,而不是操作系统。
查看堆栈跟踪,它不是由您的代码触发的,这使我认为它来自您正在使用的库或自定义控件生成的工作线程。
跟踪这样的事情的唯一方法是在调试器下运行本机库,调试器应该在访问冲突到CLR层之前捕获它。这可能很容易或很难。
如果本机代码是您自己的项目,那么设置它的最简单方法是将.NET项目和C ++项目放在同一个解决方案中,并确保.NET项目引用C ++项目。如果您发布有关您的环境的更多详细信息,我可能会提供更具体的建议。
答案 1 :(得分:3)
堆栈跟踪指向本机调度信使的MSG参数中的错误数据。您是否尝试从Microsoft加载符号并检查该堆栈跟踪的参数。
如果不了解你的ui上的控件以及你所连接的任何事件,就很难确定究竟是什么问题。
答案 2 :(得分:3)
我有一个类似的问题,与@BartRead不同,一直都是这样。对我来说,一些CLI代码在一个简单的Windows窗体应用程序中运行良好,但是当我把它放在一个larager插件生态系统(多线程)中时,消息需要使用Application.Run或Application.DoEvents。如果您可以访问正在抽取的代码,那么最好的选择(对我有用)就是在保持功能的同时注释掉越来越多的代码。事实证明我没有GC :: Alloc一个回调/委托,虽然固定和仍然引用已经在内存中移动或直接标记为收集。
如果您使用GC Alloc,请务必自行清理!
答案 3 :(得分:2)
我在使用ADO执行存储过程时遇到此问题。 这个错误有两个原因:
答案 4 :(得分:0)
stacktrace不会告诉您任何信息:-(.。您可以更新软件包以查看是否消失了吗?从工作线程访问属性时,我看到System.AccessViolationException与None-Threadsafe Com-Objects。所以,我可以想象到该异常是由某些API使用的较早的非线程安全版本引起的。
我通过添加Attributes
处理了这种情况[HandleProcessCorruptedStateExceptions]
[SecurityCritical]
方法,我从COM对象访问这些冲突的属性。 另外我还必须添加
<legacyCorruptedStateExceptionsPolicy enabled="true" />
设置为我的app.config,然后能够捕获这些异常并进行明智的处理。
更多信息Corrupted State Exceptions MS Docs 通过处理损坏的状态异常并且不关闭进程,您可以离开,“ CLR为程序的正确性和内存安全性提供了相当有力的保证”。