[__NSArrayM insertObject:atIndex:]: object cannot be nil - 如何确定错误位置?

7

我有一个涉及异步事件的大型项目,有时会出现错误[__NSArrayM insertObject:atIndex:]: object cannot be nil,但我不知道出现错误的位置。如何捕获这个错误?我在每个进行insertobject:atIndex操作的地方都添加了assert,但仍然没有找到问题所在。

以下是堆栈信息:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '***    -[__NSArrayM insertObject:atIndex:]: object cannot be nil'


*** First throw call stack:

(0x34c352a3 0x32f4597f 0x34b7f8d9 0xc48db 0xc3ced 0xc3b41 0x1178d9 0x148aed 0x103cfd    0x102fc9 0x101f95 0x35f25595 0x35f7a13b 0x35f7a081 0x35f79f65 0x35f79e89 0x35f795c9 0x35f794b1 0x35f67b93 0x35f67833 0xd820b 0x35fc8275 0x3604aea9 0x326efa6f 0x34c0a5df 0x34c0a291 0x34c08f01 0x34b7bebd 0x34b7bd49 0x350b82eb 0x35f5a301 0x62e45 0x62de0)

libc++abi.dylib: terminate called throwing an exception

当异常发生时,获取一个回溯信息会很有帮助。 - borrrden
4个回答

47

检查代码崩溃位置的好方法是:

1)在Xcode中转到断点标签页。

2)点击底部的“+”按钮。

3)添加异常断点。

a)在断点标签页中选择两个选项:

  i) on Throw 

  ii) on Catch 

并构建和运行。

4) 这些断点将准确地告诉您,您的应用程序在90%的时间内崩溃的位置。

希望这能在某种程度上对您有所帮助。:)


忘记了这些,偶然发现了这个答案,谢谢,帮了很大的忙。 - StuartM
这应该是标准的Xcode行为。感谢苹果。谢谢。Divya。 - Duck

3
有时如果你找不到异常的抛出位置,只需在项目中添加这些“符号断点”。然后运行:
objc_exception_throw malloc_error_break [NSException raise]
在Xcode中,进入“Product -> Debug -> Create Symbolic Breakpoint”菜单,将上述每个断点输入到“Symbol”中,然后按“Done”,或者你也可以通过转到底部左侧的“断点导航器(cmd + 6)”并单击“+”来创建。现在尝试运行,它会将你带到特定的代码行,即崩溃的位置。

这有助于追踪一个常规异常断点无法找到的异常。 - nevan king

0

你需要处理数组中的 null 值。 对我来说有效 就像这样:

if ( array ! = nil ) {
    NSLog(@"name is nil");
} else {
    // addobject to array 
}

-8

显然,您插入的对象不应该是nil。请检查一下!


1
OP想知道一种定位“发生在哪里”的技术,而不是“为什么”发生。 - borrrden
这不是一个有效的答案,不能帮助解决这个问题。 - Edwin O.

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