Xcode在iOS 8中的Main()中引发exception,并带有“所有exception”断点

我正在使用Xcode 6(GM,我没有下载beta),我正在开发适用于iOS 7+的应用程序。 对于我所有的项目,我只是打开了我以前在Xcode 5中使用过的项目。

在断点导航器中,我有All Exceptions断点。 它被设置为Break: On Throw 。 现在,每次我运行我的应用程序(无论是在设备上还是在模拟器中),它都会停止执行, return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));main()函数中。

如果按Play继续执行两次程序,程序运行正常。 所以这并不妨碍我的工作,但是每次都要手动执行执行程序并重置我的编辑器是很烦人的。

我喜欢我在Xcode中设置的行为(将当前编辑器放在执行暂停的位置),并且让All Exceptions断点是重要的IMO。 (所以我不想改变这些)

通过运行相同的代码,在相同的环境下,对于iOS 7目标(同样是设备或模拟器),不会抛出exception。

任何线索可能会导致这种奇怪的行为?

如注释中所述,您应该通过编辑“ 所有exception”断点来closures捕获C ++exception。

为了做到这一点,请右键单击断点,将ExceptionAll更改为Objective-C

将所有更改为Objective-C

C ++代码中的例外是普通应用程序function的一部分。 但是,exception断点并不捕捉未处理的内容,而是每次引发的exception,即使在稍后处理正确时也是如此,因此停止执行。

TLDR; 在我的情况下,问题的原因是缺less字体。

我也有这个问题。 虽然@Johnnywho是正确的,只留下Objective-C的exception断点,停止不需要的行为,它仍然不能解释什么是真正的原因,为什么它在iOS7上运行,没有例外,为什么这只发生在一些项目。

这就是为什么我继续解剖我的问题之一,直到我find原因。 我想这可能有多个原因,但在我的情况下,缺less自定义字体。

快速testing方法:

  1. 开始一个新的单一视图项目

  2. 对所有exception启用断点,包括C ++(断点/ + /添加exception断点)

  3. 拖入项目的一些自定义字体(允许复制和检查目标添加到)

  4. 在主视图控制器的视图中添加一个标签

  5. 为您的标签select自定义字体(在Xcode 6+上,只要将它拖到项目中,它就会显示在字体select器中)。

  6. 运行应用程序,并确认您看到自定义字体中的标签(似乎我们不需要在Info.plist中为“应用程序提供的字体”键添加字体文件名,如果自定义字体已经用在应用程序的xib的故事板中)。

  7. 现在从您的项目中删除自定义字体(通过取消目标关系或通过在目标设置/构build阶段/复制包资源中删除它)

  8. 从设备或SIM上删除应用程序(从应用程序包中删除字体文件)

  9. 产品/清洁

  10. 再次运行应用程序(现在标签仍然有对自定义字体的引用,但应用程序没有该文件)。 如果您在iOS8上运行,您应该注意到这个神秘的exception。

  11. 在iOS7设备上运行应用程序,或者在iOS7上运行SIM卡(为此,您需要将iOS部署目标更改为iOS7)。 虽然标签不会显示自定义字体,但不会有例外。

  12. 将字体文件添加回目标,断点不会停止运行。

所以我的结论是,在iOS8上,丢失的字体会导致C ++exception,而在iOS7中则不会,因此会触发断点。

类似的exception(和断点触发器)也可能由Info.plist文件中错误地写入“应用程序提供的字体”下的字体文件名造成的。

只是总结了以前的答案,帮助我解决这个问题。

问题:当您添加自定义字体,然后显然删除(replace)它,项目中的某个地方仍然是他的参考和断点在iOS 8的主C ++ lib断点停止几次停止。

解决scheme

1)在项目中查找并删除(replace)所有对这些字体的引用。 可能在一些笔尖,子模块等…

2)如果你不能在任何地方修复(只读的库使用它们),或者在解决scheme1之后问题仍然存在,那么将这些旧的字体添加回项目

3)忽略它 – 它是C ++ lib,所以只能将断点exception从“All”改为“Objective-C”