SourceKitService消耗CPU并将Grinds暂停


109

这不是Beta版问题。我使用的是Xcode 6.0.1,正式版。我遇到的问题是,当我尝试构建或运行我正在处理的代码时,Xcode长时间不响应,并且SourceKitService消耗了超过400%的CPU(根据Activity Monitor)。尽管奇怪的是,自从9月17日正式发布以来,我一直在使用Xcode 6.0,但是最近才升级到6.0.1,希望它包含针对此问题的修复程序。

关于可能的问题有什么想法?


您检查内存消耗了吗?我已经有一段时间没有这个问题了,但是在Beta中确实很糟糕,因为它将消耗所有RAM,然后消耗HCF。通常是由于较长的算术行数,尤其是下标。您将需要分而治之,以找到违规(但合法)的代码。找到该行后,请尝试在Playground中进行复制,然后提交错误报告。
克里斯·康诺佛


您仍然可以在Apple开发者论坛的多个线程中阅读一些已知的错误。Xcode 6.1 Beta 3解决了较高的CPU消耗,但引入了不同的CPU消耗。非常失望。
克拉斯2014年

1
我有一个类似的问题。我在Xcode 7和8上都有这个问题。唯一改变的是Xcode附带的代码。我的猜测是重新索引或新代码是根本原因。当您从上游提取代码时,通常会发生这种情况吗?
亲爱的

Answers:


151

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

所以这就是我所做的:

1.打开“活动监视器”,其中将SourceKitService显示为主要的CPU。

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

3.删除指定的文件夹(使用rm -rf从命令行删除)。根据以下内容重新生成缓存:是否可以安全删除Xcode Derived数据文件夹的内容?

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

5.重复步骤3。

Mac又是和平的。没有数据丢失,甚至不必重新启动Xcode(我尝试失败了)。最重要的是,ModuleCache似乎正在循环获取SourceKitService,而删除文件夹似乎可以解决此问题。希望这对您也有用。

脚注:

顺便说一句,导致SourceKitService问题的原因是我的Swift类中的数组声明太长。我在数组中有200多个条目。减少到30,错误消失了。因此,此问题可能是由于Apple代码中的某种堆栈溢出(双关语)造成的。


感谢您的回答。不过,您应该编辑答案,而不要自己发表评论。
Axalo

3
我在Swift中使用长数组声明存在类似的问题,该声明在初始化期间依赖于类型推断。我发现通过显式注释类型可以解决此问题。
jay492355

2
同样的问题。带有字典的大型数组。我只是将所有数据放在一个.PLIST文件中,然后读取它。
布鲁诺·保利诺

64
在2016年我们无法处理200个元素的数组是否会困扰其他人?在80年代,我在Atari 600的BASIC中使用了更长的阵列。
Eddie Sullivan

2
我现在遇到了同样的问题,就像@ jay492355提到的那样,您需要显式键入数组。
Guy Kogus

24

我看到这个问题是因为我声明了一个包含约60个元素的数组,如下所示:

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的类型推断和类型检查有关,当遇到长数组时它会进入循环。

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



1
在Xcode 8.1上我遇到类似的问题。我有一个NSConstraintLayout对象数组。在4上可以正常工作。在6上可以正常工作。在7上不能很好地工作,在8上根本不能工作。我创建了两个数组,每个数组有4个对象,并且工作正常。
Dan Loughney '16

@ onmyway133我想知道为什么它不会一直发生,而只是偶尔发生
亲爱的,

您是否认为如果return ["a", "b", "c", "d", "e", "f"]在返回的函数中有类似内容[String],那么类型推断仍然会遇到问题?
shim

10

当我连接实际设备并且没有通过模拟器运行时,发生此问题的次数大约是发生10次的8倍。

我不确定我的解决方案是否是一个好的解决方案,但是对我来说,我认为问题是由于模拟器和实际设备之间的切换引起的。听起来可能很奇怪,但是好像在缓存文件之间造成了干扰

什么解决了我的问题:

  • 清理构建文件夹:(在Xcode上)Alt + Shift + Command + K
  • 重置内容和设置:(在Simulator上)Command + Shift + K
  • 等待时间比正常时间长一点,并通过不断的点击来重载Xcode

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

编辑

我只是没有任何设备连接的问题。我只是退出Xcode并再次打开它,问题就消失了。不确定我的猜测是在获取/合并新代码后可能是重新索引问题。


我真的希望我能拼命地工作。不幸的是,在我开始编码后,它又开始失去控制。
T先生

我不确定,但是有时只是切换分支,从上游拉动就解决了我的问题。我的意思是我不执行公认的答案,但是我的问题已经解决了,我还没有解决:/
亲爱的

4

