SourceKitService消耗CPU和研磨Xcode暂停

这不是一个testing版问题。 我在Xcode 6.0.1上正式发布。 我遇到的问题是,当我尝试构build或运行我正在处理的代码时,Xcode在很长一段时间内变得无响应,并且SourceKitService消耗了400%以上的CPU(根据活动监视器)。 这个问题在过去几天是新的,但奇怪的是,自从它在9月17日正式发布以来,我一直在使用Xcode 6.0。我升级到了6.0.1,希望能够解决这个问题。

任何想法可能是什么问题?

Xcode 6.1.1在今天下午早些时候遇到了这个问题(不是beta,官方发布的版本)。 我一直在Playground上运行一些代码,并怀疑这是事业的原因。 CPU盯住了近100%,Xcode无法完成构build。

所以这就是我所做的:

1.打开“Activity Monitor”,显示SourceKitService为主CPU。

2.在“活动监视器”中,双击SourceKitService并单击“打开文件和端口”部分,显示它正在处理/ Users / myname / Library / Developer / Xcode / DerivedData / ModuleCache /目录下的文件为特定的文件夹。

3.删除指定的文件夹(从命令行使用rm -rf)。 caching重新生成的基础上我可以安全地删除Xcode派生数据文件夹的内容? 。

4.再次使用活动监视器,强制退出SourceKitServer。 看到Xcode中现在所有太熟悉的标志,说SourceKitService已经崩溃(所以这就是为什么SourceKitService听起来很熟悉!)。

5.重复步骤3。

Mac又和平了。 没有数据丢失,Xcode甚至不必重新启动(我曾尝试失败)。 底线是ModuleCache似乎是在一个循环中获取SourceKitService并删除该文件夹似乎修复它。 希望这也适用于你。

Bootnote:

顺便说一句,SourceKitService问题的原因是我在Swift类中有太长的数组声明。 我在一个数组中有超过200个条目。 减less到30,错误消失。 所以这个问题可能是由于苹果代码中的某种堆栈溢出引起的(双关意图)。

我看到了这个问题,因为我正在声明一个包含大约60个元素的数组,看起来像这样:

