【问题标题】:EXC_BAD_ACCESS on device, but fine on SimulatorEXC_BAD_ACCESS 在设备上,但在模拟器上很好
【发布时间】:2011-04-04 18:23:41
【问题描述】:

我有一个在模拟器上运行良好的滚动视图应用程序,但是,当我安装在设备上时,当我尝试滚动一页时,它会给我一个 EXC_BAD_ACCESS。我已经通过具有分配和泄漏的仪器运行它,但是没有任何东西泄漏,也没有僵尸消息……我只是好奇是什么导致了模拟器与设备之间的这种差异?任何调试方法,因为我的符号化崩溃日志(部分如下),似乎不是很符号化。

异常类型:EXC_BAD_ACCESS (SIGBUS)
异常代码:0x0000000f 处的 KERN_PROTECTION_FAILURE
崩溃的线程:0

线程 0 崩溃:
0 libobjc.A.dylib           0x0000286e objc_msgSend + 18
1 MyApp                  0x00004fee 0x1000 + 16366
2 UIKit                    0x000668f4 -[UIViewController 视图] + 104
3 MyApp                 0x00009716 0x1000 + 34582
4 MyApp                 0x0000960c 0x1000 + 34316
5 UIKit                   0x0001426c -[UIScrollView setContentOffset:] + 344

谢谢

【问题讨论】:

  • 您是否正在访问一些存储/下载在您的应用程序文档目录中的数据/媒体(即设备上的某些内容但不是捆绑包的一部分..)导致代码访问它对于模拟器和设备的行为不同有时......(我不记得我是如何解决它的......或者我做错了什么......)
  • 我确实有一些图像,但它们都在资源中,因此应该复制到设备上。这是我唯一能想到的。
  • 请检查它们是否真的被复制到包中。如果是这样,您将在此处找到它们:“组和文件”浏览器 -> “目标” -> 您的目标 -> “复制捆绑资源”。如果没有,只需添加它。
  • 是的,它们都处于复制捆绑资源阶段。

标签: iphone iphone-sdk-3.0 crash ios-simulator exc-bad-access


【解决方案1】:

我想将我的案例添加到讨论中。我刚刚解决了一个与此非常相似的问题。它在模拟器上工作,但在设备上失败。还以为是内存问题。不是。

原来我忘记了非 void 方法上的 return。预计会返回一个值,但我完全忘记了返回。如果你问我,这是一个非常糟糕的错误,但它在模拟器中运行没有问题(即使返回实际上被用于存储变量并用它做一些其他事情)。

模拟器每次都以某种方式工作而忘记了返回。击败我,但我只能疯狂地猜测它必须将我使用的最后一个变量放在返回应该指向的同一个位置,从而导致错误(错误但正确)的返回。

然后在设备上运行,在正常情况下,它每次都崩溃。带我一步步调试,发现我没有正确返回失败方法的结果。

希望对遇到此问题的人有所帮助!

【讨论】:

    【解决方案2】:

    您在模拟器中的代码可能存在错误,但不会触发 EXC_BAD_ACCESS 只是因为您取消引用的指针不在未映射的内存中。一个指针可能是坏的,可以访问,但没有被检测到——它仍然是一个错误。

    你已经检查了没有僵尸消息,这本来是我的第一个建议。

    接下来要做的是启用 Guard Malloc -- 然后阅读本文

    http://developer.apple.com/iphone/library/documentation/Performance/Conceptual/ManagingMemory/Articles/MallocDebug.html

    您只能在模拟器中执行此操作——您的目标是使用超敏感堆使错误在模拟器中抛出 EXC_BAD_ACCESS。

    在文章中:

    1. 看看如何在GDB中设置变量
    2. 阅读“检测堆损坏”部分

    【讨论】:

      【解决方案3】:

      设备上的错误访问可能有很多原因,其中大多数与设备内存比模拟器少有关,因此它会更快地释放内存。

      它发现问题的最佳方法是在没有断点的调试模式下在设备上运行应用程序(这样做的一个原因是添加断点然后删除它)。如果您可以通过这种方式重现错误访问,则在重现它之后,您可以查看调试器控制台(cmd+shift+y),您会看到程序已在类似的断点处停止,然后继续线程堆栈查看您的应用执行的最后一次调用和失败的调用,可能是访问了错误的指针。

      【讨论】:

      • 谢谢哥们,我用你在内存问题下查找变量的方式发现了我的问题....谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多