Heisenbug - > NSInvalidArgumentException:容量太荒谬了

时间:2012-02-14 10:35:49

标签: iphone objective-c ios-simulator

我得到了一个非常令人困惑的崩溃,我目前的智慧正在消失......

首先是崩溃日志:

日期/时间:2012-02-14 10:55:09.771 +0100
操作系统版本:Mac OS X 10.7.3(11D50b)
报告版本:9

崩溃的线程:0

异常类型:EXC_CRASH(SIGABRT)
例外代码:0x0000000000000000,0x0000000000000000

特定应用信息:
iPhone模拟器272,iPhone OS 5.0(iPhone / 9A334)

abort()叫做
*由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'* - [__ NSPlaceholderDictionary initWithCapacity:]:capacity(2147483648)太荒谬了' * 第一次抛出调用堆栈: (0x25ca052 0x21d8d0a 0x24f21b7 0x252597b 0x688e2 0x6a3b5 0x41b2f 0x1f29d 0x1f87e 0xba335c 0xbabd0d 0xcc8a1c 0xcc93a9 0xf3de39 0xf3d143 0xf3e3cf 0xf40a31 0xf4098c 0xf393e7 0xca1812 0xca1ba2 0xc88384 0xc7baa9 0x2333fa9 0x259e1c5 0x2503022 0x250190a 0x2500db4 0x2500ccb 0x2332879 0x233293e 0xc79a9b 0x23ad 0x2325)

线程0崩溃:
0 libsystem_kernel.dylib 0x983379c6 __pthread_kill + 10
1 libsystem_c.dylib 0x939e7f78 pthread_kill + 106
2 libsystem_c.dylib 0x939d8bdd abort + 167
3 libc ++ abi.dylib 0x01fa5e78 abort_message + 50
4 libc ++ abi.dylib 0x01fa389e _ZL17default_terminatev + 34
5 libobjc.A.dylib 0x021d8f4b _objc_terminate + 94
6 libc ++ abi.dylib 0x01fa38de _ZL19safe_handler_callerPFvvE + 13
7 libc ++ abi.dylib 0x01fa3946 std :: terminate()+ 23
8 libc ++ abi.dylib 0x01fa4b3e __cxa_rethrow + 83
9 libobjc.A.dylib 0x021d8e49 objc_exception_rethrow + 47
10 CoreFoundation 0x02500e10 CFRunLoopRunSpecific + 304
11 CoreFoundation 0x02500ccb CFRunLoopRunInMode + 123
12 GraphicsServices 0x02332879 GSEventRunModal + 207
13 GraphicsServices 0x0233293e GSEventRun + 114
14 UIKit 0x00c79a9b UIApplicationMain + 1175
15 LVM 0x000023ad main + 125(main.m:14)
16 LVM 0x00002325 start + 53

我使用Xcode 4.2在Lion 10.7.3下工作。 分析仪没有指出错误,项目在昨天之前一直运行稳定。 错误本身不是在安装过程中引起的,而是由重新加载必要数据以显示的手势引起的。

乍一看似乎很清楚:我已经分配了一个容量无效的NSDictionary实例(2147483648实际上是签名的-2147483648,所以它可能是溢出工件)。

  • 我的系统具有在崩溃发生时停止的所有必要设置:NSZombieEnabled, obj_exc_throw等嗯,它会停止,但是在main.m的主循环中。所以没有信息可以看。
  • 所以我查看了所有的NSXXDictionary实例,并保证它们都是常量 容量初始化程序或使用其[...字典]分配。第一个惊喜:它仍然存在 崩溃。
  • 好的,可能是Xcode有时候没有正确地重新编译更改? Xcode关闭了, 清理,重建,抛出构建目录(构建,缓存,dstroot),重启,任何事情。 还是一样的崩溃。
  • 如你所见,它在运行循环中崩溃,所以我没有得到关于它的更多信息 地点。好的,启动Profile->系统跟踪,看看我是否能找到....系统跟踪崩溃! 8-0
  • 嗯......我的同事对当前的变化没有任何问题,所以我试图找到SVN 问题出在哪里。在这里,我再次陷入困境:错误消失了 出现这样我无法确定原因。

那么......有没有其他数据结构(NSArray等)或可能导致这种奇怪行为的函数?或者你有什么好的调试技巧来确定它吗? 感谢您提供任何有用的帮助。

编辑:发现错误,这是我自己:(。见下面的答案

2 个答案:

答案 0 :(得分:2)

又是自己的愚蠢规则.... 如果您遇到同样的错误,请搜索所有可能的构造函数。事实上我忽略了一个[NSXXDictionary dictionaryWithCapacity]构造函数,实际上容量是非法的值。它被深深嵌套在运行时循环中。

我只搜索了initWithCapacity,因为我通常只使用没有容量的字典构造函数,而我的无意识假设自然是错误的。

答案 1 :(得分:1)

当我将断点设置为obj_exc_throw并且断点被点击时,点击调试器的继续按钮让应用程序崩溃会有所帮助。然后你应该能够看到所需的堆栈跟踪。