Xcode不显示导致崩溃的行

Jon*_*asG 123 xcode cocoa-touch objective-c nsexception ios

每次我的应用程序崩溃时,Xcode都会在main()函数中突出显示UIApicationMain()调用,导致崩溃.在某些情况下,以前是正常的(例如分段错误),但我试图处理的崩溃是一个简单的SIGABRT,其中记录了控制台中的详细信息:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary setObject:forKey:]: attempt to insert nil value (key: Date)'
Run Code Online (Sandbox Code Playgroud)

Xcode用于显示旧版SDK的正确行,但自从我升级到Xocde 4.2后发生了变化.很明显,Xcode确切地知道导致崩溃的原因(或者可能知道),但它仍然没有显示实际的行.这有什么修复或解决方法吗?

Car*_*ter 297

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

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

  2. 在导航器的底部,单击"+"按钮.

  3. 单击"添加异常断点".

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

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

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

  • 如上所述,这个答案对Xcode 5来说是正确的. (5认同)
  • 我是一个菜鸟,在没有这个的情况下开发了近一个月......这改变了我的生活. (4认同)
  • 我的朋友注册了一个SO帐户只是为了支持这篇文章. (4认同)

Mik*_*ill 25

只需按照StackOverflow回答中的说明操作即可:

启用僵尸

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

在此输入图像描述

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

  • Xcode是我到目前为止使用的最糟糕的编程环境. (3认同)

cho*_*own 8

编辑目前的方案并启用NSZombieEnabled,MallocStackLoggingguard malloc.然后,当您的应用程序崩溃时,在gdb控制台中键入:

(gdb) info malloc-history 0x543216
Run Code Online (Sandbox Code Playgroud)

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