c# - 无法捕获的 AccessViolationException

标签 c# compact-framework native access-violation

我快要绝望了..我正在使用 C# 和相当多的 p/Invoking 为 Windows Mobile 6.1 开发一个现场服务应用程序。 (我想我引用了大约 50 个 native 函数)

在正常情况下,这没有任何问题,但是当我开始强调 GC 时,我遇到了令人讨厌的 0xC0000005 错误,女巫似乎无法捕获。在我的测试中,我快速关闭并打开一个对话框表单(该表单确实使用了 native 函数,但为了测试我将它们注释掉了),过了一会儿,Windows Mobile 错误报告器出现告诉我有一个致命的错误我的应用程序中出现错误。

我的代码在 Application.Run(masterForm); 周围使用了 try-catch 并 Hook 到 CurrentDomain.UnhandledException 事件,但应用程序仍然崩溃。即使我附加了调试器,当异常发生时,Visual Studio 也只是告诉我“与设备的远程连接已丢失”。

由于我没有成功捕获托管环境中的异常,因此我尝试从错误报告器日志文件中找出意义。但这没有任何意义,关于错误的唯一一致的是它发生的应用程序。

我不知道应用程序所在的线程,发生错误的模块有时会有所不同(我见过我的application.exe、WS2.dll、netcfagl3_5.dll和mscoree3_5.dll),甚至错误代码并不总是相同。 (大多数时候是 0xC0000005,但我也看到过 0X80000002 错误,这是占用第一个字节的警告?)

我尝试通过 bugtrap 进行调试,但奇​​怪的是,它会崩溃并显示相同的错误代码 (0xC0000005)。我尝试使用 Visual Studio 打开 kdmp 文件,但我似乎对此没有任何意义,因为它只在我进入错误时显示反汇编代码(除非我有正确的 .pbb 文件,而我没有't)。 WinDbg 也是如此。

长话短说:坦率地说,我不知道在哪里寻找这个错误,我希望 stackoverflow 上的一些聪明的人能知道。我很高兴提供一些代码,但目前我不知道要提供哪一部分..

非常感谢任何帮助!

[2010 年 5 月 3 日编辑]

正如您在我对 Hans 的评论中看到的,在取消所有 P/Invoke 的注释后,我重新测试了整个程序,但这并没有解决我的问题。我尝试用尽可能少的代码重现错误,最终看起来多线程访问是给我带来所有问题的原因。

在我的应用程序中,我有一个用户控件,用作手指/轻拂滚动列表。在此控件中,我为列表中的每个项目使用位图作为 Canvas 。在这个 Canvas 上绘图是由一个单独的线程处理的,当我禁用这个线程时,错误似乎消失了。我将对此进行更多测试,并将结果发布在这里。

最佳答案

捕获此异常不是一种选择。这是线程可能遭受的最严重的心脏病发作,CPU 检测到严重问题并且无法继续运行代码。这总是由行为不当的非托管代码引起的,听起来您的程序中运行了大量非托管代码。您需要集中精力调试非托管代码以达到目的。

引起 AV 的两个最常见原因是

  • 堆损坏。非托管代码不正确地将数据写入堆,破坏了堆的结构完整性。通常是由已分配内存块的边界溢出引起的。或者在释放堆 block 后使用它。很难诊断,在损坏发生很久之后才会引发异常。

  • 堆栈损坏。最常见的原因是堆栈上分配的数组边界溢出。这可能会覆盖堆栈上其他变量的值或破坏函数返回地址。诊断起来更容易一些,它往往可以很好地重复并且具有立竿见影的效果。一个副作用是调试器在损坏发生后失去了显示调用堆栈的能力。

堆损坏是最有可能发生的一种情况,也是最严重的一种情况。最典型的解决方法是使用监视堆完整性的调试分配器来调试调试版本中的代码。 <crtdbg.h> header 提供了一个。这不是一个有保证的方法,你可能会遇到一些非常讨厌的 Heisenbug,它们只会在发布版本中出现。除了仔细的代码审查之外,可用的选项很少。祝你好运,你会需要它。

关于c# - 无法捕获的 AccessViolationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2727784/

相关文章:

c# - F# 属性与 C# 属性

c# - 制作时钟 UWP (C#)

c# - ThreadStart.BeginInvoke 在 Compact 框架上抛出 NotSupportedException

c# - 在 Compact Framework 中更改文件 LastWriteDate

java - 在 Java 中使用外部库

c# - LINQ select 语句后的强类型新对象

compact-framework - 在 windows mobile 6.5 中隐藏确定按钮

maven - 使用 Inno Setup 和 maven 创建 native javafx 应用程序

android - PhoneGap - 调用另一个应用程序(AngryBirds)

c# - 如何通过 MVVM 在 WPF Web 浏览器控件上使用 Javascript