Xcode不显示导致崩溃的行


126

每次我的应用程序崩溃时,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确切知道了导致崩溃的原因(或可能知道),但它仍未显示实际行。是否有任何修复程序或解决方法?


2
您要为发布进行编译吗?如果是这样,请尝试将方案设置为“调试”。
epatel

也可能是某些xib不好,导致程序在您自己的源代码之外的某个地方崩溃,因此,没有显示任何文件。该错误描述了名为“ Date”的字典键的问题
epatel

1
苹果应该雇用更多的测试人员;)
Amr Lotfy

Answers:


301

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

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

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

  3. 单击“添加例外断点”。

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

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

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


4
我是一个菜鸟,已经成长了近一个月了……这改变了我的生活。
Jonny Burger 2014年

4
我的朋友注册了一个SO帐户只是为了赞这个帖子。
Alex Spencer

1
在我的书中,这被称为对苹果的半
屁股

1
这样做,但是仍然找不到在null上调用length的位置:(
Shereef Marzouk 2014年

1
这可行,但是缺点是它不再在调试控制台中输出异常的详细信息。因此,我可以关闭此断点,并查看异常的详细信息和跟踪,但不了解发生的位置,也可以将其打开以查看发生的位置,但是不知道为什么。有人知道两者都有吗?
加布里埃尔·延森2014年

27

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

启用僵尸

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

在此处输入图片说明

(令人震惊的是,即使在2017年,Xcode仍默认关闭此功能。为什么您希望看到导致问题的代码行?以及“ 启用Zombie对象 ”?!真的吗?!Xcode作者真的相信这是一个有用的名称,对新开发人员来说有什么意义呢?它压低了App Store中Xcode的年复一年的评价。


6
到目前为止,Xcode是我使用过的最糟糕的编程环境。
学生

我发现(作为Visual Studio开发人员)有趣的是,我遇到了多少Xcode开发人员,他们坚持认为Xcode是他们使用过的最佳环境。逻辑,友好和乐于助人..但有一些怪癖。即使是现在,在2019年11月,Xcode在App Store的评分为3.1,大多数人给它5星或1星。没有人听....
迈克·格莱德希尔

9

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

(gdb) info malloc-history 0x543216

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


1
我尝试了此操作,并抛出错误:“ info”不是有效命令。有什么建议吗?
2013年

@EliGregory确保将调试器设置为gdb,而不是默认的lldb。您可以在运行部分下的“编辑方案”菜单中对其进行更改。
chown

2

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

您在生成调试符号吗?


同意 如果要调试,则需要在构建设置中将优化级别设置为0(无优化)。
卡特

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


4
嗯,好的。您说的很对,但这很友好吗?在任何现代(1990年代及以后)的开发环境中,当发生异常时,您将被带到引起问题的那一行。而Xcode ...很好...给了你这样的堆栈跟踪。甚至Turbo Pascal都不是过时的!
Mike Gledhill

4
荒谬的是,这家以“最佳用户体验”闻名的公司没有意识到过去20年中的所有开发人员都习惯于看到抛出异常且不在汇编器中的行号。我疯了吗?我一生使用的每种语言都会给出行号。甚至C或C ++。
mylovemhz
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.