当前位置:  开发笔记 > 运维 > 正文

有哪些技术可以解决Windows Mobile设备上非常间歇性的访问冲突问题?

如何解决《有哪些技术可以解决WindowsMobile设备上非常间歇性的访问冲突问题?》经验,为你挑选了1个好方法。

我有一个大型Compact Frameworks V2.0应用程序,在大多数情况下工作得很好.在某些设备上大约每天一次,用户会收到未被标准托管的Try/Catch块捕获的本机错误0xC0000005.

我的应用程序通过ASMX调用以固定间隔与服务器同步.问题似乎发生在同步过程中.除了在同步时发生的ASMX调用之外,还有相当多的业务逻辑,但其中98%是托管代码.我已经回顾了我的所有P/Invokes和应用程序本机C++库,此时我大约95%确定不是问题所在.

由于这只发生在某些设备上并且很少发生(每天不到一次),因此很难隔离.我已经对我的代码进行了解释,看起来好像它发生在应用程序中的随机位置,所以我怀疑某些东西正在破坏内存.

任何关于如何进一步解决这个问题的想法将不胜感激.



1> ctacke..:

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

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

您P/Invoke传递托管对象的句柄的本机API,本机A​​PI使用该句柄.如果在本机API运行时获得集合和压缩,则托管对象可能会移动并且指针变为无效.

你使用缓冲区调用/调用某个东西,该缓冲区太小或小于你传入的大小,并且API超出了读或写的范围

传递给P/Invoke调用的指针(IntPtr等)无效(-1或0),本机在使用前未检查它

您P /调用本机调用,本机代码耗尽内存(通常是虚拟的),并且不检查失败的分配和对无效地址的读/写

您使用未初始化的GCHandle或以某种方式指向已经完成和收集的对象(因此它不指向对象,它指向一个对象曾经是的地址)

您的应用程序使用句柄来处理因睡眠/唤醒而失效的内容.这更为深奥,但肯定会发生.例如,如果您正在从存储卡运行应用程序,则整个应用程序不会加载到RAM中.正在使用的片段被请求分页以供执行.这一切都很好.现在,如果关闭设备,驱动程序全部关闭.重新启动电源时,许多设备只需重新安装存储设备即可.当你的应用程序需要在更多程序中请求页面时,它不再是它的位置而且它会消失.安装的商店中的数据库可能会发生类似的行为 如果您有一个打开的数据库句柄,在睡眠/唤醒周期后,连接句柄可能不再有效.

你会注意到这里的趋势,几乎所有这些都是P/Invokes,这不是偶然的.获取托管代码是非常困难的.

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有