Xcode - 中断异常,但没有可用的符号

时间:2013-05-18 17:39:44

标签: xcode cocoa-touch debugging lldb

我需要帮助找出在LLDB中获取有用信息所必需的神奇咒语。

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

例外:

  

CoreData:错误:严重的应用程序错误。抓住了一个例外   在调用期间来自NSFetchedResultsController的委托   -controllerDidChangeContent :. *** - [__ NSArrayM objectAtIndex:]:索引2超出带有userInfo的空数组的边界(null)

因此,在我的断点到位后,我得到以下堆栈跟踪:

StackTrace

这看起来非常有帮助!对于可重复使用的标题视图,看起来UICollectionViewFlowLayout正在发生一些困难...现在我只需要......哦。废话。等待。什么?

如何检查使用越界索引调用的堆栈跟踪的第1帧中的数组?我可以在控制台中po <some memory address>进行检查吗?选择第11 - 1帧时,我无法在LLDB控制台中使用frame variable

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

  1. (第14帧)获取的结果控制器已选择托管对象上下文更改,并将其命名为委托
  2. (第13帧) FRC委托是FHMemberDirectory的一个实例,将消息-memberDirectoryDidChangeContent:completion:发送给视图控制器FHMemberDirectoryViewController,它是一个子类UICollectionViewController
  3. (第12帧)视图控制器在其UICollectionView实例上调用-performBatchUpdates:completion:
  4. (第10-1帧)私人Apple的东西碰巧尝试在屏幕上布局集合视图; 我想!
  5. ...如果我错过了一些明显的东西,请告诉我!这个问题是关于调试的,我希望另一组眼睛或更多的专业知识可以启发我。

    对于我未经训练的眼睛,这似乎是一个埋在Apple代码中的错误,但我仍然需要找到解决它的方法。我的问题的主旨是理解如何从不受我直接控制的代码中从LLDB控制台获取有用的信息。

1 个答案:

答案 0 :(得分:1)

从我的实验和研究中,答案是:

  

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

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

stack trace with methods swizzled in

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

(事实证明...usingData:的论点是一个私人的Apple课程。我能够更多地了解课程here,但没有什么超级有用的。在一天结束时我'我提交了一份radar并要求DTS的工作帮助。