2011-11-23 94 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