Windows mobile 在Windows Mobile设备上,有哪些技术可以解决非常间歇性的访问违规问题?

Windows mobile 在Windows Mobile设备上,有哪些技术可以解决非常间歇性的访问违规问题?,windows-mobile,compact-framework,access-violation,Windows Mobile,Compact Framework,Access Violation,我有一个大型的CompactFrameworksV2.0应用程序,在大多数情况下都运行得很好。在某些设备上,用户大约每天接收一次本机错误0xC0000005,该错误未被标准托管的Try/Catch块捕获 我的应用程序以固定的时间间隔通过ASMX调用与服务器同步。该问题似乎发生在同步过程中。除了同步时发生的ASMX调用之外,还有相当多的业务逻辑,但其中98%是托管代码。我已经回顾了我所有的P/调用和应用程序的本地C++库,在这一点上,我大约95%确定,这不是问题所在。 因为这种情况只发生在某些设备

我有一个大型的CompactFrameworksV2.0应用程序,在大多数情况下都运行得很好。在某些设备上,用户大约每天接收一次本机错误0xC0000005,该错误未被标准托管的Try/Catch块捕获

我的应用程序以固定的时间间隔通过ASMX调用与服务器同步。该问题似乎发生在同步过程中。除了同步时发生的ASMX调用之外,还有相当多的业务逻辑,但其中98%是托管代码。我已经回顾了我所有的P/调用和应用程序的本地C++库,在这一点上,我大约95%确定,这不是问题所在。 因为这种情况只发生在某些设备上,而且很少发生(每天不到一次),所以很难隔离。我已经说明了我的代码,它似乎发生在应用程序中的随机位置,所以我怀疑有什么东西正在破坏内存


任何关于如何进一步解决此问题的想法都将不胜感激。

0xC0000005是一种访问冲突,因此有人试图读取或写入其无权访问的地址。这些工具往往很难找到,经验是最好的工具之一(Platform Builder的调试器也很有用,但这是一个完全独立的调试途径,需要您可能没有或已经尝试过的经验)。我发现日志记录往往不如减法编码有用——尽可能使用模拟托管调用删除P/invoke调用

托管应用中的访问冲突通常发生在以下原因之一:

  • P/调用本机API,将句柄传递给托管对象,本机API使用该句柄。如果在本机API运行时获得收集和压缩,则托管对象可能会移动,指针将变为无效
  • 您使用的缓冲区太小或小于您传入的大小来P/Invoke某个对象,API会导致读写溢出
  • 传递给P/Invoke调用的指针(IntPtr等)无效(-1或0),并且本机在使用前未对其进行检查
  • 您P/Invoke一个本机调用,本机代码就会耗尽内存(通常是虚拟的),并且不会检查失败的分配和对无效地址的读/写
  • 您使用的GCHandle未初始化或以某种方式指向已完成并收集的对象(因此它不是指向对象,而是指向对象以前所在的地址)
  • 你的应用程序使用一个句柄来处理因睡眠/唤醒而失效的内容。这更为深奥,但肯定会发生。例如,如果您使用存储卡运行应用程序,则整个应用程序不会加载到RAM中。正在使用的工件按需分页以供执行。这一切都很好。现在,如果关闭设备电源,驱动程序将全部关闭。当您进行电源备份时,许多设备只需重新装载存储设备。当你的应用程序需要在更多的程序中添加页面时,它就不在原来的位置了,它就会死掉。装载存储上的数据库也可能发生类似的行为。如果数据库的句柄已打开,则在睡眠/唤醒周期后,连接句柄可能不再有效

您会注意到这里的趋势,几乎所有这些都是p/Invokes,这不是偶然的。很难得到托管代码自己完成。

< P>我的本地C++异常处理不包括异步异常,因此没有捕获访问异常。< / P> 这可能/可能对我的问题没有帮助,但可能对其他人有帮助

使用本链接中记录的/EHa开关将允许捕获以下类型的异常:


您能说服崩溃发生在设备模拟器内部吗?通过仿真器进行本机调试可能会让您有所收获;除此之外,你所能做的就是拔掉应用程序的大部分,看看它是否停止死亡。换句话说,一点也不好玩。Tnx…不是真的…我无法“说服”它以任何方式崩溃…我认为它可能与在设置电源要求后退出睡眠模式有关。我从未见过设备充电时出现问题。是的,睡眠/唤醒是完全不同的事情。我已经修改了我的答案,包括这一点。感谢ctacke的全面反馈-经过彻底的代码审查后,我看到的唯一属于您上面的类别之一的是StringBuilder,在发送给P/Invoke之前,我没有固定它。我在某个地方读到,编组以某种方式处理了这个问题,你知道这是否正确吗?我只是想尝试一下减法代码方法,但至少有一天两次失败,这可能会很困难。这似乎只发生在某些设备上,当处于睡眠模式/当它醒来进行同步时不充电。这可能是BSP或compact Framework本机代码中的某些内容吗?在Windows CE中,您永远不能认为平台不是罪魁祸首。这当然可能是一个问题。至于StringBuilder,它取决于使用情况。如果是同步通话,你就安全了。如果它是异步的,不是,你不是。再次感谢你提供更多的细节,它是在一个同步调用中,所以我想我是安全的。崩溃报告中的详细信息有三个值,ExceptionCode为0xC00 ExceptionAddress:0x12341234和Reading:0x0000000。我假设用于读取的0x00可能无法分配内存,而用于读取的0x[OTHERADDR]可能意味着托管对象被移动或某个对象被损坏。对的事实上,对于DLL映像,ExceptionAddress值是否有任何意义?再次感谢你的帮助,这件事把我难住了。