确定。所以我在一个复杂的Objective-C iOS程序上遇到了这个非常奇怪的SIGABRT
错误,经过一天的跟踪后我找到了罪魁祸首。
假设我们有以下代码:
NSArray *a = [NSArray arrayWithObjects:@"a", @"b", @"c", nil];
NSLog(@"tada: %@", [a objectAtIndex:-1]);
为什么这会终止程序Program received signal: SIGABRT
并且调试器甚至没有指向我的代码(而是指向某些程序集部分)而不是更好的'索引越界'和'嘿,这行这里的代码错了'错误?
我以为我弄乱了项目配置,所以我在一个全新的项目上重现了这个:同样的结果。
有没有办法让XCode更好用,并以更人性化的方式表明这种错误?
答案 0 :(得分:2)
如果index超出了数组的末尾(也就是说,如果index更大 NSRangeException是一个NSRangeException,它大于或等于count返回的值 升高
当没有定义异常处理程序时,默认操作是......嗯......你可以看到默认行为是什么。
你可以使用@ try / @ catch来捕获异常,但那不是真正的Objective-C-ish。你知道数组中有多少个元素;你没有必要访问不存在的元素。
这样的异常通常有堆栈跟踪,因此您可以返回导致错误的代码行。 (如果LLDB和GDB工作不正常,可能需要在LLDB和GDB之间切换.LLDB更快,更小但不完全可靠。(
答案 1 :(得分:2)
如果您查看Xcode中的控制台日志,您应该看到“范围索引”的内容。 SIGABRT是一个被解雇的断言的结果。有时你必须在崩溃后点击“继续”才能打印消息。
调试器会告诉您实际发生崩溃的位置。它不知道最初的原因是什么。如果调试器让您查看汇编程序,只需向上移动堆栈直到找到代码。