我正在尝试在我的iPhone应用中调试EXC_BAD_ACCESS。它在方法调用上崩溃,并且方法的行是EXC_BAD_ACCESS (code=1, address = xxx)
。
之前,我会使用gdb info malloc-history <xxx>
开始调试,但我在LLDB
中找不到并行命令时遇到问题。
我看到this线程说要使用Instruments,但是当我这样做时,我仍然会遇到崩溃,但我无法弄清楚如何确定应用程序在仪器中的确切位置。
我只需要弄清楚崩溃的这块内存指向的位置。使用LLDB
或工具?
答案 0 :(得分:44)
如果使用乐器进行调试,则可以看到malloc堆栈。
我遇到了和你一样的问题,同样想知道如何在使用lldb时获取malloc历史记录。可悲的是,我没有找到像gdb中找到的malloc-history
这样漂亮的命令。说实话,我只是调试了调试器,但我发现这很烦人,因为我觉得我不应该这样做。
我遇到的问题产生了如下信息:
*** - [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异常之前检查此代码。
现在,您应该在发生此异常之前立即获得完整的回溯。这应该允许你至少抛出抛出这个异常的地方。
答案 2 :(得分:14)
答案 3 :(得分:10)
在LLDB上可能为时已晚,但需要进一步的帮助:
(lldb) p *(MyClassToPrint*)memory_address
E.g。
(lldb) p *(HomeViewController*)0x0a2bf700