SourceKitService 消耗 CPU 并停止 Xcode

这不是测试版的问题。我用的是 Xcode 6.0.1,产品发布版。我遇到的问题是,当我尝试构建或运行我正在处理的代码时,Xcode 会在很长一段时间内没有响应,而 SourceKitService 消耗了400% 以上的 CPU (根据 Activity Monitor)。这个问题是最近几天才出现的,但奇怪的是,自从 Xcode 6.0在9月17日正式发布以来,我一直在使用它。我升级到了6.0.1,希望它能够修复这个问题。

知道是什么问题吗?

49812 次浏览

今天下午早些时候 Xcode 6.1.1遇到了这个问题(不是 beta,是官方发布的版本)。我一直在运行操场上的一些代码,并怀疑这是原因。CPU 被固定为接近100% ,Xcode 无法完成构建。

我是这么做的:

1. 打开“活动监视器”,显示 SourceKitService 是主要的 CPU 占用者。

2. Within "Activity Monitor", double-clicked on the SourceKitService and clicked on "Open Files and Ports" section, which showed it was working on files under the /Users/myname/Library/Developer/Xcode/DerivedData/ModuleCache/ directory for a specific folder.

3. Deleted the specified folder (from a command-line, using rm -rf). The cache is regenerated based on 我可以安全地删除 Xcode 派生数据文件夹的内容吗? .

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

5. 重复步骤3.

Mac 又恢复平静了。没有数据丢失,Xcode 甚至不需要重新启动(我曾经尝试过,但是失败了)。底线是 ModuleCache 似乎在循环使用 SourceKitService,而删除文件夹似乎可以修复它。希望这对你也有用。

Bootnote: < p > 顺便说一下,SourceKitService 问题的原因是我在 Swift 类中的数组声明太长了。我在一个数组中有超过200个条目。减少到30,错误消失了。因此,这个问题可能是由于苹果代码中的某种堆栈溢出(双关语)引起的。

I was seeing the problem because I was declaring an array with about 60 elements that looked like this:

let byteMap = [


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

通过像下面这样显式地注释类型:

let byteMap : [String: (Int, Int)] = [


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

我能让它停下来。我认为它一定与 Swift 的类型推断和类型检查有关,当遇到较长的数组时,它会进入一个循环。

This was in Xcode 6.2. I also deleted the ModuleCache as described above and now everything is good.

我解决了导致 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)

当被替换时,它工作得很好(没有内存积累和正常的 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

对我来说,删除衍生数据是有效的。从菜单中选择“ Product”,按住 Alt 键并选择“ Clean Build Folder”。快捷键: Alt + Shift + Command + K

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

解决方案是实现一个协议的方法,我的类在定义中有这个方法。

这个问题发生了大约10次,8次,它发生在我连接一个实际的设备时,没有通过模拟器运行。

我不知道我的解决方案是否是一个好的,但对我来说,我相信问题是由于模拟器和实际设备之间的切换。这可能听起来很奇怪,但它好像正在创建 缓存文件之间的干扰

What solved my problem:

  • 清除构建文件夹: (对于 Xcode) Alt + Shift + Command + K
  • 重置内容和设置: (on 模拟器) Command + Shift + K
  • 等待时间比正常时间稍长,并且不断单击会重载 Xcode

所以基本上在你尝试运行任何新设备之前,只需删除任何缓存。

剪辑

我只是在没有任何设备连接的情况下出了问题。我只是退出 Xcode,再次打开它,问题就解决了。不知道我的 猜猜看是否可能是一些重新索引的问题后,你取/拉合并新代码。

这在 xcode Version 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]
  1. 退出 Xcode
  2. Run in Terminal:

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


请注意 LNI 公认的答案和这个答案之间的区别:

  1. 不崩溃总比崩溃好,特别是在 Xcode 进程/组件方面。
  2. 我不是苹果的开发者,但是部分删除缓存会破坏它的完整性。在清理了所有的缓存之后,我没有注意到任何明显的延迟。

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

按照@LNI 的建议,在重新启动 SourceKitService之后,我清除了 /Users/myname/Library/Developer/Xcode/DerivedData/ModuleCache/中的所有缓存,并对代码应用了一些修改:

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 }

From

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

As result compile time - 3 min, not so fast but better for 42 min.

因此,在 SourceKitService之前——取走约5.2 Gb 的内存,之后——取走约0.37 Gb 的内存

enter image description here

我在使用 XCode8.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 +

我花了一个多小时才找到它,我希望能节省一些别人的时间。 我向苹果公司提交了一份漏洞报告,编号是30103533

目标 C 项目:

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

