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很明显知道是什么导致了崩溃(或者可能知道),但它仍然没有显示实际的行。有没有解决方法或解决方法?
您还应该确保为所有例外设置了断点。这将导致Xcode停止在发生异常的行。请执行下列操作[在Xcode 4]:
在Project Navigator上的Xcode的左侧,点击断点导航器(几乎所有的方式到顶部按钮栏右侧的图标看起来像一个胖右箭头)。
在导航器的底部,单击“+”按钮。
单击“添加异常断点”。
将创建一个新的断点。它应该根据需要进行配置,但您可以调整其行为。
运行您的项目并重现异常。
另外你提到你链接到一些第三方库/框架。如果在这些框架内发生异常,那么自从编译代码并且Xcode不能真正向您显示导致异常的行之后,您将会很困难。如果是这种情况,并且您确定您正在正确使用这些库,那么您应该向这些库的维护者提交一个错误报告。
嗨,我试过了你的解决方案,但是它再次捕获到了Main .. – Dejell
不,选择“On Throw”抓住主要的断点。 –
这个答案,正如Xcode 5所写,对于Xcode 5是正确的。 –
我已经在严重优化的代码中看到过这种行为;检查,调整你的目标的优化级别和第三方库的可能会有所帮助。 (LLVM 3.0优化级别设置)
您是否正在生成调试符号?
同意。如果您正在尝试调试,那么您的构建设置中的优化级别需要设置为0(无优化)。 – Carter
编辑当前方案并启用NSZombieEnabled
,MallocStackLogging
和guard malloc
。然后,当你的应用程序崩溃,在gdb的控制台输入:
(gdb) info malloc-history 0x543216
替换0x543216
引起此NSInvalidArgumentException
对象的地址,它应该给你一个更加有用的堆栈跟踪,显示的线条您导致崩溃的代码。
只需按照这个*的答案说明:
基本上,你只需要为 “Enable植物大战僵尸”。然后,Xcode应该在任何一行导致问题的地方打破。
(这绝对是令人震惊的是,即使在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
)。
错误,好吧。你是对的,但这是友好的吗?在任何现代(从上世纪90年代开始)的开发环境中,当发生异常时,你会被带到导致问题的线路。尽管Xcode ...嗯...给你一个像这样的堆栈跟踪。即使Turbo Pascal也没有过时! –
很可笑的是,这家据称以“最佳用户体验”闻名的公司并没有意识到过去20年来所有的开发人员都习惯于看到引发异常的行号,而不是在汇编器中。我疯了吗?我一生中使用的每种语言都给出了行号。即使是C或C++。 – mylovemhz
您是否正在编译版本?如果是这样,请尝试将该方案设置为Debug。 – epatel
将其设置为调试。 – JonasG
也可能是某些xib不好导致程序崩溃在你自己的源代码之外的地方,因此没有显示任何文件。该错误描述了一个名为“Date”的字典键的问题 – epatel