我们有一些非常随机的错误正在发生,并抛出EXC_BAD_ACCESS、malloc_error_break或abort。异常之间没有一致性,而且启用NSZombies不会导致任何僵尸被触发。
事实上,在启用僵尸的情况下运行将不会发生崩溃。我相信这个代码库中有一个微妙的记忆错误,在花了很多小时清理那些可能是小问题之后,我们仍然没有解决这个问题。
这是合理的,一个糟糕的指针可能覆盖一段内存,然后被取消引用和崩溃的应用程序。但是,还有什么其他方法来孤立潜在的问题呢?
我们已经使用了所有的诊断内存工具,这些工具也将与附加的设备一起运行(此应用程序使用外围设备,因此无法在模拟器中完全调试)。
发布于 2018-03-31 06:16:17
NSZombie只是一种毒害对象使用的空间而不是释放它们的机制,类似于消毒液记忆中毒。通过使用各种工具,如NSZombie或上面提到的ASAN,您的堆栈和堆分配将以不同的方式排列,从而导致在崩溃可能是最佳情况的情况下出现未定义的行为。
EXC_BAD_ACCESS意味着您试图访问无效地址,或试图读取或写入您没有此类权限的内存区域。您所遇到的不一致可能是堆栈或堆损坏的后果,比如有时覆盖只保存数据的变量,有时覆盖程序使用的指针。
数据布局对于发生什么非常重要,堆布局在非调试构建中通常是随机的,这为不一致的崩溃增加了更多的空间。此外,对程序源代码或生成设置的任何更改都可能/将不可避免地导致数据布局更改。
我建议:
-g编译器标志)并使用附加的调试器运行。当您遇到崩溃时,gdb或lldb (后者是Xcode工具的缺省值)将停止执行并让您做一些事情,然后使用bt获得堆栈跟踪,这可能会让您找出问题的深层原因。#define TRACE printf("%s %s:%d\n", __func__, __FILE__, __LINE__);和将它们分散到可能的问题点实际上是有帮助的。通常,我建议首先使用调试器,不使用NSZombie或任何东西,只需运行到崩溃点并获得堆栈跟踪、注册状态等。让这些示例跨越多个崩溃可以帮助您缩小问题范围。
https://stackoverflow.com/questions/49583339
复制相似问题