【问题标题】:iOS App crashes under 3.1.3 when compiled with LLVM2使用 LLVM2 编译时,iOS App 在 3.1.3 下崩溃
【发布时间】:2011-08-02 00:08:36
【问题描述】:

我有一个 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 作为可选(将二进制文件与库链接)。

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

  1. 调试构建,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,启动几秒钟后崩溃。

在案例 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 compiler-construction build xcode4 llvm


【解决方案1】:

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

【讨论】:

  • 是的 - 可能是一个类似的问题。已经求助于使用 LLVM GCC4.2 进行编译 - LLVM2 版本根本不符合 iPod Touch 第一代。
【解决方案2】:

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

AdHoc App 在 iOS5 模拟器、iPad1 和 iPhone4 上运行良好。 相同的 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

到目前为止,对代码和内存管理的广泛分析并没有提供可能导致这种情况的指示。这似乎是一个编译器错误...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    • 1970-01-01
    • 2011-12-11
    相关资源
    最近更新 更多