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

Kev*_*lar 10 iphone gcc llvm xcodebuild xcode4

当我尝试在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
Run Code Online (Sandbox Code Playgroud)

它不会正确地符号化,因为它不知道崩溃发生在哪个库中.

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

这里可能会发生什么,我该如何调试呢?在构建和部署应用程序与xcodebuild命令行界面时,XCode IDE可以做些什么?

Cod*_*odo 9

我们的应用程序遇到了同样的问题.它只影响发布/发布版本中的armv6代码,因此只影响iPhone 3G和iPod Touch 2G.但与您的描述相反,它可以使用XCode重现(我们不使用xcodebuild).

显然,生成的代码会破坏堆栈指针.因此,您无法真正调试它,崩溃日志也毫无价值.使用调试器,它可以在viewWillAppear停止:应该显示的第一个视图的动画.但很快,应用程序总是崩溃.

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

我向Apple提交了一个错误.请提交一个,因为据说增加了bug的优先级.

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


Ben*_*man 1

升级到 Xcode 4.0.2。

它为我们解决了这个问题(ARMv6 启动时崩溃,但打开优化的 ARMv7 则不会崩溃)。

  • 另一种解决方法是有条件地为 ARMv6 构建 -O0,同时使用 -Os 或您使用的任何内容来构建 ARMv7。要在 Xcode 4.x 中执行此操作,请单击目标构建设置中“优化级别”旁边的加号,然后单击特殊情况的 ARMv6。请确保在此之后进行清理并重新编译,因为 Xcode 似乎不会自动获取更改。 (3认同)