SourceKitService消耗CPU并将Xcode研磨成停止

时间:2014-10-01 22:51:17

标签: ios iphone swift xcode sourcekit

这不是Beta问题。我正在使用Xcode 6.0.1,即生产版本。我遇到的问题是,当我尝试构建或运行我正在处理的代码时,Xcode在很长一段时间内都没有响应,并且SourceKitService消耗了超过400%的CPU(根据Activity Monitor)。这个问题在最近几天是新的,但奇怪的是,自从9月17日正式发布以来,我一直在使用Xcode 6.0。我升级到6.0.1,希望它能解决这个问题。

知道问题可能是什么?

25 个答案:

答案 0 :(得分:140)

今天早些时候使用Xcode 6.1.1解决了这个问题(不是beta版,正式发布版)。我一直在Playground上运行一些代码,并怀疑这是原因。 CPU被盯住了近100%,Xcode无法完成构建。

所以我的所作所为:

1.打开"活动监视器",将SourceKitService显示为主CPU占用。

2.在" Activity Monitor"中,双击SourceKitService并单击"打开文件和端口"部分,显示它正在处理特定文件夹的/ Users / myname / Library / Developer / Xcode / DerivedData / ModuleCache /目录下的文件。

3.删除指定的文件夹(从命令行,使用rm -rf)。根据{{​​3}}重新生成缓存。

4.再次使用Activity Monitor,强制退出SourceKitServer。在Xcode中看到了现在太熟悉的标志,说SourceKitService崩溃了(这就是为什么SourceKitService听起来很熟悉!)。

5.重复步骤3.

Mac又是和平的。没有数据丢失,Xcode甚至不需要重新启动(我曾尝试过失败)。底线是ModuleCache似乎在循环中获取SourceKitService并删除该文件夹似乎解决了它。希望这也适合你。

Bootnote:

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

答案 1 :(得分:21)

我看到了这个问题,因为我声明了一个包含大约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,现在一切都很好。

答案 2 :(得分:10)

这个问题发生了10次,当我连接实际设备并且没有通过模拟器时发生了8次。

我不确定我的解决方案是否合适,但对我而言,我认为问题是由于在模拟器和实际设备之间切换。这可能听起来很奇怪,但就好像它在缓存文件之间产生干扰

是什么解决了我的问题:

  • 清理构建文件夹:(在Xcode上)Alt + Shift + Command + K
  • 重置内容和设置(开启 模拟器)Command + Shift + K
  • 等待时间比正常时间长,并且不断点击会使Xcode过载

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

修改

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

答案 3 :(得分: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 :(得分:3)

我一直在使用 Xcode 9 来解决这个问题,并探讨了几个解决方案。对我来说,禁用源代码管理似乎可以解决问题。

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

如果这不起作用,我建议在终端使用 renice 命令。有关here

的更多信息

disabling Source Control

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

  1. 关闭Xcode - >删除派生数据
  2. 单车机器
  3. “干净”项目

答案 5 :(得分:2)

对我而言,它可以删除派生数据。从菜单中选择“产品”并按住Alt键并选择“清理构建文件夹”。短按:Alt + Shift + Command + K

答案 6 :(得分:2)

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

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

enter image description here

答案 7 :(得分:2)

我遇到过这样的问题。源工具包服务使用10 GB的用法。活动监视器中的Swift进程使用率超过6 GB。我使用以下代码:

var details:[String:Any] = [" 1":1, #&34; 2":2, #&34; 3":3, #&34; 4&#34:4, #&34; 5":5, #&34; 6":6, #&34; 7":7, #&34; 8":8, #&34; 9":9, #&34; 10":10, #&34; 11":11, #&34; 12":12, #&34; 13":13, #&34; 14":14, #&34; 15":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

答案 8 :(得分:2)

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

如果我们使用'任何'类型编译器可能会遇到无限循环以检查数据类型。

它不会创建任何编译错误,它会让我们的mac冻结在“编译swift源文件”上。为获得名为' swift'的任务获取大量记忆&安培; ' SourceKitService'

答案 9 :(得分:1)

当我意外地声明一个从自身继承的类时,这个行为出现在我的项目中。 Xcode 8.2.1,使用Swift 3。

答案 10 :(得分:1)

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

答案 11 :(得分:1)

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

enter image description here

答案 12 :(得分: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

答案 13 :(得分:1)

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

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

为:

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

答案 14 :(得分:1)

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

答案 15 :(得分:1)

我在SourceKitService遇到了同样的问题。

我解决了。永远不要用循环添加主题。

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

答案 16 :(得分: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))
.
.
.

这解决了问题。

答案 17 :(得分:1)

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

答案 18 :(得分:1)

对于Objective-C项目:

我遇到了同样的问题,我们的项目中没有Swift代码,所以它不是类型推理检查器。

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

我猜它发生的原因是一些破坏的符号链接,可能指向彼此并使服务在无限循环中运行。

答案 19 :(得分: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

答案 20 :(得分:1)

  1. 退出Xcode
  2. 在终端中运行:
  3. rm -rf ~/Library/Developer/Xcode/DerivedData/ModuleCache/*

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

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

答案 21 :(得分: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]

答案 22 :(得分:1)

Xcode 7.2 (7C68)

面临同样的问题

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

答案 23 :(得分:0)

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

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

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

更改为显式输入

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

SourceKitService的CPU使用率立即下降。

答案 24 :(得分:0)

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

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