4

我需要帮助找出在 LLDB 中获取可用信息所需的魔法咒语。

我正在尝试调试一些奇怪的行为,我可以可靠地重现该问题,但我还不了解根本原因。我注意到有一个异常被抛出,所以我在 Xcode 中添加了一个异常断点。

例外:

CoreData:错误:严重的应用程序错误。在调用 -controllerDidChangeContent: 期间,从 NSFetchedResultsController 的委托中捕获了一个异常。*** -[__NSArrayM objectAtIndex:]:索引 2 超出了带有 userInfo 的空数组的界限(null)

所以,有了我的断点,我得到了以下堆栈跟踪:

堆栈跟踪

这看起来超级有用!对于可重用的标题视图,UICollectionViewFlowLayout 看起来有些古怪……现在我只需要……哦。废话。等待。什么?

如何检查堆栈跟踪的第 1 帧中使用超出范围的索引调用的数组?我可以po <some memory address>在控制台中检查它吗?I cannot use frame variablein the LLDB console when Frames 11 - 1 are selected ( from here ).

我阅读此堆栈跟踪的方式是:

  1. (第 14 帧)获取的结果控制器已获取托管对象上下文更改,并将其称为委托
  2. (第 13 帧) FRC 委托,一个实例FHMemberDirectory,将消息发送-memberDirectoryDidChangeContent:completion:到视图控制器FHMemberDirectoryViewController,它是一个子类UICollectionViewController
  3. (第 12 帧)视图控制器调用-performBatchUpdates:completion:它的 UICollectionView 实例
  4. (Frames 10 - 1) Private Apple 的东西碰巧尝试在屏幕上布局集合视图;我认为!

...如果我错过了一些明显的东西,请告诉我!这个问题是关于调试的,我希望另一双眼睛或更多的专业知识可以启发我。

在我未经训练的眼中,这似乎是隐藏在 Apple 代码中的一个错误,但我仍然需要想办法解决它。我的问题的要点是了解如何在不受我直接控制的代码中从 LLDB 控制台获取有用信息。

4

1 回答 1

1

根据我的实验和研究,答案是:

仅使用 LLDB,您无法获得有用的符号或内存地址来检查。

但是,您可以使用 Objective-C 运行时来调整方法实现并跳转到深度堆栈跟踪,从而为您提供参数和返回值的句柄。

带有混入方法的堆栈跟踪

现在我可以访问在第 3 帧和第 5 帧传入的参数了!

(事实证明 的论点...usingData:是一个私人 Apple 课程。我能够在这里挖掘更多关于该课程的信息,但没有什么超级有用的。在一天结束时,我已经提交了一份雷达并寻求解决问题的帮助来自 DTS)。

于 2013-05-28T15:07:25.463 回答