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”的线程,所以我可以find导致这个错误的行? 也许我在我的生成设置导致相关的堆栈不可检索的东西设置不正确?

如果有人能指出我在这个正确的方向,我会非常感激。 试图手动find违规行是非常繁琐的。

谢谢!

打开debugging器,并在抛出exception时设置一个断点,这样你就知道哪一行代码是一个混蛋。

objc_exception_throw

或者,[NSException raise];

看看下面的问题: 添加断点到objc-exception-throw

您是否在您的项目中启用全局断点? 如果不是将objc_exception_throw添加到项目导航器中的断点部分,然后重新运行该应用程序,则应该获取堆栈。 另外,当你发生崩溃时,观察和扩展任何额外的线程以查看它们的堆栈。 它发生在我几次,我search的堆栈是在后台线程,虽然崩溃是由主线程报告。 HTH。

假设在XCodedebugging器中发生这种情况,您可以确定回溯地址中引用的代码行。 在debugging窗口中,input以下内容:

从回溯列表*地址

例如,对于您的第一个条目,您可以input以下内容:列表* 0x2263052

为每个地址做这个。 其中一个应该指向你的程序代码,并列出失败行上下的失败行号和代码。

史蒂夫

Interesting Posts