【问题标题】:NSRangeException: Call Stack Not Showing Line NumberNSRangeException:调用堆栈不显示行号
【发布时间】:2012-01-04 14:18:24
【问题描述】:

我收到以下索引超出范围错误:

*** 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 个地址的那个)中看到“第一次抛出调用堆栈”的线程,所以我可以找到导致此错误的行?也许我在构建设置中设置了不正确的内容,导致相关堆栈无法检索?

如果有人能指出我正确的方向,我将不胜感激。试图手动定位有问题的线路是相当乏味的。

谢谢!

【问题讨论】:

    标签: ios exception stack-trace nsrange


    【解决方案1】:

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

    从回溯中列出 *地址

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

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

    -史蒂夫

    【讨论】:

      【解决方案2】:

      打开调试器并在抛出异常时设置断点,这样您就可以确切地知道哪一行代码是一个混蛋。

      objc_exception_throw

      或者,[NSException raise];

      看看下面的问题:Add breakpoint to objc-exception-throw

      【讨论】:

      • 感谢 Antwan,这非常有效!对于任何尝试在 Xcode 4 中执行此操作的人,以下是我使用的步骤: 1. 在断点导航器的左下角(右侧的第二个选项卡)单击添加(“+”)按钮。 2. 选择添加异常断点。 3.对于“异常”选择“C++” 4.在“命名”旁边输入“objc_exception_rethrow” 5.点击完成。
      【解决方案3】:

      您是否在项目中启用了全局断点? 如果不将 objc_exception_throw 添加到项目导航器的断点部分,然后重新运行应用程序,您应该会得到堆栈。此外,当您崩溃发生时,请查看并展开任何其他线程以查看它们的堆栈。有几次我正在搜索的堆栈位于后台线程中,尽管主线程正在报告崩溃。 HTH。

      【讨论】:

        猜你喜欢
        • 2014-11-13
        • 1970-01-01
        • 2021-12-06
        • 2011-01-16
        • 2023-03-09
        • 1970-01-01
        • 1970-01-01
        • 2016-12-24
        • 1970-01-01
        相关资源
        最近更新 更多