2010-04-28 11 views
2

我越来越接近绝望..我正在开发一个Windows Mobile 6.1使用C#的现场服务应用程序,还有一些p /调用。 (我想我参考了大约50个本地函数)Uncatchable AccesViolationException

在正常情况下,这没有任何问题,但是当我开始强调GC时,我得到了一个令人讨厌的0xC0000005错误女巫似乎无法捕捉。在我的测试中,我正在迅速关闭并打开一个对话窗体(该窗体确实使用了本机功能,但为了测试,我评论了这些),过了一段时间,Windows Mobile错误记者随即告诉我,有一个致命的在我的应用程序错误。

我的代码在Application.Run(masterForm);附近使用try-catch并挂入CurrentDomain.UnhandledException事件,但应用程序仍然崩溃。即使当我连接调试器,视觉工作室告诉我“远程连接到设备已经丢失”,当发生异常时。

由于我没有成功地在托管环境中捕获异常,我试过从Error Reporter日志文件中理解。但是这没有任何意义,唯一与此错误相关的是应用程序出现在哪里。

应用程序发生的线程对我来说是未知的,发生错误的模块与时间不同时间(我已经看到了我的application.exe,WS2.dll,netcfagl3_5.dll和mscoree3_5.dll),即使错误代码并不总是相同的。 (大部分时间它是0xC0000005,但我也看到一个0X80000002错误,这是一个警告会计第一个字节?)

我试着通过bugtrap调试,但奇​​怪的是,这崩溃与相同的错误代码(0xC0000005 )。我试图用Visual Studio打开kdmp文件,但我似乎无法理解这一点,因为它只显示我反汇编代码,当我进入错误(除非我有正确的.pbb文件,我不喜欢“T)。 WinDbg也一样。

长话短说:我坦率地没有一个线索在哪里寻找这个错误,我希望在stackoverflow上有一些明亮的灵魂。我很高兴提供一些代码,但在这一刻,我不知道哪一块提供..

任何帮助,非常感谢!

[编辑2010年5月3日]

正如你可以在我的汉斯评论看到我重新整个节目我所有未被注释的P /调用后,但并没有解决我的问题。我尝试用尽可能少的代码来重现错误,最终看起来像多线程访问是给我所有问题的。

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

+0

看看这个问题,看起来像它可能是相关的:http://stackoverflow.com/questions/724644/ – 2010-04-28 09:43:33

+0

不,我的catch块根本没有被调用.. – Roy 2010-04-28 10:29:16

回答

0

原来是互锁引起的异常。

在我的代码中有一个整数_drawThreadIsRunning,它在绘制线程运行时设置为1,否则设置为0。我使用将该值设置互锁:

if (Interlocked.Exchange(ref _drawThreadIsRunning, 1) == 0) { /* run thread */ }

当我改变这一行整个事情的作品,所以它似乎有与threadsafety有问题的地方,但我不明白。 (即我不想浪费更多时间搞清楚)

感谢您的帮助!

4

捕捉此异常不是一个选项。这是线程可能遭受的最严重的心脏病,CPU检测到严重问题并且无法继续运行代码。这总是由不正确的非托管代码造成的,听起来您的程序中运行着大量代码。您需要专注于调试那些非托管代码以获取某处。

两个的AV的最常见原因是

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

  • 堆栈损坏。最典型的原因是溢出了在堆栈上分配的数组边界。这可以覆盖堆栈上其他变量的值或销毁函数返回地址。有点容易诊断,它往往重复很好,并立即产生效果。一个副作用是调试器在损坏完成后失去了显示调用堆栈的能力。

堆腐败是可能的和艰难的。这通常是通过使用调试分配器来调试调试版本中的代码来解决的,该调试分配器监视堆的完整性。 <crtdbg.h>标题提供了一个。这不是一个有保证的方法,你可以有一些真正令人讨厌的Heisenbugs,它们只能在Release版本中继续前进。很少有选择可供选择,除了仔细的代码审查。祝你好运,你需要它。

+0

我注释了所有p /从我的代码调用,给设备一个硬重置,然后再次开始测试,但仍然存在。 ..呃? – Roy 2010-04-28 13:39:05