gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 06:38:52 25 4
gpt4 key购买 nike

我有一个大型的 Compact Frameworks V2.0 应用程序,它在大多数情况下运行良好。在某些设备上,大约每天一次,用户会收到一个 native 错误 0xC0000005,该错误未被标准托管的 Try/Catch block 捕获。

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

由于这种情况只发生在某些设备上并且很少发生(每天少于一次),因此很难隔离。我已经检测了我的代码,它似乎发生在应用程序中的随机位置,所以我怀疑有什么东西正在破坏内存。

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

最佳答案

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

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

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

您会注意到这里的趋势,几乎所有这些都是 P/Invoke,这绝非偶然。很难让托管代码自行执行此操作。

关于windows-mobile - 有哪些技术可以解决 Windows 移动设备上非常间歇性的访问冲突问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/402957/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com