【发布时间】:2013-05-13 16:35:14
【问题描述】:
我需要帮助找出在 LLDB 中获取可用信息所需的魔法咒语。
我正在尝试调试一些奇怪的行为,我可以可靠地重现该问题,但我还不了解根本原因。我注意到有一个异常被抛出,所以我在 Xcode 中添加了一个异常断点。
例外:
CoreData:错误:严重的应用程序错误。捕获到异常 在调用期间从 NSFetchedResultsController 的委托 -controllerDidChangeContent:。 *** -[__NSArrayM objectAtIndex:]: 索引 2 超出了带有 userInfo (null) 的空数组的范围
所以,有了我的断点,我得到以下堆栈跟踪:
这看起来超级有用!对于可重用的标题视图,UICollectionViewFlowLayout 看起来有些古怪……现在我只需要……哦。废话。等待。什么?
如何检查堆栈跟踪的第 1 帧中使用超出范围的索引调用的数组?我可以在控制台中po <some memory address> 进行检查吗?选择框架11 - 1时,我在LLDB控制台中无法在LLDB控制台中使用@ 987654324(from here)。
我阅读此堆栈跟踪的方式是:
- (第 14 帧) 获取结果控制器已获取托管对象上下文更改,并将其称为委托
-
(第 13 帧) FRC 委托,
FHMemberDirectory的一个实例,将消息-memberDirectoryDidChangeContent:completion:发送到视图控制器FHMemberDirectoryViewController,它是UICollectionViewController的子类 -
(第 12 帧) 视图控制器在其 UICollectionView 实例上调用
-performBatchUpdates:completion: - (Frames 10 - 1) 私人 Apple 的东西碰巧尝试在屏幕上布局集合视图; 我想!
...如果我遗漏了一些明显的东西,请告诉我!这个问题是关于调试的,我希望另一双眼睛或更多的专业知识可以启发我。
在未经训练的人看来,这似乎是隐藏在 Apple 代码中的一个错误,但我仍然需要想办法解决它。我的问题的要点是了解如何在不受我直接控制的代码中从 LLDB 控制台获取有用信息。
【问题讨论】:
-
您是否检查了传递给
-controllerDidChangeContent:的数组以检查异常原因文本在说什么? -
-controllerDidChangeContent:来自NSFetchedResultsControllerDelegate协议,参数是进行回调的 FRC 实例。所以,没有一个数组被传递(除非我严重误解了你的问题;如果是这样,那么我很抱歉!) -
如果要检查一帧的变量,请转到该帧。你在图像中的第 12 帧,点击第 1 帧,在调试区域打开变量视图面板,看看是否找到了可变数组。但是在这种情况下,正如 edelaney05 所说,最好检查您获取的控制器。
-
@Jano 这就是问题所在!当我查看从 11 到 1 的任何帧时,我得到的只是汇编程序。
-
frame select 9应该更改框架(或在 UI 中使用鼠标,如@Jano 所述。您将获得汇编程序,因为您没有源代码。这是意料之中的。我想可能是frame variable由于相同的原因不起作用(您没有包含所有变量名称的源)但不确定。一旦您在正确的框架中,那么您应该能够执行po 0x123456来引用其中的对象框架。我会在问题发生之前在代码的最后一个位置设置一个断点,并检查布局视图使用的数据,因为在某些情况下它看起来很时髦。(已发布?)
标签: xcode cocoa-touch debugging lldb