【问题标题】:Track down out-of-bounds access on iPhone追踪 iPhone 上的越界访问
【发布时间】:2012-04-18 12:33:59
【问题描述】:

我平均工作(大约 20k 行代码,Objective-C 与 C++ 混合),我正在努力寻找 EXC_BAD_ACCESS 错误。

我已经尝试了所有常见的技术(比如启用 NSZombie、保护边缘等)。到目前为止,我已经排除了访问已释放对象的可能性,以及双释放错误。

似乎有些东西写入了不应该写入的内存空间。但是,正如许多内存错误一样,它不会一直发生,也不会总是在同一个地方崩溃。 (有时我会收到“对象在被释放后被修改”的消息)。

有时,被覆盖的内存属于 allocator,它在 malloc 或 free() 上崩溃。

当然,应用程序中的某些更改可能会影响错误的行为 - 如果我尝试注释掉部分代码,错误出现的频率会降低,因此更难找到它。

最后,我一直在研究使用 valgrind,但似乎所有使用它的人都在模拟器上工作。但我的代码必须在实际设备上运行(某些代码是 ARM 特定的)

是否有任何关于如何调试此类错误的一般提示?

注意:该应用程序涉及视频处理,因此使用的内存量相当大。

【问题讨论】:

  • 如果使用的内存相当大,如果收到内存不足警告,您是否看到了内存状况?在这种情况下,操作系统将卸载屏幕上没有的任何内容。你可能会在那里遇到问题。我假设您没有使用 ARC?
  • 我没有收到内存警告,“相当大”是指十几 MB,而不是 100MB。但是什么是ARC?自动引用计数?如果是,答案是否定的。我对大多数 C++ 代码使用 shared_ptr,对 ObjC 使用简单的指针
  • 如果你在调试器中运行它,当它崩溃时你会得到一个堆栈跟踪吗?
  • 有时,但它并不总是相同的堆栈,所以我认为它不一定相关。
  • 你在使用 Objective-C 块对象吗?多线程?您提到您只是在 Objective-C 中使用“简单指针”-您是依赖自动释放池还是手动分配/保留/释放?

标签: iphone c++ objective-c ios memory


【解决方案1】:

XCode 上有一些特殊的工具可用。您可以尝试使用它们来分析您的代码。 http://developer.apple.com/library/mac/#featuredarticles/StaticAnalysis/index.html 它会在使用无效对象的情况下产生一些警告,以便帮助您找到问题。

【讨论】:

  • 好的,那么我认为只有一个解决方案。这是为了将单元测试合并到您的应用程序中。
【解决方案2】:

如果您认为是 C++ 代码导致了问题,您可以将 C++ 从您的 iPhone 项目中复制出来并创建一个 Mac 项目。有了这个,您可以设置各种压力测试。而且,您应该也可以使用 valgrind。

【讨论】:

  • ARM代码在C++部分,但我想我会按照你的建议排除Objective-C部分(在Valgrind下运行)
猜你喜欢
  • 2011-09-25
  • 2021-10-06
  • 2011-05-17
  • 2011-05-15
  • 2018-06-21
  • 1970-01-01
  • 2020-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多