范围异常:调用堆栈未显示行号

9

我遇到了以下的越界错误:

*** 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个地址),以便我可以找到导致此错误的行?也许我的构建设置中有一些设置不正确,导致相关的堆栈无法检索? 如果有人能指点我正确的方向,我将非常感激。手动定位有问题的行相当繁琐。 谢谢!
3个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
17

打开调试器并在抛出异常时设置断点,这样您就可以准确地知道哪一行代码出了问题。

objc_exception_throw

或者,使用 [NSException raise];

请参考以下问题:如何在 objc-exception-throw 中添加断点


9
谢谢Antwan,这完美地解决了问题!对于任何试图在Xcode 4中进行此操作的人,以下是我使用的步骤:
  1. 在断点导航器的左下角(从右边数第二个选项卡)点击添加(“+”)按钮。
  2. 选择添加异常断点。
  3. 对于“异常”,选择“C ++”。
  4. 在“名称”旁边键入“objc_exception_rethrow”。
  5. 点击完成。
- llama591

2

您的项目中是否启用了全局断点?如果没有,请在项目导航器中将objc_exception_throw添加到断点部分,然后重新运行应用程序,您应该能够获取堆栈。此外,在崩溃发生时,观察并展开任何其他线程以查看它们的堆栈。我曾多次遇到这样的情况,即我正在搜索的堆栈位于后台线程中,尽管崩溃是由主线程报告的。希望对您有所帮助。


0

假设这是在XCode调试器中发生的,您可以确定回溯地址中引用的代码行。 在调试窗口中输入以下内容:

list *来自回溯的地址

例如,对于您的第一个条目,您将输入以下内容: list *0x2263052

对每个地址执行此操作。其中之一应该指向您的程序代码, 并列出失败行号以及失败行上下的代码。

-Steve


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,