let byteMap = [ ["ECG" : (0,12)], ["PPG" : (12,3)], ["ECG" : (15,12)], ["PPG" : (27,3)], ["ECG" : (30,12)] 

通过明确地注释这样的types:

 let byteMap : [String: (Int, Int)] = [ ["ECG" : (0,12)], ["PPG" : (12,3)], ["ECG" : (15,12)], ["PPG" : (27,3)], ["ECG" : (30,12)], 

我能够让它停止。 我认为它必须与Swift的types推断和types检查有关,当它遇到一个很长的数组时,它会进入循环。

这是在Xcode 6.2中。 我也如上所述删除了ModuleCache,现在一切都很好。

这个问题发生了10次,是连接实际设备时发生的8次,并没有通过模拟器运行。

我不太确定,如果我的解决scheme是一个好的,但对我来说,我相信这个问题是由于模拟器和实际设备之间的切换。 这听起来很奇怪,但好像是在创buildcaching文件之间的干扰

什么解决了我的问题:

  • 清理生成文件夹:(在Xcode上) Alt + Shift + Command + K
  • 重置内容和设置:(在模拟器上) Command + Shift + K
  • 等待比正常长一点点,并持续点击重载Xcode

所以基本上在你尝试在任何新设备上运行之前,只要删除任何caching即可。

编辑

我只是没有任何设备连接的问题。 我刚刚退出Xcode并再次打开,问题就没有了。 不确定我的猜测是在你提取/拉取合并新代码后,可能会出现一些重新索引的问题。

我解决了另一个导致SourceKitService使用高达13GB内存的问题…

我有string(带有很多参数的格式行:

 return String(format: "%d,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f", samples.count,sum1.x,sum1.y,sum1.z,sum1.rx,sum1.ry,sum1.rz,sum2.x,sum2.y,sum2.z,sum2.rx,sum2.ry,sum2.rz,sum3.x,sum3.y,sum3.z,sum3.rx,sum3.ry,sum3.rz) 

当它被replace它工作正常(没有内存build立和正常的CPU消耗)

  var output: String = "" output += String(format: "%d,", samples.count) output += String(format: "%.3f,%.3f,%.3f,", sum1.x, sum1.y, sum1.z) output += String(format: "%.3f,%.3f,%.3f,", sum1.rx, sum1.ry, sum1.rz) output += String(format: "%.3f,%.3f,%.3f,", sum2.x, sum2.y, sum2.z) output += String(format: "%.3f,%.3f,%.3f,", sum2.rx, sum2.ry, sum2.rz) output += String(format: "%.3f,%.3f,%.3f,", sum3.x, sum3.y, sum3.z) output += String(format: "%.3f,%.3f,%.3f", sum3.rx, sum3.ry, sum3.rz) return output 

对我来说,它删除了派生数据。 从菜单中select“产品”,按住Alt键并select“清理生成文件夹”。 快捷键:Alt + Shift + Command + K

我花了4个小时在我的项目的长篇汇编中找出问题。 第一次尝试需要42分钟才能编译。

我清除了/Users/myname/Library/Developer/Xcode/DerivedData/ModuleCache/所有caching, /Users/myname/Library/Developer/Xcode/DerivedData/ModuleCache/所build议的,重启SourceKitService并对代码进行一些更改:

1)到

  var initDictionary:[String:AnyObject] = [ "details" : "", "duration" : serviceDuration, "name" : serviceName, "price" : servicePrice, "typeId" : typeID, "typeName" : typeName, "url" : "", "serviceId" : serviceID, "imageName" : "" ] 

  var initDictionary= [ "details" : "", "duration" : serviceDuration, "name" : serviceName, "price" : servicePrice, "typeId" : typeID, "typeName" : typeName, "url" : "", "serviceId" : serviceID, "imageName: "" ] 

2)到

  if let elem = obj.property, let elem2 = obj.prop2, etc { // do stuf here } 

  let value1 = obj.property ?? defaultValue 

3)

  let serviceImages = images.filter { $0.serviceId == service.id } let sorted = serviceImages.sort { $0.sort > $1.sort } 

  let serviceImages = images.filter { $0.serviceId == service.id }. sort { $0.sort > $1.sort } 

作为结果编译时间 – 3分钟,没有那么快,但更好的42分钟。

结果,在SourceKitService之前 – 取〜5,2Gb的内存和〜0.37Gb之后

在这里输入图像说明

不要在swift中创build字典而不指定数据types或使用[String:Any]

如果我们使用“任何”types的编译器可能会运行一个无限循环来检查数据types。

它不会产生任何编译错误,它将使我们的Mac冻结在“编译swift源文件”,并获取了很多内存,用于名为“swift”和“SourceKitService”的任务。

我遇到过这样的问题。 源代码包服务正在使用10 GB的使用。 活动监视器中的Swift进程可达6 GB以上。 我正在使用以下代码:

var的详情:[String:Any] = [“1”:1,“2”:2,“3”:3,“4”:4,“5”:5,“6”:6,“7” 7“8”8“9”9“10”10“11”11“12”12“13”13“14”14“15” “16”:16]

我已将代码更改为以下来解决此问题:

var details:[String:Any] = [:]

细节[“1”] = 1

细节[“2”] = 2

细节[“3”] = 3

细节[“4”] = 4

细节[“5”] = 5

细节[“6”] = 6

细节[“7”] = 7

细节[“8”] = 8

细节[“9”] = 9

细节[“10”] = 10

细节[“11”] = 11

细节[“12”] = 12

细节[“13”] = 13

细节[“14”] = 14

细节[“15”] = 15

细节[“16”] = 16

Xcode 7.2 (7C68)上面对同样的问题

解决scheme是实现一个协议的方法,我的class级在定义中。

  1. 退出Xcode
  2. 在terminal运行:

rm -rf ~/Library/Developer/Xcode/DerivedData/ModuleCache/*


请注意,LNI接受的答案和这一个之间的区别:

  1. 最好不要撞车而不要撞车。 特别是,当涉及到Xcode进程/组件。
  2. 我不是苹果开发者,但部分删除caching可能会破坏其完整性。 清理所有caching后,我没有注意到任何明显的延迟。

这在xcode版本7.3.1(7D1014)中仍然是一个问题,对于我来说,像LNI指出的那样,是一个太长的数组,实际上并没有这么长时间。 我解决了我的问题,把数组分解成如下所示的各种数组:

 let firstLevel = [ [1, 0, 1, 0, 1], [0, 0, 0, 0, 0], [1, 0, 1, 0, 1], [0, 0, 0, 0, 0], [1, 0, 1, 0, 1], [0, 0, 0, 0, 0] ] let secondLevel = [ [0, 0, 0, 0, 0], [0, 1, 0, 1, 0], [0, 0, 0, 0, 0], [0, 1, 0, 1, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0] ] let thirdLevel = [ [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 1, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0] ] let map = [firstLevel, secondLevel, thirdLevel] 

我有与XCode 8.2.1(8C1002)和下面的代码相同的问题:

 import UIKit import AVFoundation import Photos import CoreMotion import Foundation class TestViewController: UIViewController { let movieFileOutput = AVCaptureMovieFileOutput() var anz_total_frames = 0, anz_total_miss = 0 @IBOutlet weak var tfStatistics: UITextView! func showVideoStatistics() { let statisticText:String = "frames: \(self.anz_total_frames)" + String.newLine + "frames/s: \(self.anz_total_frames / self.movieFileOutput.recordedDuration.seconds)" + String.newLine + "miss: " + formatText4FramesPercent(self.anz_total_miss) + String.newLine + "nicht erkannt: " + formatText4FramesPercent(self.anz_total_miss) + String.newLine + "nicht erkannt: " + formatText4FramesPercent(self.anz_total_miss) + String.newLine + "nicht erkannt: " + formatText4FramesPercent(self.anz_total_miss) + String.newLine + "nicht erkannt: " + formatText4FramesPercent(self.anz_total_miss) + String.newLine + "nicht erkannt: " + formatText4FramesPercent(self.anz_total_miss) + String.newLine + "nicht erkannt: " + formatText4FramesPercent(self.anz_total_miss) + String.newLine + "nicht erkannt: " + formatText4FramesPercent(self.anz_total_miss) + String.newLine + "nicht erkannt: " + formatText4FramesPercent(self.anz_total_miss) + String.newLine + "nicht erkannt: " + formatText4FramesPercent(self.anz_total_miss) + String.newLine + "nicht erkannt: " + formatText4FramesPercent(self.anz_total_miss) + String.newLine self.tfStatistics.text = statisticText } func formatText4FramesPercent(_ anz:Int) -> String { let perc = Double(anz)*100.0/Double(anz_total_frames) return String(perc.format(".1") + "%") } } 

和这些扩展名:

 extension String { var localized: String { return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "") } static var newLine: String { return "\r\n" } } extension Int { func format(_ f: String) -> String { return String(format: "%\(f)d", self) } } extension Double { func format(_ f: String) -> String { return String(format: "%\(f)f", self) } } 

我通过在TestViewController中注释这一行来解决它:

  "frames/s: \(self.anz_total_frames / self.movieFileOutput.recordedDuration.seconds)" + String.newLine + 

花了我一个多小时才find它,希望能节省一些别人的时间。 我向苹果公司提交了一个编号为30103533的错误报告

我将项目迁移到swift 3后面临同样的问题,找出解决scheme,因为字典和数组创build没有数据types是花费时间。

这个行为出现在我的项目中的时候,我不小心宣布了一个自己inheritance的类。 Xcode 8.2.1,使用Swift 3。

我也有这个问题,在我的情况下,我是这样宣布一个大数组:

 var myArray: [(String, Bool?)]? myArray = [("someString", someBool), ("someString", someBool), ("someString", someBool), ("someString", someBool), ("someString", someBool) . . ("someString", someBool)] 

我解决了这个问题,每行添加1个项目,而不是同时添加所有项目。

 var myArray = [(String, Bool?)]() myArray.append(("someString", someBool)) myArray.append(("someString", someBool)) myArray.append(("someString", someBool)) myArray.append(("someString", someBool)) myArray.append(("someString", someBool)) . . . 

这解决了这个问题。

对于Objective-C项目:

我有同样的问题,我们的项目中没有Swift代码,所以它不是types推断检查器。

我尝试了所有其他的解决scheme,没有任何工作 – 最后修复它为我是在恢复模式下重新启动计算机,并运行磁盘修复。 我终于可以再次和平地工作了!

我猜这是因为一些破坏的符号链接,可能指向对方,使服务在无尽的循环运行。

我在Xcode 8.2.1中遇到类似的问题 – 通过/ * * /注释掉了1000多行代码。 注释掉引起问题的部分,并删除注释掉的代码。

我有与SourceKitService相同的问题。

我解决了。 不要为了循环而添加子视图。

要检测我使用的问题: https : //github.com/RobertGummesson/BuildTimeAnalyzer-for-Xcode

我遇到了类似的结合多个? 运算符提供可选string值的默认值。

我正在试验下面的debugging代码,当我可靠的2010年中期MacBook Pro上的粉丝开始努力运行。 SourceKitService正在吸收它可能获得的每个CPU周期。 评论和取消注释这条违规的线条使得SourceKitService非常清楚什么是令人窒息的。 它看起来像使用多个? 运营商提供一个默认是在旧机器上的问题。 解决方法就是不要这样做。 将其分解成多个分配,这使得一些丑陋的debugging代码更加丑陋。

placeMark是CLPlacemark的一个实例。 这里使用的属性返回可选的string。

我正在使用在OS 10.12.4(16E195)上运行的Xcode版本8.3.2(8E2002)

 // one term is not an issue let debugString1 = (placeMark.locality ?? "") // two terms pushes SourceKitService CPU use to 107% for about 60 seconds then settles to 0% let debugString1 = (placeMark.locality ?? "") + ", " + (placeMark.administrativeArea ?? "") // three terms pushes SourceKitService CPU use to 187% indefinitely let debugString1 = (placeMark.locality ?? "") + ", " + (placeMark.administrativeArea ?? "") + (placeMark.postalCode ?? "") // ugly but it's safe to use var debugString1 = placeMark.locality ?? "" debugString1 = debugString1 + ", " + (placeMark.administrativeArea ?? "") debugString1 = debugString1 + " " + (placeMark.postalCode ?? "") 

将长arrays转换为函数似乎为我解决了这个问题:

 var color: [UIColor] { return [ UIColor(...), UIColor(...), ... ] } 

至:

 func color() -> [UIColor] { return [ UIColor(...), UIColor(...), ... ] } 

我已经遇到了与Xcode 9这个问题,并探讨了几个解决scheme。 对我来说, 禁用源代码pipe理似乎有诀窍。

Xcode -> Preferences -> Source Control -> uncheck "Enable Source Control"

如果这不起作用,我会build议在terminal上使用renice命令。 更多在这里

禁用源代码pipe理

我尝试的其他步骤,但没有帮助:

  1. closuresXcode – >删除派生数据
  2. 骑自行车机
  3. “干净”的项目