我有一个大型Compact Frameworks V2.0应用程序,在大多数情况下效果很好。在某些设备上大约每天一次,用户会收到未被标准托管的Try / Catch块捕获的本机错误0xC0000005。
我的应用程序以固定间隔通过ASMX呼叫与服务器同步。问题似乎发生在同步过程中。除了在同步时发生的ASMX调用之外,还有相当多的业务逻辑,但其中98%是托管代码。我已经回顾了我的所有P / Invokes和应用程序本机C ++库,此时我大约95%确定不是问题所在。
由于这只发生在某些设备上并且很少发生(每天不到一次),因此很难隔离。我已经对我的代码进行了解释,看起来好像它发生在应用程序中的随机位置,所以我怀疑某些东西会破坏内存。
有关如何进一步排除故障的任何想法都将不胜感激。
答案 0 :(得分:5)
0xC0000005是一种访问冲突,因此有些东西试图读取或写入一个它无权访问的地址。这些往往很难找到,而且经验是最好的工具之一(而Platform Builder的调试器也非常有用,但这是一个完全独立的调试途径,需要你可能没有的经验,或者你已经拥有过的经验尝试过)。我发现,减法编码往往没那么有用 - 只要有可能就用模拟托管调用删除P / invoke调用。
托管应用中的访问冲突通常是由于以下原因之一而发生的:
你会注意到这里的趋势,几乎所有这些都是P / Invokes,这不是偶然的。很难让托管代码自行完成。
答案 1 :(得分:1)
我的本机C ++异常处理不包括异步异常,因此没有捕获访问冲突异常。
这可能/可能对我的问题没有帮助,但可能对其他人有帮助。
使用此链接中记录的/ EHa开关可以捕获这些类型的异常: