2011-11-23 40 views
9

我收到以下索引出界失誤:NSRangeException:調用堆棧不顯示行號

*** Terminating app due to uncaught exception 'NSRangeException', reason: 
'*** -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array' 
*** First throw call stack: 
(0x2263052 0x24c7d0a 0x224fdb8 0x2f4a7 0x2264ec9 0x81e299 0x81e306 0x75aa30 
0x75ac56 0x741384 0x734aa9 0x39a9fa9 0x22371c5 0x219c022 0x219a90a 0x2199db4 
0x2199ccb 0x39a8879 0x39a893e 0x732a9b 0x1e5b 0x1dc5 0x1) 

我知道到底是什麼錯誤意味着,但我覺得這些錯誤非常困難的,因爲固定出於某種原因調用堆棧不會告訴我數組被調用的代碼行。這裏是從線程1調用堆棧:

#0 0x9706d9c6 in __pthread_kill() 
#1 0x93e2cf78 in pthread_kill() 
#2 0x93e1dbdd in abort() 
#3 0x02859e78 in dyld_stub__Unwind_DeleteException() 
#4 0x0285789e in default_terminate()() 
#5 0x024c7f4b in _objc_terminate() 
#6 0x028578de in safe_handler_caller(void (*)())() 
#7 0x02857946 in __cxa_bad_typeid() 
#8 0x02858b3e in __cxa_current_exception_type() 
#9 0x024c7e49 in objc_exception_rethrow() 
#10 0x02199e10 in CFRunLoopRunSpecific() 
#11 0x02199ccb in CFRunLoopRunInMode() 
#12 0x039a8879 in GSEventRunModal() 
#13 0x039a893e in GSEventRun() 
#14 0x00732a9b in UIApplicationMain() 
#15 0x00001e5b in main 

正如你可以看到這個調用堆棧是不是非常有幫助,因爲它不顯示從我的代碼的任何方法。另外,錯誤中顯示的調用堆棧有22個內存地址,而線程1的堆棧只有15個,地址根本不匹配。沒有其他線程似乎包含任何有用的信息。

如何從錯誤(具有22個地址的那個)看到「First throw call stack」的線程,以便找到導致此錯誤的行?也許我有一些設置不正確,導致相關堆棧無法檢索?

如果有人能指出我對這個方向正確,我會非常感激。試圖手動找到違規行是非常繁瑣的。

謝謝!

回答

17

打開調試器,並在拋出異常時設置一個斷點,這樣你就知道哪一行代碼是一個混蛋。

objc_exception_throw

或者,[NSException提高];

看一看以下問題:Add breakpoint to objc-exception-throw

+9

謝謝Antwan,這個作品完美! 對於任何想要在Xcode 4中執行此操作的人,以下是我使用的步驟: 1.在斷點導航器的左下角(右側第二個選項卡)中,單擊添加(「+」)按鈕。 2.選擇添加異常斷點。 3。對於「例外」,選擇「C++」 4.在「命名」旁邊鍵入「objc_exception_rethrow」 5.單擊完成。 – llama591

2

你能夠在你的項目的全球斷點? 如果不將objc_exception_throw添加到項目導航器中的斷點部分,然後重新運行該應用程序,則應該獲取堆棧。此外,當你發生崩潰時,觀察並擴展任何額外的線程以查看它們的堆棧。它發生在我身上幾次,我搜索的堆棧是在後臺線程中,儘管主線程正在報告崩潰。 HTH。

0

假設這發生在XCode調試器中,您可以確定 追溯地址中引用的代碼行。從回溯

列表*地址

例如,對於你的第一個條目,請輸入以下內容:: 在調試窗口,輸入以下 列表* 0x2263052

這樣做對每個地址。其中一位應指向您的程序代碼 ,並列出失敗行上方和下方的失敗行號和代碼。

-Steve