Xcode不显示导致崩溃的行

问题描述:

每当我的应用程序崩溃时,Xcode在main()函数中突出显示UIApicationMain()调用,作为导致崩溃的行。在某些情况下,曾经是正常的(例如分段故障),但我想应对碰撞与登录控制台的详细信息的简单SIGABRT:Xcode不显示导致崩溃的行

*** 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

您是否正在编译版本?如果是这样,请尝试将该方案设置为Debug。 – epatel

+0

将其设置为调试。 – JonasG

+0

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

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

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

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

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

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

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

另外你提到你链接到一些第三方库/框架。如果在这些框架内发生异常,那么自从编译代码并且Xcode不能真正向您显示导致异常的行之后,您将会很困难。如果是这种情况,并且您确定您正在正确使用这些库,那么您应该向这些库的维护者提交一个错误报告。

+6

嗨,我试过了你的解决方案,但是它再次捕获到了Main .. – Dejell

+0

不,选择“On Throw”抓住主要的断点。 –

+5

这个答案,正如Xcode 5所写,对于Xcode 5是正确的。 –

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

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

+0

同意。如果您正在尝试调试,那么您的构建设置中的优化级别需要设置为0(无优化)。 – Carter

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

(gdb) info malloc-history 0x543216 

替换0x543216引起此NSInvalidArgumentException对象的地址,它应该给你一个更加有用的堆栈跟踪,显示的线条您导致崩溃的代码。

+0

我试过了,并且抛出了错误:'info'不是一个有效的命令。有什么建议? – achi

+0

@EliGregory确保您的调试器设置为gdb,而不是默认的lldb。您可以在运行部分下的Edit Scheme菜单中更改它。 – chown

只需按照这个*的答案说明:

Enable Zombies

基本上,你只需要为 “Enable植物大战僵尸”。然后,Xcode应该在任何一行导致问题的地方打破。

enter image description here

(这绝对是令人震惊的是,即使在2017年,Xcode中仍然有这个默认关闭。为什么你会希望看到导致问题的行?而“启用僵尸对象“?!真的吗?!Xcode作者是否真的相信这是一个有用的名字,这对新开发者来说会有什么意义呢?它正在压低Xcode的年度评分在App Store中年复一年的水平。没有人在听...)

+0

所以真的......在很多方面远远落后于Visual Studio。 – Brduca

+2

伟大的一点,MikeGledhill。 – Fattie

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

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

+1

错误,好吧。你是对的,但这是友好的吗?在任何现代(从上世纪90年代开始)的开发环境中,当发生异常时,你会被带到导致问题的线路。尽管Xcode ...嗯...给你一个像这样的堆栈跟踪。即使Turbo Pascal也没有过时! –

+0

很可笑的是,这家据称以“最佳用户体验”闻名的公司并没有意识到过去20年来所有的开发人员都习惯于看到引发异常的行号,而不是在汇编器中。我疯了吗?我一生中使用的每种语言都给出了行号。即使是C或C++。 – mylovemhz