Наклейки на OSSpinLockLockSlow

Обновление 2: я нашел обходное решение, которое должно синхронизировать MOC-освобождение и сохранение. См. Обновленный проект. https://github.com/shuningzhou/MOCDeadLock.git

Примечание. Я сделал это более агрессивно. Не запускайте его на настоящем устройстве!

Обновление: пример проекта для демонстрации этой проблемы. https://github.com/shuningzhou/MOCDeadLock.git

XCode 6.2: невозможно воспроизвести.

XCode 6.3: Воспроизводимые.

XCode 6.4 beta: Воспроизводимость.

========================== Проблема ===================================================================== =========

Наше приложение случайно закрепилось на OSSpinLockLockSlow после обновления до XCode 6.3. В нашем проекте мы использовали NSOperation и NSOperationQueue для извлечения данных с нашего сервера и использования Core Data для сохранения данных.

Эта проблема никогда не случалась раньше! Из трассировки стека вы можете видеть, что наши коды не звонят. Я не знаю, с чего начать эту отладку. Может ли кто-нибудь дать некоторые рекомендации?

Заранее спасибо!

Посмотрите на трассировку стека введите описание изображения здесь

введите описание изображения здесь

Редактировать:

Мы используем AFNetworking и наши NSOperations являются подклассами AFHTTPRequestOperation . Мы добавили некоторые пользовательские свойства и переопределили метод -(void)start :

 - (void)start; { //unrelated code... NSString *completionQueueID = [NSString uuid]; const char *cString = [completionQueueID cStringUsingEncoding:NSASCIIStringEncoding]; self.completionQueue = dispatch_queue_create(cString, DISPATCH_QUEUE_SERIAL); //unrelated code.... [super start]; } 

Для Core Data мы thread-confinement шаблону thread-confinement . У нас есть отдельный managed object context для каждого потока, а контексты совместно используют статический persistent store coordinator .

Изменить 2:

Дополнительная информация: Я обнаружил, что эта проблема возникает, когда система выходит из нескольких потоков одновременно. Мы сохраняем Контекст управляемого объекта в словаре потоков, и они освобождаются при выходе потоков.

 [[[NSThread currentThread] threadDictionary] setObject:dataManager forKey:@"IHDataManager"]; 

Использование ЦП составляет около 20%. введите описание изображения здесьвведите описание изображения здесь

2 Solutions collect form web for “Наклейки на OSSpinLockLockSlow”

Я столкнулся именно с этой проблемой. В соответствии с вашей трассировкой стека у меня есть куча потоков, остановленных с помощью _OSSpinLockLockSlow.

Похоже, что это ситуация с живиком, когда спрятанные скобы связаны друг с другом. Включая некоторые сетевые потоки и основные данные. Но, как заметил Роб, симптомы livelock должны включать в себя высокие загрузки процессора (все шпильки все бесконечно вращаются). В моем случае (и в вашем) это не так, потребление процессора низкое – симулятор «процентов используется» 20%, симулятор в целом на мониторе активности 0,6% – так что, возможно, это тупик 😉

Как и вы, я использую шаблон ограничения потока, отдельный контекст управляемого объекта в потоке, одно постоянное хранилище.

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

Это заставило меня задуматься, почему у меня так много потоков. Оказалось, что я использую gcd с параллельной фоновой очередью:

  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0),^{ modelClass = [WNManagedObject classForID:mongoID]; dispatch_async(dispatch_get_main_queue(),^{ ... }); }); 

Этот фрагмент является частью некоторого кода синтаксического анализа сети / JSON. «classForID» вызывал незначительные колебания пользовательского интерфейса в основном потоке, поэтому я это сделал.

По сути, параллельная фоновая очередь выплевывала целую кучу короткоживущих потоков. Это было совершенно не нужно. Рефакторинг в качестве одной последовательной очереди фиксировал излишки потоков, которые избавились от проблемы спин-блокировки. Наконец, я понял, что мне не нужен класс, поэтому этот код был изгнан.

Проблема исправлена, но нет объяснений, почему это должно внезапно стать проблемой с 8.3

Я подозреваю, что в этом вопросе затрагивается одна и та же проблема (хотя Cocoalumberjack получает там вину):
syscall_thread_switch iOS 8.3 race – ошибка CocoaLumberjack? как отладить это?

.. и в этом отчете об ошибке Cocoalumberjack
https://github.com/CocoaLumberjack/CocoaLumberjack/issues/494

Я также использую CocoaLumberjack, но он не работает ни в одном из проблемных потоков, поэтому я считаю, что это красная селедка. Основная причина, по-видимому, заключается в создании избыточных потоков.

Я видел проблему в симуляторе и на устройствах, привязанных к XCode, но я не испытывал этого при работе независимо от XCode. Это новичок в iOS 8.3 / XCode 6.3.1

На самом деле это не ответ, больше дневник моего обходного пути для этой странной проблемы, но, может быть, вы найдете это полезным.

Если вопрос по-прежнему актуальный – это ошибка в iOS: отчет о сбое OpenRadar
Также вы можете найти это сообщение в блоге полезным: сообщение в блоге

Я думаю, вы должны заменить OSSpinLocks чем-то другим, чтобы исправить это в своем приложении.

Мы столкнулись с этой ошибкой в ​​нашей игре Unity3d. Мы еще не зафиксировали это в нашем приложении, потому что у нас нет доступа к большинству родных iOS-кодов (мы пишем нашу игру на C #, и мы используем много плагинов для родных 3-х сторонних разработчиков). Поэтому я не могу рекомендовать вам что-то конкретное относительно замены OSSpinLock. Извините за мой английский.

Обновить
Многие фреймворки и библиотеки Apple используют OSSpinLock внутренне, поэтому вам не нужно использовать его для выполнения этой проблемы.

  • MPVolumeView не отображается в iOS Simulator
  • Получение ошибок компилятора Swift
  • Xcode 6.3 сбой при переименовании проекта
  • У приложений WatchKit должен быть установлен целевой уровень развертывания, равный iOS 8.2 (был 8.3)?
  • Проблема с предупреждением Open Settings в Xcode 6.3: Сравнение адреса «UIApplicationOpenSettingsURLString», не равное нулевому указателю, всегда истинно
  • XCode 6.3.1 - частое соединение с подключенным устройством
  • Изображения, не показанные на Apple Watch
  • BreakPoints не работают в Swift в Xcode 6.3
  • Ошибка встроенной двоичной проверки валидации
  • Имитаторы Xcode-имитатора для iOS-версий, превращенные в хэши
  • Раскадровка, что означает тег <анимация />?
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.