我在这里发帖希望获得更有经验的程序员的建议(一般来说,特别是 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
莫名其妙。