129

每次我的应用程序崩溃时,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 确切地知道是什么导致了崩溃(或者可能知道),但它仍然没有显示实际的行。有什么解决方法或解决方法吗?

4

5 回答 5

305

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

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

  2. 在导航器的底部,单击“+”按钮。

  3. 单击“添加异常断点”。

  4. 将创建一个新断点。它应该根据需要进行配置,但您可以调整其行为。

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

您还提到您链接到一些第 3 方库/框架。如果异常发生在这些框架中,那么您将很难过,因为代码已编译,而 Xcode 实际上无法向您显示导致异常的行。如果是这种情况并且您确定您正确使用了这些库,那么您应该向这些库的维护者提交一份错误报告。

于 2011-10-09T12:42:21.277 回答
28

只需按照此 StackOverflow 答案上的说明进行操作:

启用僵尸

基本上,您只需要“启用僵尸”。然后 Xcode 应该在导致问题的那一行中断。

在此处输入图像描述

(令人震惊的是,即使在 2017 年,Xcode 仍然默认关闭此功能。为什么您不想看到导致问题的行?和“启用僵尸对象”?!真的吗?!Xcode 作者真的相信这是一个有用的名字,对新开发者有任何意义?令人沮丧的是,Xcode 在 App Store 中的评分年复一年地差。没有人在听……)

于 2016-05-02T05:17:20.920 回答
10

编辑当前方案并启用NSZombieEnabledMallocStackLoggingguard malloc。然后,当您的应用程序崩溃时,在 gdb 控制台中输入:

(gdb) info malloc-history 0x543216

替换为导致崩溃0x543216的对象的地址,NSInvalidArgumentException它应该为您提供更有用的堆栈跟踪,显示导致崩溃的代码行。

于 2011-10-10T02:31:28.113 回答
2

我在高度优化的代码中看到了这种行为;检查、调整目标的优化级别和 3rd 方库的优化级别可能会有所帮助。(LLVM 3.0 优化级别设置)

您是否正在生成调试符号?

于 2011-10-10T02:26:00.037 回答
1

我编写了代码来生成索引超出范围的崩溃。以下是抛出的异常。

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)。

于 2017-01-06T23:26:31.673 回答