首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >寻找System.AccessViolationException的病因

寻找System.AccessViolationException的病因
EN

Stack Overflow用户
提问于 2011-02-27 15:16:42
回答 5查看 35.2K关注 0票数 31

我们的应用程序经历了奇怪的致命System.AccessViolationException。当我们将AppDomain.CurrentDomain.UnhandledException事件配置为记录异常时,我们看到了这些。

代码语言:javascript
复制
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造成的?
EN

回答 5

Stack Overflow用户

发布于 2011-02-27 15:46:03

您正在体验的完全等同于“程序已经经历了问题并将关闭”,但它是被.NET运行时捕获的,而不是操作系统。

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

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

如果本机代码是您自己的项目,那么设置它的最简单方法是将.NET项目和C++项目放在同一个解决方案中,并确保.NET项目引用的是C++项目。如果你发布更多关于你的环境的细节,我也许能给出更具体的建议。

票数 7
EN

Stack Overflow用户

发布于 2012-04-19 23:33:54

堆栈跟踪指向本机分派信使的MSG参数中的坏数据。您是否尝试过从Microsoft加载符号并检查堆栈跟踪的参数。

如果不了解ui上的控件和连接到的任何事件,就很难确定到底是什么问题。

票数 3
EN

Stack Overflow用户

发布于 2015-06-04 22:03:09

我也有类似的问题,不像@BartRead,一直如此。对我来说,一些CLI代码在一个简单的windows窗体应用程序中工作得很好,但是当我把它放在一个大型插件生态系统(多线程)中时,需要使用Application.Run或Application.DoEvents来发送所需的消息。如果您能够访问正在运行的代码,最好的选择(对我起作用)是在维护功能的同时注释掉越来越多的代码片段。原来,我没有GC::Alloc的回调/委托,虽然被固定和仍然引用,但在内存中被移动,或者直接被标记为收集。

如果你使用GC的话,一定要自己清理干净!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5133971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档