应用程序坚持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:可重复使用。

========================== 问题 ====================== =========

升级到XCode 6.3后,我们的应用程序随机停留在OSSpinLockLockSlow 。 在我们的项目中,我们使用NSOperationNSOperationQueue从我们的服务器获取数据,并使用Core Data进行数据持久化。

这个问题从来没有发生过! 您可以从堆栈跟踪中看到,我们的代码没有进行任何调用。 我不知道从哪里开始debugging。 有人能提供一些指导吗?

先谢谢你!

请参阅堆栈跟踪 在这里输入图像说明

在这里输入图像说明

编辑:

我们正在使用AFNetworking ,我们的NSOperationsNSOperations的子类。 我们添加了一些自定义属性并覆盖了方法-(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模式。 我们为每个线程分别managed object context ,上下文共享一个静态persistent store coordinator

编辑2:

更多信息:我发现当系统同时退出多个线程时会发生这个问题。 我们将被pipe理对象上下文存储在线程字典中,当线程退出时它们被释放。

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

CPU使用率约为20%。 在这里输入图像说明在这里输入图像说明

我一直在体验这个问题。 根据你的堆栈跟踪,我有一堆线程与_OSSpinLockLockSlow停滞。

似乎是与自旋链锁在一起的活泼的情况。 包括一些networking线程和核心数据。 但是正如Rob所指出的那样,活锁的症状应该包括高CPU使用率(自旋锁都是不停地旋转的)。 在我的情况(在你的情况),情况并非如此,CPU使用率低 – 模拟器“使用百分比”20%,模拟器整体在活动监视器0.6% – 所以也许是一个僵局;-)

像你一样,我正在使用线程约束模式,每个线程单独pipe理对象上下文,单个持久存储。

遵循你的观察,这个挂起总是似乎跟随一堆线程的释放,我检查了这个行为,并且可以确认是这种情况。

这让我想知道为什么我有这么multithreading活跃。 事实certificate,我正在使用gcd与并发背景队列:

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

这个片段是一些networking/ JSONparsing代码的一部分。 “classForID”在主线程中引起轻微的UI抖动,所以我将它背景化。

实际上,并发背景队列正在吐出一大堆短命的线程。 这完全没有必要。 重构为一个单一的串行队列修复了线程过度,从而摆脱了自旋锁问题。 最后我意识到我根本不需要上课,所以这段代码已经被驱除了。

问题固定了,但没有解释为什么这个应该突然成为8.3的问题

我怀疑同样的问题在这个问题上被触及(尽pipeCocoaumberjack在那里受到指责):
syscall_thread_switch iOS 8.3比赛 – CocoaLumberjack的错误? 如何debugging呢?

..在这个Cocoalumberjack错误报告
https://github.com/CocoaLumberjack/CocoaLumberjack/issues/494

我也在使用CocoaLumberjack,但是它不会在任何问题线程中出现,所以我认为这是一个红鲱鱼。 根本原因似乎是多余的线程创build。

我在模拟器和设备上看到了XCode的问题,但是在独立运行XCode的时候我还没有经历这个问题。 在iOS 8.3 / XCode 6.3.1中对我来说是新的

不是一个真正的答案,更多的是我自己的解决方法这个奇怪的问题的日记,但也许你会发现它是有用的。

如果问题仍然存在 – 这是iOS中的一个错误: OpenRadar崩溃报告
你也可以find这个博客文章有用: 博客文章

我认为你应该用别的东西replaceOSSpinLocks来解决你的应用程序。

我们在Unity3d游戏中遇到了这个错误。 我们没有在我们的应用程序中修复这个问题,因为我们无法访问大部分的本地iOS代码(我们在C#上编写游戏,并且使用了很多第三方本机插件)。 所以我不能推荐你更换OSSpinLock的具体内容。 对不起我的英语不好。

更新
许多Apple框架和库在内部使用OSSpinLock,所以您不需要使用它来显示这个问题。