2013-05-18 26 views
4

我需要幫助來找出在LLDB中獲取可用信息所需的魔法咒語。Xcode - 打破例外,但沒有可用的符號

我有一些奇怪的行爲,我試圖調試,我可以可靠地重現問題,但我還不明白的根本原因。我注意到有一個異常被拋出,所以我給Xcode添加了一個異常斷點。

例外:

CoreData: error: Serious application error. An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:. *** -[__NSArrayM objectAtIndex:]: index 2 beyond bounds for empty array with userInfo (null)

所以,我在地方斷點我得到以下堆棧跟蹤:

StackTrace

這看起來超有幫助!它看起來有一些funciness用於UICollectionViewFlowLayout可重用的標題視圖...現在我只需要...哦。廢話。等待。什麼?

如何檢查堆棧跟蹤的第1幀中的數組,該數組被調用的出界索引?我可以在控制檯上po <some memory address>進行檢查嗎?當選擇第11 - 1幀時(from here),我不能在LLDB控制檯中使用frame variable

我讀這個堆棧跟蹤的方法是:

  1. (幀14)獲取的成果控制器已經拿起了管理對象上下文的變化,並調用它的委託
  2. (13幀) FRC代表(FHMemberDirectory的一個實例)將消息-memberDirectoryDidChangeContent:completion:發送給視圖控制器FHMemberDirectoryViewController,該視圖控制器是UICollectionViewController的子類
  3. (幀12)視圖控制器調用-performBatchUpdates:completion:它是UICollectionView例如
  4. (幀10 - 1)私人蘋果的東西恰好嘗試和佈局在屏幕上集合視圖; 我想!

...請讓我知道,如果我錯過了明顯的明顯的東西!這個問題是關於調試的,我希望另一組眼睛或更多的專業知識能夠啓發我。

對於我未經訓練的眼睛來說,這看起來像是埋在蘋果代碼中的一個bug,但我仍然需要找出解決方法。這個問題的關鍵在於理解如何從不受我直接控制的代碼中從LLDB控制檯獲取有用的信息。

+1

您是否檢查了傳遞給'-controllerDidChangeContent:'的數組以檢查異常原因文本正在討論的內容? – trojanfoe

+0

'-controllerDidChangeContent:'來​​自'NSFetchedResultsControllerDelegate'協議,參數是進行回調的FRC實例。所以,沒有一個數組被傳遞(除非我可怕地誤解了你的問題;如果是這樣,那麼我非常抱歉!) – edelaney05

+0

如果你想檢查一個幀的變量,去那個幀。您位於圖像中的第12幀上,單擊第1幀,打開調試區域中的變量視圖面板,然後查看是否找到可變數組。但是在這種情況下,正如edelaney05所說的那樣,如果你檢查你的提取控制器會更好。 – Jano

回答

1

從我的實驗和研究,答案是:

With LLDB alone, you cannot get useful symbols or memory addresses to inspect.

但是,您可以使用Objective-C運行時來調酒方法實現跳進了深刻的堆棧跟蹤,所以給你一個句柄參數和返回值。

stack trace with methods swizzled in

現在我有機會在幀3和5傳入的參數!

(原來的...usingData:參數是一個私人的蘋果類。我能夠挖掘更多關於類here,但沒有超級有用。在一天結束時,我已經提交了radar和要求幫助解決DTS的問題)。