【发布时间】: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