我得到以下索引超出界限错误:
*** 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”的线程,所以我可以找到导致此错误的行?也许我的构建设置中有一些设置不正确导致相关堆栈无法检索?
如果有人能指出我正确的方向,我会非常感激。试图手动定位违规行非常繁琐。
谢谢!
答案 0 :(得分:17)
打开调试器并在抛出异常时设置断点,这样你就可以确切地知道哪一行代码是一个混蛋。
objc_exception_throw
或者,[NSException raise];
答案 1 :(得分:2)
您是否在项目中启用了全局断点? 如果没有将objc_exception_throw添加到项目导航器中的断点部分然后重新运行应用程序,则应该获得堆栈。在adition中,当您崩溃时,请观察并展开任何其他线程以查看其堆栈。我发生了好几次,我正在搜索的堆栈是在后台线程中,虽然崩溃是由主线程报告的。 HTH。
答案 2 :(得分:0)
假设在XCode调试器中发生这种情况,您可以确定 回溯地址中引用的代码行。 在调试窗口中,输入以下内容:
列出追溯的地址
例如,对于您的第一个条目,您将输入以下内容: 列表* 0x2263052
为每个地址执行此操作。其中一个应指向您的程序代码 并列出失败行上方和下方的失败行号和代码。
-Steve