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

时间:2011-04-09 08:20:56

标签: ios compiler-construction build xcode4 llvm

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

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

在Targets / Build Phases下,我将libSystem.B.dylib作为Optional(Link Binary with Libraries)。

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

  1. Debug Build,C / C ++编译器版本= LLVM编译器2.0,一切正常
  2. Ad Hoc Release Build,C / C ++编译器版本= GCC 4.2,一切正常
  3. Ad Hoc Release Build,C / C ++编译器版本= LLVM GCC 4.2,一切正常
  4. Ad Hoc Release Build,C / C ++编译器版本= LLVM编译器2.0,启动后几秒钟崩溃。
  5. 在案例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下崩溃?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

调试代码适用于所有平台。

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

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
  3. 到目前为止,对代码和内存管理的广泛分析并未提供可能导致此问题的原因。这似乎是一个编译器错误...