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级在定义中。
- 退出Xcode
- 在terminal运行:
rm -rf ~/Library/Developer/Xcode/DerivedData/ModuleCache/*
请注意,LNI接受的答案和这一个之间的区别:
- 最好不要撞车而不要撞车。 特别是,当涉及到Xcode进程/组件。
- 我不是苹果开发者,但部分删除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理
我尝试的其他步骤,但没有帮助:
- closuresXcode – >删除派生数据
- 骑自行车机
- “干净”的项目