iOS 9在_prepareForCAFlush中崩溃与EXC_BAD_ACCESS KERN_INVALID_ADDRESS

时间:2015-09-21 18:42:31

标签: ios iphone ipad ios9

随着iOS 9的发布,我们看到了几个崩溃报告,这些报告似乎是Apple在iOS 9中出现的一个错误。这种情况发生在各种设备类型(iPhone,iPad和iPod)上。我想找出为什么会发生这种情况,如果有什么我可以做的解决它。我们的崩溃报告系统(Crashlytics)正在报告这个堆栈,所以不幸的是我没有可重现的步骤或代码,但我会尽力回答任何问题。堆栈如下:

Thread : Crashed: com.apple.main-thread
0  libobjc.A.dylib                0x34a27ad6 objc_msgSend + 21
1  CoreFoundation                 0x230d3db9 -[__NSArrayM dealloc] + 148
2  libobjc.A.dylib                0x34a34f67 objc_object::sidetable_release(bool) + 150
3  libobjc.A.dylib                0x34a353a9 (anonymous namespace)::AutoreleasePoolPage::pop(void*) + 388
4  CoreFoundation                 0x230cbfa9 _CFAutoreleasePoolPop + 16
5  UIKit                          0x27523cd9 _prepareForCAFlush + 312
6  UIKit                          0x2752886b _beforeCACommitHandler + 10
7  CoreFoundation                 0x2317a509 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 20
8  CoreFoundation                 0x2317880d __CFRunLoopDoObservers + 280
9  CoreFoundation                 0x23178c3f __CFRunLoopRun + 958
10 CoreFoundation                 0x230cc249 CFRunLoopRunSpecific + 520
11 CoreFoundation                 0x230cc035 CFRunLoopRunInMode + 108
12 GraphicsServices               0x2c182ad1 GSEventRunModal + 160
13 UIKit                          0x272e18a9 UIApplicationMain + 144
14 APPNAMEHERE                    0x000ec967 main (main.m:14)

4 个答案:

答案 0 :(得分:2)

对我来说,问题是当应用程序最小化时我正在显示和解除键盘。

SET foreign_key_checks = 0;

我在applicationWillResignActive事件上执行了上述代码。 删除此代码修复了崩溃。

答案 1 :(得分:1)

我们遇到了类似堆栈跟踪的崩溃,经过长时间的调查,我们发现它与其他崩溃有关;修复也解决了这个问题,但是我仍然不确定这两起崩溃是如何相关的。

以下是其他崩溃的详细信息:

我们在一个方法中有一个函数调用,比如

AudioServicesAddSystemSoundCompletion(self.soundID,  
                                      [[NSRunLoop currentRunLoop] getCFRunLoop],  
                                      kCFRunLoopDefaultMode,  
                                      AudioServicesSystemSoundCompletion,  
                                      (void *)CFBridgingRetain(self)); 

AudioServicesSystemSoundCompletion看起来像

void AudioServicesSystemSoundCompletion(SystemSoundID ssID,  void *clientData) {  
     AudioServicesRemoveSystemSoundCompletion(ssID);  
     CFRelease(clientData);  
}

同时执行该函数调用两次或多次导致应用程序崩溃。我们通过传递NULL而不是(void *)CFBridgingRetain(self)并删除CFRelease(clientData)来修复此问题。线。

自此修复以来,我们再也看不到“_prepareForCAFlush”崩溃了。

另请注意,根据Crashlytics的说法,每次崩溃时设备的内存使用量都非常高。

希望这有帮助!

答案 2 :(得分:1)

我也面临这个问题,我认为我找到了可能导致它的原因。 你们有没有机会使用SDWebImage? 因为那是我发现CFRunLoopRun()被调用的唯一地方,而且其他人抱怨: Dead thread ticket -> App Crash

答案 3 :(得分:-4)

似乎只影响具有32位处理器A5和A6的设备 - iPod 5th Gen,iPhone 4S / 5 / 5C,iPad 2 / Mini)。 在我们这边也没有责备。 随着iOS 9的发布和采用,这些崩溃开始并逐渐增加。 iOS v9.0.1似乎无法修复它。