25

我正在尝试在我的 iPhone 应用程序中调试 EXC_BAD_ACCESS。它在方法调用上崩溃,并且在方法的行上是EXC_BAD_ACCESS (code=1, address = xxx).

以前,我只是用来gdb info malloc-history <xxx>开始调试,但在LLDB.

我看到这个线程说要使用 Instruments,但是当我这样做时,我仍然会崩溃,但我无法弄清楚如何准确判断应用程序在 Instruments 中崩溃的位置。

我只需要弄清楚这块正在崩溃的内存指向的位置。使用LLDB或 Instruments 执行此操作的最佳方法是什么?

4

4 回答 4

44

如果您使用仪器进行调试,您可以看到 malloc 堆栈。

我遇到了和你一样的问题,同样想知道在使用 lldb 时如何获取 malloc 历史记录。可悲的是,我没有找到像malloc-historygdb 中那样的漂亮命令。老实说,我刚刚切换了我的调试器,但我发现这很烦人,因为我觉得我不应该这样做。

要使用仪器查找 malloc 历史记录:

  1. 分析您的项目
  2. 从乐器列表中选择僵尸 在此处输入图像描述
  3. 让你的应用触发问题
  4. 此时,您应该看到已经释放的地址,您可以对其进行探索。 在此处输入图像描述 此时查看 malloc 历史应该是一件简单的事情。我将具有特定于我正在做的工作的类/项目名称的部分涂黑,但我认为如何获取这些信息的本质和有用性是存在的。

最后一句话

我遇到的问题产生了如下消息:

*** -[someClass retain]:消息发送到已释放实例 0x48081fb0 someProject(84051,0xacd902c0) malloc:使用标准记录器将 malloc 堆栈记录到磁盘

我真的很困惑这retain是从哪里来的,因为它所破坏的代码没有一个(不在它所在行的 getter 或 setter 中)。事实证明,removeObserver:forKeyPath:当某个对象被dealloc'ed 时,我没有调用。后来在执行过程中,KVO 发生在一行的 setter 上,这导致程序崩溃,因为 KVO 试图通知一个已经释放的对象。

于 2012-03-26T20:56:54.443 回答
38

这个问题很容易通过信息丰富的回溯来解决。不幸的是,在最新版本的 iOS 和 Xcode 中,有时很难找到好的堆栈跟踪。幸运的是,您可以在 Xcode 中设置一个“异常断点”,以允许您在 EXC_BAD_ACCESS 异常之前检查此代码。

  1. 在 Xcode 4 中打开断点导航(这看起来像一个在右侧有一个点的矩形)
  2. 按左下角的“+”按钮并添加一个“异常断点”。确保为“所有”异常打破“On Throw”。

现在,您应该在此异常发生之前立即获得完整的回溯。这应该允许您至少将引发此异常的位置归零。

于 2012-03-27T14:11:40.520 回答
15

你可以在 lldb 中使用这样的命令:

image lookup --address 0xec509b

您可以在以下位置找到更多命令:LLDB TO GDB COMMAND MAP

于 2012-09-10T05:56:59.070 回答
10

也许为时已晚,但在 LLDB 上需要进一步的帮助:

(lldb) p *(MyClassToPrint*)memory_address

例如

(lldb) p *(HomeViewController*)0x0a2bf700
于 2014-01-08T18:52:51.503 回答