gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:37:36 25 4
gpt4 key购买 nike

我们有一些非常随机的错误发生并抛出 EXC_BAD_ACCESS , 或 malloc_error_break , 或 abor吨。异常没有一致性,启用NSZombies不会导致任何僵尸被触发。

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

一个错误的指针可能会覆盖一 block 内存,然后它会被取消引用并使应用程序崩溃,这是有道理的。但是还有什么其他方法可以隔离根本问题?

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

最佳答案

NSZombie只是一种毒化对象使用的空间而不是释放它们的机制,类似于 Address Sanitizer's Memory Poisoning .通过使用各种工具,例如 NSZombie或者上面提到的 ASAN,您的堆栈和堆分配将采用不同的布局,在崩溃可能是最佳情况的情况下导致未定义的行为。
EXC_BAD_ACCESS表示您尝试访问无效地址或尝试读取或写入您没有此类权限的内存区域。您遇到的不一致可能是令人讨厌的堆栈或堆损坏的后果,例如有时会覆盖仅保存数据的变量,有时会覆盖程序正在使用的指针。

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

我会推荐:

  • 在 Debug模式下构建(-g 编译器标志)并在附加调试器的情况下运行。当您遇到崩溃时,gdblldb (后者是 Xcode 工具的默认设置)将停止执行并让您执行操作,从那里使用 bt 获取堆栈跟踪这可能会让你找出问题的更深层原因。
  • 使用 ASAN,this page explains about its usage within Xcode tooling .它通常是处理内存问题的绝佳工具。请注意,将它与在不支持它的情况下构建的共享库一起使用可能会导致异常,但它通常会告诉您这些异常,并且通常会尽可能多地握住您的手。
  • “printf 调试”可以提供帮助,例如 #define TRACE printf("%s %s:%d\n", __func__, __FILE__, __LINE__);并将这些分散在可能的问题点上实际上会有所帮助。

  • 一般来说,我建议先使用调试器,不要使用 NSZombie。或者任何事情,只需运行一堆运行到崩溃点并获取堆栈跟踪、注册状态等。让这些样本跨越多个崩溃可以帮助您缩小问题范围。

    关于ios - EXC_BAD_ACCESS 但 NSZombies 从未触发,如何调试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49583339/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com