我在这里尝试了所有其他的解决方案,但没有一个奏效——最终为我解决的是在恢复模式下重启计算机并运行磁盘修复程序。我终于可以安心工作了!

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

在将项目迁移到 Swift 3之后,我也遇到了同样的问题,找到了一个解决方案,因为没有数据类型而创建的字典和数组花费了很多时间。

当我不小心声明一个从自身继承的类时,此行为出现在我的项目中。Xcode 8.2.1,使用 Swift 3。

我也有这个问题,在我的例子中,我声明了一个像这样的大数组:

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

我解决这个问题的方法是每行添加一个项目,而不是同时添加所有项目:

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

这就解决了问题。

我在 SourceKitService 也遇到过同样的问题。

我解决了,永远不要用 FOR 循环添加子视图。

为了检测问题,我使用: Https://github.com/robertgummesson/buildtimeanalyzer-for-xcode

我在 Xcode 8.2.1中遇到了类似的问题——通过/* */注释掉了1,000多行代码。注释掉节导致了这个问题,删除注释掉的代码就解决了这个问题。

不要在没有指定数据类型或者使用[ String: Any ]的情况下,以迅速方式创建 dictionary

If we use 'Any' type the compiler might run into an infinite loop for checking the data type.

它不会产生任何编译错误,它会让我们的 Mac 在“编译快速源文件”时僵住,并为“快速”和“ SourceKitService”任务获取大量内存。

I ran into something similar combining multiple ?? operators to provide a default for optional string values.

我正在试验下面的调试代码时,我可靠的2010年中期 MacBook Pro 的风扇开始努力运行。SourceKitService 正在吸收每一个 CPU 周期。对冒犯行进行评论和取消评论,可以清楚地看出 SourceKitService 被什么东西噎住了。看起来好像用了不止一个?操作符提供默认值是旧机器上的一个问题。只要别做就行了。把它分成多个任务,这使得一些难看的调试代码更加难看。

PlaceMark 是 CLPlacemark 的一个实例。

I was using Xcode Version 8.3.2 (8E2002) running on OS 10.12.4 (16E195)

// 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 ?? "")

将长数组转换为函数似乎解决了我的问题:

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

to:

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

我遇到过这样的问题。源工具包服务使用了10gb 的使用量。活动监视器中的快速流程超过6GB 的使用量。我使用了以下代码:

Var Details: [ String: Any ] = [“1”: 1, "2":2, “3”: 3, 4:4, “5”: 5, 6:6, 7:7, 8:8, "9":9, 十点十分, “11”: 11, “12”: 12, "13":13, "14":14, “15”: 15, “16”: 16]

I have changed code to following to solve this issue:

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

详情[“1”] = 1

详情[“2”] = 2

details["3"] = 3

详情[“4”] = 4

详情[“5”] = 5

详情[“6”] = 6

详情[“7”] = 7

详情[“8”] = 8

详情[“9”] = 9

详情[“10”] = 10

details["11"] = 11

详情[“12”] = 12

详情[“13”] = 13

详情[“14”] = 14

详情[“15”] = 15

详情[“16”] = 16

I've been running into this issue with Xcode 9, and explored several solutions. For me, disabling Source Control seemed to do the trick.

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

如果这不起作用,我建议在 晚期使用 Renice命令

禁用源代码管理

Other steps that I attempted, but did not help:

  1. 关闭 Xcode-> 删除派生数据
  2. 循环机
  3. “清洁”计划

在终点站运行:

killall Xcode
rm -rf ~/Library/Developer/Xcode/DerivedData/ModuleCache
open /Applications/Xcode.app

您还可以使用这个别名创建一个终端命令:

echo alias xcodeFix='killall Xcode;rm -rf ~/Library/Developer/Xcode/DerivedData/ModuleCache;open /Applications/Xcode.app' >> ~/.profile
source ~/.profile

然后就跑

xcodeFix

这个问题在 XCode 10.0中仍然存在。您可以通过在源代码管理选项中禁用“显示源代码管理更改”来修复它。

enter image description here

https://www.logcg.com/en/archives/2209.html

SourceKitService took charge of Swift's type inference work.

private lazy var emojiFace = ["?", "?", "?", "?"]

改为显式类型

private lazy var emojiFace:[String] = ["?", "?", "?", "?"]

SourceKitServiceCPU 使用率立即下降。

在 XCode 11.4.1中,我在 SwiftUI@ViewBuilder 块中调用@DynamicMemberLookup 下标时碰到了这种情况。

我有同样的问题,它是由一个编程错误造成的。

In my case I was implementing the comparable and equatable protocols and the lhs.param and rhs.param did not correspond with parameters of the lhs and rhs classes.