Xcode 不显示导致崩溃的行

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

47733 次浏览

您还应该确保为所有异常设置了断点。这将导致 Xcode 止步于例外情况出现的地方。执行以下操作[在 Xcode 4中] :

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

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

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

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

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

您还提到您链接了一些第三方库/框架。如果异常发生在这些框架中,那么您将遇到困难,因为代码是编译的,而 Xcode 实际上不能向您显示导致异常的行。如果是这种情况,并且您确信正确地使用了这些库,那么您应该向这些库的维护者提交一份 bug 报告。

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

正在生成调试符号吗?

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

(gdb) info malloc-history 0x543216

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

只需按照 StackOverflow 答案上的说明:

启用僵尸

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

enter image description here

(绝对令人震惊的是,即使在2017年,Xcode 仍然默认关闭这个功能。为什么 没有想要看到引起问题的那条线?那“ 启用僵尸对象”呢!真的吗!Xcode 的作者真的相信这是一个有用的名字吗? 对于新的开发人员来说,这个名字有任何意义吗?令人沮丧的是,年复一年,Xcode 在 App Store 上的评价是多么的糟糕。没人在听...)

我编写了代码来生成一个超出界限的索引崩溃。 以下是引发的异常。

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