Iphone 使用LLVM和任何优化进行构建都会导致应用程序在启动时崩溃

Iphone 使用LLVM和任何优化进行构建都会导致应用程序在启动时崩溃,iphone,gcc,xcode4,llvm,xcodebuild,Iphone,Gcc,Xcode4,Llvm,Xcodebuild,当我尝试用XCode 4.0.1中的LLVM 2.0和任何级别或优化构建我的应用程序时(除了-O0之外),我在设备上启动应用程序后,应用程序崩溃(模拟器正常)。我似乎无法调试崩溃,因为在xcode中构建并通过GDB/LLDB连接时不会发生崩溃。此外,只有在我使用xcodebuild在命令行上构建应用程序时才会发生崩溃;即使使用完全相同的项目设置,通过XCode IDE构建也不会崩溃。我在崩溃日志中看不到任何有用的信息,因为崩溃发生在我的代码之外: Exception Type: EXC_BAD

当我尝试用XCode 4.0.1中的LLVM 2.0和任何级别或优化构建我的应用程序时(除了-O0之外),我在设备上启动应用程序后,应用程序崩溃(模拟器正常)。我似乎无法调试崩溃,因为在xcode中构建并通过GDB/LLDB连接时不会发生崩溃。此外,只有在我使用xcodebuild在命令行上构建应用程序时才会发生崩溃;即使使用完全相同的项目设置,通过XCode IDE构建也不会崩溃。我在崩溃日志中看不到任何有用的信息,因为崩溃发生在我的代码之外:

Exception Type:  EXC_BAD_ACCESS (SIGBUS)
Exception Codes: KERN_PROTECTION_FAILURE at 0x00b53400
Crashed Thread:  0

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   ???                             0x00b53400 0 + 11875328
由于它不知道崩溃发生在哪个库中,因此无法正确地表示

设备控制台显示我们的应用程序在启动时所做的一些NSLog语句,然后加载并绘制第一个屏幕的UI,然后发生崩溃。没有优化的构建,或者使用GCC4.2的构建以及任何优化级别都可以正常工作


这里可能会发生什么,我如何调试它?与xcodebuild命令行界面相比,XCode IDE在构建和部署应用程序时会有哪些不同之处?

我们的应用程序也有同样的问题。它只影响发布/分发版本中的armv6代码,因此仅影响iPhone 3G和iPod Touch 2G。但与您的描述相反,它可以用XCode复制(我们不使用XCode构建)

显然,生成的代码会损坏堆栈指针。因此,您无法真正调试它,并且崩溃日志毫无价值。使用调试器,它可以在VIEWWILLEXPEND处停止:应显示的第一个视图的动画。但很快,应用程序就崩溃了

切换到旧的编译器解决了这个问题

我向苹果公司提交了一个bug。请也提交一个,因为据说这会增加bug的优先级

有更多的人报告相同的问题:

  • (德语)

升级到Xcode 4.0.2


它为我们解决了这个问题(ARMv6在发布时崩溃,而不是启用优化的ARMv7)。

这很奇怪,因为我和我的同事都在iPad和iPhone 3gs上看到过这种情况。感谢您的澄清。我也有同样的问题。我也可以复制,也可以确认。我正在iPhone 3G设备上运行XCode 4.0(哦,是时候升级了!)和iOS 3.1。我的构建设置是LLVM 2.0,优化设置为“最快、最小”。正如@Kevlar所建议的,到目前为止,我尝试过的每种设置都会出现除“无”之外的任何优化,应用程序崩溃。对于任何高于-O0的优化级别,XCode 4.1,甚至其他编译器(gcc或gcc llvm)也存在同样的问题。你可能是指XCode 4.0.1。现在,XCode 4.0.2已经上市几天了。自述文件说:“修复了LLVM编译器2.0中可能导致应用程序在iOS设备上崩溃的错误。”。也许这能解决问题。稍后我会试试。我终于拿到了一部iPhone3G,并用XCode 4.0.2重新测试了它。新的好消息是:问题已经解决了。需要更多的颜色。带Xcode 3.2.x-4.0.1的LLVM 1.6-2.0似乎可以生成包含此崩溃的代码。此外,优化级别似乎没有任何影响,任何超过-O0的东西都会使其发生。另一个解决方法是有条件地为ARMv6构建-O0,而将ARMv7构建为-Os或任何您使用的东西。要在Xcode 4.x中执行此操作,请单击目标构建设置中“优化级别”旁边的加号,然后单击特例ARMv6。请确保在此之后进行清理和重新编译,因为Xcode似乎不会自动接收更改。+BenLachman这是一个关于基于每个体系结构的条件优化的绝妙技巧,我不知道您能做到这一点。将来,我可能会使用-O0构建我所有的ARMv6代码——只有一小部分客户会使用iPhone 3G设备,性能上的损失会被稳定性方面的收益所抵消