我有一个 iOS 应用程序,在 XCode 4.0.1 中具有以下(选定的)构建设置:
在“目标/构建阶段”下,我将 libSystem.B.dylib 作为可选(将二进制文件与库链接)。
在第一代 iPod Touch 上,我得到以下结果:
在情况 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 下崩溃?
这只是一个疯狂的猜测,但最近 llvm2 中存在一个编译器错误,导致我们的应用程序以同样的方式崩溃。它仅发生在完全优化的发布模式下,并且仅发生在较旧的设备(可能是特定的处理器)上。我们切换回 gcc,一切又恢复正常了。苹果同时更新了他们的编译器,“修复了 iOS 的错误”,但我们还没有测试它。
当使用 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。调试代码永远不会达到临界内存限制。
出现以下任一情况时,问题就会消失:
到目前为止,对代码和内存管理的广泛分析尚未表明可能导致此问题的原因。这似乎是一个编译器错误...