我们的应用程序遇到了奇怪的致命 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
异常本身似乎不包含比消息更多的信息“尝试读取或写入受保护的内存。这通常表明其他内存已损坏。”
- 我们现在可以采取哪些步骤来找出问题的原因?
- 有没有办法确定导致崩溃的非法地址或指针值?
- 我们能否找出导致问题的本机库代码?
- 我们可以启用更多调试/跟踪吗?
UPDATE
- 这是否是由于早期使用 WinForms API 的非线程安全造成的?
您所遇到的情况与“程序遇到问题,现在将关闭”完全相同,只不过它是由 .NET 运行时而不是操作系统捕获的。
查看堆栈跟踪,它不是由您的代码触发的,这让我认为它来自您正在使用的库或自定义控件生成的工作线程。
跟踪类似情况的唯一方法是在调试器下运行本机库,这应该在访问冲突上升到 CLR 层之前捕获它。这可能很容易也可能很困难。
如果本机代码是您自己的项目,那么最简单的设置方法是将 .NET 项目和 C++ 项目放在同一个解决方案中,并确保 .NET 项目引用 C++ 项目。如果您发布有关您的环境的更多详细信息,我也许可以提供更具体的建议。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)