获取有关LLDB中内存不良地址的信息

时间:2012-03-24 15:55:33

标签: iphone exc-bad-access lldb

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

之前,我会使用gdb info malloc-history <xxx>开始调试,但我在LLDB中找不到并行命令时遇到问题。

我看到this线程说要使用Instruments,但是当我这样做时,我仍然会遇到崩溃,但我无法弄清楚如何确定应用程序在仪器中的确切位置。

我只需要弄清楚崩溃的这块内存指向的位置。使用LLDB或工具?

执行此操作的最佳方法是什么?

4 个答案:

答案 0 :(得分:44)

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

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

使用工具查找malloc历史记录:

  1. 描述您的项目
  2. 从乐器列表中选择Zombies enter image description here
  3. 让您的应用触发问题
  4. 此时,您应该看到已经解除分配的地址,您可以进行探索。 enter image description here 在这一点上查看malloc历史应该是一件简单的事情。我把那些具有类别/项目名称的部分涂黑了我正在做的工作,但我认为如何获取这些信息的本质和实用性已经存在。
  5. 最后一句话

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

      

    *** - [someClass retain]:消息发送到解除分配的实例0x48081fb0 someProject(84051,0xacd902c0)malloc:录制malloc   使用标准记录器堆叠到磁盘

    我真的很困惑这个retain来自哪里,因为它打破的代码没有一个(不是在它的线上的getter或setter)。事实证明,当某个对象removeObserver:forKeyPath:被编辑时,我没有调用dealloc。后来在执行中KVO发生了对一行上的一个setter并且由于KVO试图通知已经发布的对象而炸毁了该程序。

答案 1 :(得分:37)

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

  1. 在Xcode 4中打开断点导航(这看起来像一个右侧有一个点的矩形)
  2. 按左下角的“+”按钮添加“异常断点”。确保为“所有”例外打破“On Throw”。
  3. 现在,您应该在发生此异常之前立即获得完整的回溯。这应该允许你至少抛出抛出这个异常的地方。

答案 2 :(得分:14)

你可以在lldb:

中使用这样的命令
image lookup --address 0xec509b

您可以在LLDB TO GDB COMMAND MAP

找到更多命令

答案 3 :(得分:10)

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

(lldb) p *(MyClassToPrint*)memory_address

E.g。

(lldb) p *(HomeViewController*)0x0a2bf700