使用 LLVM2 编译时,iOS 应用程序在 3.1.3 下崩溃

问题描述 投票:0回答:2

我有一个 iOS 应用程序,在 XCode 4.0.1 中具有以下(选定的)构建设置:

  • 架构=标准(armv6 armv7)
  • 基础 SDK = 最新 iOS (iOS 4.3)
  • iOS部署目标= iOS3.1
  • 其他链接器标志 = -lxml2 -weak-library /usr/lib/libSystem.B.dylib

在“目标/构建阶段”下,我将 libSystem.B.dylib 作为可选(将二进制文件与库链接)。

在第一代 iPod Touch 上,我得到以下结果:

  1. 调试构建,C/C++编译器版本=LLVM编译器2.0,一切OK
  2. Ad Hoc Release Build,C/C++ 编译器版本 = GCC 4.2,一切OK
  3. Ad Hoc Release Build,C/C++ 编译器版本= LLVM GCC 4.2,一切OK
  4. Ad Hoc Release Build,C/C++ 编译器版本 = LLVM 编译器 2.0,启动后几秒钟崩溃。

在情况 4. 中,崩溃报告如下所示:

Incident Identifier: 10B8B9C5-0FA5-4C83-AB13-4C3F59D5962D
CrashReporter Key:   29f7901a33e9b055c9034cd051902ea0c87e61f6
Process:         TPE [1484]
Path:            /var/mobile/Applications/4FA4C8CA-DB5D-4096-8458-C76382E68D02/TPE.app/TPE
Identifier:      TPE
Version:         ??? (???)
Code Type:       ARM (Native)
Parent Process:  launchd [1]

Date/Time:       2011-04-09 17:56:58.188 +1000
OS Version:      iPhone OS 3.1.3 (7E18)
Report Version:  104

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

Thread 0 Crashed:
0   libSystem.B.dylib               0000000000 0 + 0

Thread 1:
0   libSystem.B.dylib               0x00001488 mach_msg_trap + 20
1   libSystem.B.dylib               0x00004064 mach_msg + 60
etc.

崩溃发生在我的代码中的许多例程执行之后(我可以看到控制台输出确认它)。

有谁知道什么会导致它在 GCC4.2 下工作,但在 LLVM2 下崩溃?

ios build llvm xcode4
2个回答
1
投票

这只是一个疯狂的猜测,但最近 llvm2 中存在一个编译器错误,导致我们的应用程序以同样的方式崩溃。它仅发生在完全优化的发布模式下,并且仅发生在较旧的设备(可能是特定的处理器)上。我们切换回 gcc,一切又恢复正常了。苹果同时更新了他们的编译器,“修复了 iOS 的错误”,但我们还没有测试它。


1
投票

当使用 Apple LLVM 编译器 3.0 生成代码时,XCode 4.2 (4D199) 仍然会出现同样的问题。

AdHoc 应用程序在模拟器、iPad1 和 iPhone4 上的 iOS5 上运行良好。 相同的 AdHoc 代码在 iOS 4.2.1 (8C148) 上的 iPhone 3 和 iPod3 上崩溃。

调试代码在所有平台上都可以正常工作。

出现问题时控制台日志显示以下内容:

SpringBoard[25] <Warning>: Received memory warning. Level=1
MobileSafari[283] <Warning>: Received memory warning. Level=1
configd[23] <Notice>: jetsam: kernel memory event (93), free: 241, active: 1109, inactive: 760, purgeable: 0, wired: 7878
configd[23] <Notice>: jetsam: kernel termination snapshot being created
com.apple.launchd[1] <Notice>: (UIKitApplication:com.apple.mobilesafari[0xc614]) Exited: Killed
com.apple.launchd[1] <Notice>: (UIKitApplication:com.myapp.test[0x47db]) Exited: Killed
SpringBoard[25] <Warning>: Application 'MyApp' exited abnormally with signal 9: Killed

应用程序的峰值内存使用量为几 Mb。调试代码永远不会达到临界内存限制。

出现以下任一情况时,问题就会消失:

  1. AdHoc 的优化级别设置为无 (-O0)
  2. 编译器改为LLVM GCC 4.2

到目前为止,对代码和内存管理的广泛分析尚未表明可能导致此问题的原因。这似乎是一个编译器错误...

© www.soinside.com 2019 - 2024. All rights reserved.