每当我的应用程序崩溃时,Xcode都会将main()函数中的UIApicationMain()调用强调为导致崩溃的行。在某些情况下,以前是正常的(例如分段错误),但我试图处理的崩溃是一个简单的SIGABRT,其中记录了控制台中的详细信息:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary setObject:forKey:]: attempt to insert nil value (key: Date)'
Xcode用于显示旧版SDK的正确行,但自从我升级到Xocde 4.2后发生了变化。 很明显,Xcode确切地知道导致崩溃的原因(或者可能知道),但它仍然没有显示实际的行。是否有任何修复或解决方法?
答案 0 :(得分:288)
您还应确保为所有例外设置断点。这将导致Xcode停止在发生异常的行。执行以下[在Xcode 4中]:
在Xcode左侧的Project Navigator中,单击断点导航器(几乎一直到顶部按钮栏的右侧。图标看起来像一个粗右箭头)。
在导航器的底部,单击“+”按钮。
点击“添加例外断点”。
将创建一个新断点。它应该根据需要进行配置,但您可以调整其行为。
运行项目并重现异常。
您还提到您链接到某些第三方库/框架。如果在这些框架中发生异常,那么自编译代码以来,您将很难过,而Xcode实际上无法显示导致异常的行。如果是这种情况并且您确定正在使用这些库,那么您应该向这些库的维护者提交错误报告。
答案 1 :(得分:19)
只需按照StackOverflow回答中的说明操作:
基本上,你只需要“启用僵尸”。然后Xcode应该在导致问题的任何一行中断。
(令人震惊的是,即使在2017年,Xcode仍默认关闭。为什么不想要看到引起问题的线路?并且“启用Zombie Objects “?!真的吗?!Xcode的作者是否真的相信这是一个有用的名字,对新开发者来说会有什么意义?它令人沮丧的是Xcode的评级是多么糟糕,年复一年, App Store。没有人在听......)
答案 2 :(得分:8)
修改当前方案并启用NSZombieEnabled
,MallocStackLogging
和guard malloc
。然后,当您的应用程序崩溃时,请在gdb控制台中输入:
(gdb) info malloc-history 0x543216
将0x543216
替换为导致NSInvalidArgumentException
的对象的地址,它应该为您提供更有用的堆栈跟踪,显示导致崩溃的代码行。
答案 3 :(得分:2)
我在大量优化的代码中看到了这种行为;检查,调整目标的优化级别和第三方库的优化级别可能有所帮助。 (LLVM 3.0优化级别设置)
您是否正在生成调试符号?
答案 4 :(得分:0)
我编写代码来生成索引超出范围的崩溃。 以下是抛出的异常。
2017-01-07 04:02:57.606 testABC[1694:52966] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSSingleObjectArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0]'
*** First throw call stack:
(
0 CoreFoundation 0x000000010e85cd4b __exceptionPreprocess + 171
1 libobjc.A.dylib 0x000000010e2be21e objc_exception_throw + 48
2 CoreFoundation 0x000000010e8b5c2f -[__NSSingleObjectArrayI objectAtIndex:] + 111
3 testABC 0x000000010dce962d -[ViewController ComplexFunction] + 61
4 testABC 0x000000010dce95db -[ViewController thirdFunction] + 43
5 testABC 0x000000010dce959b -[ViewController secondFunction] + 43
6 testABC 0x000000010dce955b -[ViewController firstFinction] + 43
7 testABC 0x000000010dce96c2 -[ViewController viewDidAppear:] + 50
8 UIKit 0x000000010ee28a6c -[UIViewController _setViewAppearState:isAnimating:] + 945
9 UIKit 0x000000010ee2b7da __64-[UIViewController viewDidMoveToWindow:shouldAppearOrDisappear:]_block_invoke + 42
10 UIKit 0x000000010ee29ac4 -[UIViewController _executeAfterAppearanceBlock] + 86
11 UIKit 0x000000010ec8d77c _runAfterCACommitDeferredBlocks + 653
12 UIKit 0x000000010ec7a273 _cleanUpAfterCAFlushAndRunDeferredBlocks + 566
13 UIKit 0x000000010ec9d757 __84-[UIApplication _handleApplicationActivationWithScene:transitionContext:completion:]_block_invoke_2 + 194
14 CoreFoundation 0x000000010e8016ac __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 12
15 CoreFoundation 0x000000010e7e66f4 __CFRunLoopDoBlocks + 356
16 CoreFoundation 0x000000010e7e5e65 __CFRunLoopRun + 901
17 CoreFoundation 0x000000010e7e5884 CFRunLoopRunSpecific + 420
18 GraphicsServices 0x00000001126d9a6f GSEventRunModal + 161
19 UIKit 0x000000010ec80c68 UIApplicationMain + 159
20 testABC 0x000000010dce99df main + 111
21 libdyld.dylib 0x000000011174968d start + 1
22 ??? 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
如果您仔细阅读First Throw call stack
0 CoreFoundation 0x000000010e85cd4b __exceptionPreprocess + 171
1 libobjc.A.dylib 0x000000010e2be21e objc_exception_throw + 48
0 and 1
是崩溃后的系统进程。
2 CoreFoundation 0x000000010e8b5c2f -[__NSSingleObjectArrayI objectAtIndex:] + 111
2
是导致异常的行。
3 testABC 0x000000010dce962d -[ViewController ComplexFunction] + 61
3
告诉您类名(ViewController
)和函数naem(ComplexFunction
),其中抛出了异常。