【问题标题】:Cocos2D v2.1 and arm64 crash on iPad Air despite no compiler warningsCocos2D v2.1 和 arm64 在 iPad Air 上崩溃,尽管没有编译器警告
【发布时间】:2014-05-23 15:05:07
【问题描述】:

我在此发帖,希望得到更有经验的程序员的建议(一般来说,特别是 Cocos2D)。

我有一个旧项目在几个地方使用 Cocos2D v2.1,否则它是标准的 UIKit。我将其更新为与 arm64 兼容,或者我认为是这样,并设法删除了任何编译器警告,并在模拟器上成功运行了该应用程序。但是,我刚刚收到来自 iPad Air 用户的错误报告,该应用程序的 Cocos2d 部分正在崩溃。

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Subtype: KERN_INVALID_ADDRESS at 0x0000000000000010
Triggered by Thread:  0

Thread 0 Crashed:
0   libobjc.A.dylib                   0x00000001995101d0 0x1994f8000 + 98768
1                     0x000000010014e820 -[CCTimer update:] + 152
2                     0x0000000100152140 -[CCScheduler update:] + 420
3                      0x000000010016ab30 -[CCDirectorIOS drawScene] + 172

就像我说的那样,没有编译器警告,而且这一切都可以在模拟器上运行,所以我有点不知道如何修复它。我知道通常的两种选择是 1.移除arm64 2.升级到Cocos2D v3.0

但是,我只将 Cocos2D 用于应用程序的一小部分,所以我希望也许我错过了一个简单的修复。一般来说,我对 Cocos2D 和调试非常缺乏经验,所以如果这是一个失败的原因,我希望得到一些建议,我最好把时间花在其他两个选项之一上,或者我可以做一些简单的事情我现在缺少的调整。我确实浏览了CCTimer update: 方法,唯一突出的是代码中的一些浮点数,我知道在 32/64 位之间可能会出现问题,但没有编译器警告我不知所措。

更新

所以它变得越来越神秘。我买了一台全新的 iPad Air 来在本地而不是在模拟器上进行测试,并且......它可以工作。没有崩溃。用户是否可能只是拥有有缺陷的设备?我注意到在KERN_INVALID_ADDRESS at 0x0000000000000010 处引发了异常,这看起来有些奇怪。我在网上看到的大多数类似的崩溃报告都有完全不同的地址,看起来更加随机。

更新 2

更多谜团。虽然本地版本在设备上运行(通过 XCode 运行),但从 AppStore 实际下载的应用程序确实崩溃了!我能够从设备日志中捕获更多关于它的信息:

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Subtype: KERN_INVALID_ADDRESS at 0x0000000000000010
Triggered by Thread:  0

Thread 0 Crashed:
0   libobjc.A.dylib                 0x0000000196c041d0 objc_msgSend + 16
1                   0x00000001001da820 -[CCTimer update:] + 152
2                   0x00000001001de140 -[CCScheduler update:] + 420
3                   0x00000001001f6b30 -[CCDirectorIOS drawScene] + 172
4   QuartzCore                      0x000000018cf40cb8 CA::Display::DisplayLinkItem::dispatch() + 32
5   QuartzCore                      0x000000018cf40ac4 CA::Display::DisplayLink::dispatch_items(unsigned long long, unsigned long long, unsigned long long) + 296
6   IOKit                           0x000000018b23be70 IODispatchCalloutFromCFMessage + 360
7   CoreFoundation                  0x000000018a2ec8dc __CFMachPortPerform + 188
8   CoreFoundation                  0x000000018a2fae8c __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52
9   CoreFoundation                  0x000000018a2fadec __CFRunLoopDoSource1 + 440
10  CoreFoundation                  0x000000018a2f9010 __CFRunLoopRun + 1616
11  CoreFoundation                  0x000000018a239c1c CFRunLoopRunSpecific + 448
12  GraphicsServices                0x000000018fec9c08 GSEventRunModal + 164
13  UIKit                           0x000000018d36afd8 UIApplicationMain + 1152
14                  0x00000001000f4994 main (main.m:16)
15  libdyld.dylib                   0x00000001971e7a9c start + 0

Thread 1:
0   libsystem_kernel.dylib          0x00000001972c9aa8 kevent64 + 8
1   libdispatch.dylib               0x00000001971cd998 _dispatch_mgr_thread + 48

Thread 2:
0   libsystem_kernel.dylib          0x00000001972c9ca0 mach_msg_trap + 8
1   CoreFoundation                  0x000000018a2fab70 __CFRunLoopServiceMachPort + 180
2   CoreFoundation                  0x000000018a2f8d00 __CFRunLoopRun + 832
3   CoreFoundation                  0x000000018a239c1c CFRunLoopRunSpecific + 448
4   AudioToolbox                    0x0000000189aedabc GenericRunLoopThread::Entry(void*) + 156
5   AudioToolbox                    0x0000000189ade278 CAPThread::Entry(CAPThread*) + 136
6   libsystem_pthread.dylib         0x0000000197363e18 _pthread_body + 164
7   libsystem_pthread.dylib         0x0000000197363d70 _pthread_start + 136
8   libsystem_pthread.dylib         0x0000000197361550 thread_start + 0

Thread 3:
0   libsystem_kernel.dylib          0x00000001972e2e74 __workq_kernreturn + 8
1   libsystem_pthread.dylib         0x0000000197361548 start_wqthread + 0

Thread 4:
0   libsystem_kernel.dylib          0x00000001972e2e74 __workq_kernreturn + 8
1   libsystem_pthread.dylib         0x0000000197361548 start_wqthread + 0

困惑。

【问题讨论】:

  • 有一个非常好的 WWDC 视频关于将您的项目转换为支持 arm64,我目前似乎找不到,但我的猜测是它与 arm64 支持有关。您是否尝试删除 arm64 支持以查看是否可以修复它,至少只是为了知道这将是原因吗?

标签: ios cocos2d-iphone arm64


【解决方案1】:

请务必从您的项目构建设置(架构、有效架构)中删除 arm64,因为 v3 之前的 cocos2d-iphone 与 64 位构建不兼容,即使您没有收到编译器警告/错误。隐藏了一些令人讨厌的潜在问题。

如果您没有收到编译器警告,我认为您的项目/目标中可能根本没有启用 32/64 位兼容性问题警告(特别是 cocos2d-iphone 目标,如果它位于单独的目标中)。在 cocos2d 的 v2.1 库存中,实际上应该有很多这样的警告,尽管它可能取决于您的 iOS 部署目标(对于测试,请尝试将其设置为 iOS 7.1,这将为您提供最多的警告,包括许多“弃用”警告) .

您还可以执行分析构建以指出潜在问题(以及一些错误警报)。

【讨论】:

  • 警告已启用。我使用这里和网络上的一些技巧,自己一个一个地删除了它们。是的,7.1 是项目中的目标。我什至跑了分析看看它是否能想出更多的东西,但它没有。它确实在模拟器中运行得很好。
  • 糟糕,刚刚注意到它吞下了我的部分评论。我是说分析没有显示任何对我来说似乎很重要的东西。它确实在 cocos2d-ios.xcodeproj 子项目中到处显示一些警告,但这些警告似乎与以前没有任何不同,就具体的 64 位内容而言,没有什么特别突出的。好吧,反正对我来说不是,但就像我说的那样,我几乎是个菜鸟。
猜你喜欢
  • 1970-01-01
  • 2017-11-29
  • 1970-01-01
  • 2015-07-26
  • 1970-01-01
  • 1970-01-01
  • 2010-09-16
  • 1970-01-01
  • 2012-10-20
相关资源
最近更新 更多