IOS 9 Сбой в _prepareForCAFlush с EXC_BAD_ACCESS KERN_INVALID_ADDRESS

С выпуском 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)

Ответы

Ответ 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

Для меня проблема заключалась в том, что я показывал и отклонял клавиатуру, когда приложение было сведено к минимуму.

    [self.textView becomeFirstResponder];
    [self.textView resignFirstResponder];

Я выполнил вышеуказанный код в событии applicationWillResignActive. удалив этот код, исправил сбой.

Ответ 3

Я тоже сталкиваюсь с этой проблемой, и я думаю, что нашел то, что может вызвать ее. Вы, ребята, случайно используете SDWebImage? Потому что это единственное место, где я обнаружил, что CFRunLoopRun() вызывается, а также другие люди жаловались: Dead thread ticket → Ошибка приложения

Ответ 4

Кажется, это касается только устройств с 32-разрядными процессорами A5 и A6 - iPod 5th Gen, iPhone 4S/5/5C, iPad 2/Mini). На нашей стороне тоже не воспроизводится. Эти сбои начались и ускорились с выпуском и внедрением iOS 9. iOS v9.0.1, похоже, не исправляет его.