Xcode不显示导致崩溃的行

每当我的应用程序崩溃时,Xcode在main()函数中突出显示UIApicationMain()调用,作为导致崩溃的行。 在过去是正常的情况下(例如分段错误),但是我想要处理的崩溃是一个简单的SIGABRT,其中包含控制台中logging的详细信息:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary setObject:forKey:]: attempt to insert nil value (key: Date)' 

Xcode用来显示正确的老版本的SDK,但自从我升级到Xocde 4.2更改。 很显然,Xcode确切地知道是什么导致了崩溃(或可能知道),但它仍然没有显示实际的行。 有没有解决方法或解决方法?

您还应该确保为所有例外设置了断点。 这将导致Xcode停止在发生exception的行。 在[Xcode 4]中执行以下操作:

  1. 在Xcode左侧的Project Navigator中,单击断点导航器(几乎一直到顶部button栏的右侧,该图标看起来像一个胖右箭头)。

  2. 在导航器的底部,点击“+”button。

  3. 点击“添加exception断点”。

  4. 一个新的断点将被创build。 它应该根据需要configuration,但你可以调整它的行为。

  5. 运行您的项目并重现exception。

你还提到你链接到一些第三方库/框架。 如果在这些框架中发生exception,那么自从代码被编译以后,Xcode就不能真正向您显示导致exception的行。 如果是这种情况,并且您确定您正在正确使用这些库,那么您应该向这些库的维护者提交一个错误报告。

只需按照这个StackOverflow答案的指示:

启用僵尸

基本上,你只需要“启用僵尸”。 那么Xcode应该在任何一行导致问题的地方打破。

在这里输入图像描述

(令人震惊的是,即使在2017年,Xcode仍然默认closures了这个function,为什么你不想看到导致这个问题的线?而且“ 启用僵尸对象 ”?真的吗?相信这是一个有用的名字,对于新开发者来说会有什么样的感觉呢?这是令人沮丧的,Xcode的年度评分在App Store里年复一年,没有人在听…)

编辑当前scheme并启用NSZombieEnabledMallocStackLoggingguard malloc 。 然后,当你的应用程序崩溃时,在gdb控制台中input:

 (gdb) info malloc-history 0x543216 

0x543216replace为导致NSInvalidArgumentException的对象的地址,它应该给你一个更有用的堆栈跟踪,显示导致崩溃的代码行。

我已经在大量优化的代码中看到了这种行为; 检查,调整目标的优化级别和第三方库的可能会有所帮助。 (LLVM 3.0优化级别设置)

您是否正在生成debugging符号?

我写了代码来生成索引崩溃的界限。 以下是抛出的exception。

 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是导致exception的线路。

 3 testABC 0x000000010dce962d -[ViewController ComplexFunction] + 61 

3告诉你类名( ViewController )和函数naem( ComplexFunction )在哪个exception被抛出。