我解决了另一个导致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

4
您如何确定这段代码是问题所在?
KK

3

我一直在使用Xcode 9解决此问题,并探讨了几种解决方案。对我而言,禁用源代码控制似乎可以解决问题。

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

如果这不起作用,我建议在终端上使用renice命令。在这里更多

禁用源代码控制

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

  1. 关闭Xcode->删除派生数据
  2. 自行车机
  3. “清洁”项目

2

对我来说,它删除了衍生数据。从菜单中选择“产品”并按住Alt键,然后选择“清理构建文件夹”。快捷键:Alt + Shift + Command + K


2
  1. 退出Xcode
  2. 在终端中运行:

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


请注意LNI接受的答案与以下答案之间的区别:

  1. 始终最好不要崩溃而不是崩溃。特别是涉及到Xcode进程/组件。
  2. 我不是Apple开发人员,但是部分删除缓存可能会破坏其完整性。清除所有缓存后,我没有发现任何明显的延迟。

2

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

/Users/myname/Library/Developer/Xcode/DerivedData/ModuleCache/重新启动后,我按照@LNI的建议清除了所有缓存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

在此处输入图片说明



2

在不指定数据类型或不使用[String:Any]的情况下,不要迅速创建字典

如果我们使用“任何”类型,则编译器可能会陷入无限循环以检查数据类型。

它不会产生任何编译错误,它将使我们的Mac冻结在“编译快速源文件”上,并为名为“ swift”和“ SourceKitService”的任务获取大量内存。


2

我遇到了这样的问题。源工具包服务正在使用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”:15, “ 16”:16]

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

var详细信息:[String:任何] = [:]

details [“ 1”] = 1

details [“ 2”] = 2

details [“ 3”] = 3

details [“ 4”] = 4

details [“ 5”] = 5

details [“ 6”] = 6

details [“ 7”] = 7

details [“ 8”] = 8

details [“ 9”] = 9

details [“ 10”] = 10

details [“ 11”] = 11

details [“ 12”] = 12

details [“ 13”] = 13

details [“ 14”] = 14

details [“ 15”] = 15

details [“ 16”] = 16


伙计...。谁会想到的...。我确实有类似的代码,并且让SourceKitService消耗了CPU的生命。更改代码使它消失了。
AnBisw

2

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

在此处输入图片说明


很酷,但如果将Xcode停止运行,则没有必要。
Shayne


1

这仍然是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]

1

我对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 +

花了我一个多小时才找到它,我希望它可以节省其他人的时间。我向苹果提交了错误报告,编号为30103533


1

在将项目迁移到Swift 3之后,我遇到了同样的问题,找出了解决方案,因为字典和数组创建时没有数据类型,这需要时间。


1

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


1

我也遇到了这个问题,就我而言,我声明了一个大数组,如下所示:

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))
.
.
.

这解决了问题。


1

对于Objective-C项目:

我遇到了同样的问题,并且我们的项目中的Swift代码为零,因此它不是类型推断检查器。

我在这里尝试了所有其他解决方案,但没有任何效果-最终解决了我的问题,就是以恢复模式重新启动计算机并运行磁盘修复。我终于可以再次和平工作!

我猜想它的发生是由于某些符号链接断开,可能指向彼此,并使服务无休止地循环运行。


1

我在Xcode 8.2.1中遇到了类似的问题-通过/ * * /注释掉了1,000多行代码。注释掉该部分导致了该问题,并删除了注释掉的代码以解决该问题。


1

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

当我值得信赖的2010年中期MacBook Pro上的风扇开始运转时,我正在尝试以下调试代码。SourceKitService正在消耗可能获得的每个CPU周期。对有问题的行进行注释和取消注释,可以很清楚地看到SourceKitService被阻塞了。似乎使用了多个?? 操作员提供默认设置是旧计算机上的问题。解决方法就是不要这样做。将其分解为多个分配,这会使一些难看的调试代码更加丑陋。

placeMark是CLPlacemark的实例。此处使用的属性返回可选字符串。

我正在使用在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 ?? "")

我相信这是字符串连接的问题,而不是??。这将会是值得尝试"\() \()" (字符串插值),而不是
布鲁克斯杜波依斯

1

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

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

至:

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

1

在终端中运行:

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

0

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

SourceKitService负责Swift的类型推断工作。

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

更改为显式类型

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

SourceKitService的CPU使用率立即下降。


0

在SwiftUI @ViewBuilder块中调用@dynamicMemberLookup下标时,在XCode 11.4.1上发生了我的情况。


0

我有同样的问题,这是由编程错误引起的。

就我而言,我正在实现可比较且相等的协议,而lhs.param和rhs.param与lhs和rhs类的参数不对应。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.