这是一个关于调试建议的一般性问题,基于具体案例。
以下是我在Xcode控制台中收到的消息:
2014-07-10 10:54:34.831 MyApp[1975:60b] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 5 beyond bounds [0 .. 4]'
*** First throw call stack:
(0x2ea83f83 0x391d0ccf 0x2e9ba7cb 0xd18ed 0xcda77 0x10818f 0xcc24b 0x107c87 0x312bb6df 0x313cf9eb 0x312bb6df 0x312ace89 0x312ac64d 0x312ac4bf 0x312abfe5 0x312a9827 0x3131333d 0x3130ffad 0x3130a56b 0x312a66e9 0x312a5851 0x31309ca9 0x338dbaed 0x338db6d7 0x2ea4ea67 0x2ea4ea03 0x2ea4d1d7 0x2e9b7ebf 0x2e9b7ca3 0x31308ed1 0x3130414d 0x108229 0x396ddab7)
libc++abi.dylib: terminating with uncaught exception of type NSException
我不得不说:
'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 5 beyond bounds [0 .. 4]'
这给了我一个遇到的问题的暗示,对我来说似乎没用。
然后我尝试获取后退跟踪,运行bt命令。我明白了:
(lldb) bt
* thread #1: tid = 0x3db71, 0x397931f0 libsystem_kernel.dylib`__pthread_kill + 8, queue = 'com.apple.main-thread', stop reason = signal SIGABRT
frame #0: 0x397931f0 libsystem_kernel.dylib`__pthread_kill + 8
frame #1: 0x397fd796 libsystem_pthread.dylib`pthread_kill + 58
frame #2: 0x39743fdc libsystem_c.dylib`abort + 76
frame #3: 0x38a72cd6 libc++abi.dylib`abort_message + 74
frame #4: 0x38a8b6e4 libc++abi.dylib`default_terminate_handler() + 252
frame #5: 0x391d0f64 libobjc.A.dylib`_objc_terminate() + 192
frame #6: 0x38a891c6 libc++abi.dylib`std::__terminate(void (*)()) + 78
frame #7: 0x38a88d2c libc++abi.dylib`__cxa_rethrow + 100
frame #8: 0x391d0e16 libobjc.A.dylib`objc_exception_rethrow + 42
frame #9: 0x2e9b7f34 CoreFoundation`CFRunLoopRunSpecific + 640
frame #10: 0x2e9b7ca2 CoreFoundation`CFRunLoopRunInMode + 106
frame #11: 0x31308ed0 UIKit`-[UIApplication _run] + 760
frame #12: 0x3130414c UIKit`UIApplicationMain + 1136
* frame #13: 0x00108228 MyApp `main(argc=1, argv=0x27d59d04) + 116 at main.m:16
(lldb)
我还必须承认bt命令的结果并没有帮助我,在我的代码中找到可能出错的地方。
我希望我在这里过于消极,并且错过了正确看待这些信息的重点。 有人能告诉我如何进入这种情况吗? 我应该在调试器控制台中运行不同的命令来获得有用的东西吗?
答案 0 :(得分:2)
诊断此类错误的最简单策略是从Xcode调试器启动应用程序。确保设置“所有异常”断点:
此时你应该有一个断点,当检测到任何异常时它将停止程序。将程序运行到故障点,应该在第一次检测到数组边界错误的行上停止,而不是在最终的全局异常处理程序中停止。
答案 1 :(得分:0)
我们可以使用Profiling工具启用Zombie。如果应用程序崩溃,它将显示大多数情况下崩溃的确切位置。