首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EXC_BAD_ACCESS但NSZombies从未触发,如何调试?

EXC_BAD_ACCESS但NSZombies从未触发,如何调试?
EN

Stack Overflow用户
提问于 2018-03-31 01:26:59
回答 1查看 1.3K关注 0票数 2

我们有一些非常随机的错误正在发生,并抛出EXC_BAD_ACCESSmalloc_error_breakabort。异常之间没有一致性,而且启用NSZombies不会导致任何僵尸被触发。

事实上,在启用僵尸的情况下运行将不会发生崩溃。我相信这个代码库中有一个微妙的记忆错误,在花了很多小时清理那些可能是小问题之后,我们仍然没有解决这个问题。

这是合理的,一个糟糕的指针可能覆盖一段内存,然后被取消引用和崩溃的应用程序。但是,还有什么其他方法来孤立潜在的问题呢?

我们已经使用了所有的诊断内存工具,这些工具也将与附加的设备一起运行(此应用程序使用外围设备,因此无法在模拟器中完全调试)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-31 06:16:17

NSZombie只是一种毒害对象使用的空间而不是释放它们的机制,类似于消毒液记忆中毒。通过使用各种工具,如NSZombie或上面提到的ASAN,您的堆栈和堆分配将以不同的方式排列,从而导致在崩溃可能是最佳情况的情况下出现未定义的行为。

EXC_BAD_ACCESS意味着您试图访问无效地址,或试图读取或写入您没有此类权限的内存区域。您所遇到的不一致可能是堆栈或堆损坏的后果,比如有时覆盖只保存数据的变量,有时覆盖程序使用的指针。

数据布局对于发生什么非常重要,堆布局在非调试构建中通常是随机的,这为不一致的崩溃增加了更多的空间。此外,对程序源代码或生成设置的任何更改都可能/将不可避免地导致数据布局更改。

我建议:

  1. 在调试模式下构建(-g编译器标志)并使用附加的调试器运行。当您遇到崩溃时,gdblldb (后者是Xcode工具的缺省值)将停止执行并让您做一些事情,然后使用bt获得堆栈跟踪,这可能会让您找出问题的深层原因。
  2. 使用ASAN,本页解释其在Xcode工具中的使用情况。.它通常是处理内存问题的极好工具。请注意,与没有支持的共享库一起使用它可能会导致异常,但它通常会告诉您它们的情况,并且通常会尽可能多地握住您的手。
  3. "printf调试“可能会有所帮助,比如#define TRACE printf("%s %s:%d\n", __func__, __FILE__, __LINE__);和将它们分散到可能的问题点实际上是有帮助的。

通常,我建议首先使用调试器,不使用NSZombie或任何东西,只需运行到崩溃点并获得堆栈跟踪、注册状态等。让这些示例跨越多个崩溃可以帮助您缩小问题范围。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49583339

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档