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

Ros*_*mes 24 iphone exc-bad-access lldb

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

以前,我刚刚gdb info malloc-history <xxx>开始调试,但是我找不到并行命令LLDB.

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

我只需要弄清楚崩溃的这块内存指向的位置.使用LLDB或使用仪器的最佳方法是什么?

Sam*_*Sam 44

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

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

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

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

最后一句话

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

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

我真的很困惑,retain因为它的代码没有一个(不是在它的线上的getter或setter).事实证明,removeObserver:forKeyPath:当某个对象被dealloc编辑时,我没有打电话.后来在执行中KVO发生了对线路上的设置器的影响,并且由于KVO试图通知已经释放的对象,因此该程序爆炸了.


Sam*_*Sam 37

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

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

现在,您应该在发生此异常之前立即获得完整的回溯.这应该允许您至少抛出抛出此异常的位置.


小智 14

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

image lookup --address 0xec509b
Run Code Online (Sandbox Code Playgroud)

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

  • @tristan不打印任何东西:( (17认同)

Fab*_*oto 10

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

(lldb) p *(MyClassToPrint*)memory_address
Run Code Online (Sandbox Code Playgroud)

例如

(lldb) p *(HomeViewController*)0x0a2bf700
Run Code Online (Sandbox Code Playgroud)