SourceKitService потребляет CPU и Grinds Xcode для остановки

Это НЕ Бета-проблема. Я на Xcode 6.0.1, выпуск продукции. Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь выполнить сборку или запуск кода, над которым я работаю, Xcode перестает отвечать на запросы в течение больших периодов времени, а SourceKitService потребляет более 400% процессора (согласно Activity Monitor). Эта проблема нова по состоянию на последние несколько дней, хотя, как ни странно, я был на Xcode 6.0, так как он был официально выпущен 17 сентября. Я обновился до версии 6.0.1, надеясь, что он будет содержать исправление для этой проблемы.

Любая идея о том, что может быть проблемой?

Ответ 1

В эту проблему встала проблема с Xcode 6.1.1 ранее днем ​​(а не с бета-версией официального выпуска). У меня был код на игровой площадке, и я подозревал, что это причина. CPU был привязан почти до 100%, а Xcode не смог завершить сборку.

Итак, вот что я сделал:

1. Открыл "Монитор активности", который показал SourceKitService в качестве основного процессора.

2. В "Мониторе активности" дважды щелкнув по SourceKitService и нажав "Открыть файлы и порты", который показал, что он работает с файлами в каталоге/Users/myname/Library/Developer/Xcode/DerivedData/ModuleCache/для конкретной папки.

3. Удалите указанную папку (из командной строки, используя rm -rf). Кэш регенерируется на основе Можно ли безопасно удалить содержимое папки с данными Xcode Derived?.

4. Снова запустите Activity Activity, Force-Quit SourceKitServer. Видел теперь уже слишком знакомый знак внутри Xcode, говорящий, что SourceKitService разбился (так почему SourceKitService звучит знакомо!).

5. Повторный шаг 3.

Mac снова мирный. Никакие данные не были потеряны, и Xcode даже не нужно перезапускать (что я пробовал безуспешно). Итог заключается в том, что ModuleCache, похоже, получает SourceKitService в цикле, и удаление папки, похоже, исправляет ее. Надеюсь, это сработает и для вас.

Bootnote:

Кстати, причиной проблемы SourceKitService было то, что у меня слишком длинное объявление массива в моем классе Swift. У меня было более 200 записей в массиве. Уменьшено до 30, и ошибка исчезла. Таким образом, проблема, возможно, возникла из-за какого-то в коде Apple (каламбур).

Ответ 2

Я видел проблему, потому что я объявлял массив с примерно 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, как описано выше, и теперь все хорошо.

Ответ 3

Эта проблема произошла как 10 раз, 8 раз это произошло, когда я подключил фактическое устройство и не работал через симулятор.

Я не уверен, что мое решение является хорошим, но для меня я считаю, что проблема связана с переключением между симулятором и реальным устройством. Это может показаться странным, но это было похоже на создание помех между файлами кеша.

Что решило мою проблему:

  • Очистить папку сборки (на Xcode) Alt + Shift + Command + K
  • Reset Содержимое и настройки: (on Симулятор) Command + Shift + K.
  • Ожидание немного дольше обычного и перегрузка Xcode с постоянными кликами

Итак, прежде чем пытаться запускать на любом новом устройстве, просто удалите кеш.

ИЗМЕНИТЬ

У меня была проблема без подключения к устройству. Я просто ушел из Xcode и снова открыл его, и проблема исчезла. Не уверен, что я предполагаю, что это может быть проблема с повторной индексацией после того, как вы извлекли/вытащили слияние нового кода.

Ответ 4

Я решил еще одну проблему, из-за которой SourceKitService использует до 13 ГБ памяти...

У меня был 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)

когда он был заменен этим, он работал нормально (без создания памяти и обычного потребления ЦП)

    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

Ответ 5

Для меня это сработало, чтобы удалить Derived Data. Выберите "Продукт" в меню и удерживайте клавишу "Alt" и выберите "Clean Build Folder". Shortkey: Alt + Shift + Command + K

Ответ 6

Я провожу 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) To

            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,2 Гб памяти и после ~ 0.37Gb

введите описание изображения здесь

Ответ 7

Не создавайте словарь в swift без указания типов данных или с помощью [String: Any]

Если мы используем тип "Any", компилятор может работать в бесконечном цикле для проверки типа данных.

Он не будет создавать компиляционную ошибку, это заставит наш mac замораживать "компиляцию быстрых исходных файлов" с приобретением большого количества памяти для задач с именем "swift" и "SourceKitService".

Ответ 8

Я столкнулся с такой проблемой. Служба исходного набора использовала 10 гб использования. Процесс Swift в мониторе активности достигает более 6 ГБ. Я использовал следующий код:

детали 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: Any] = [:]

details [ "1" ] = 1

details [ "2" ] = 2

подробнее [ "3" ] = 3

details [ "4" ] = 4

details [ "5" ] = 5

details [ "6" ] = 6

подробнее [ "7" ] = 7

подробнее [ "8" ] = 8

details [ "9" ] = 9

подробнее [ "10" ] = 10

подробнее [ "11" ] = 11

подробнее [ "12" ] = 12

details [ "13" ] = 13

подробнее [ "14" ] = 14

подробнее [ "15" ] = 15

подробнее [ "16" ] = 16

Ответ 9

Столкнувшись с той же проблемой на Xcode 7.2 (7C68)

Решение заключалось в том, чтобы реализовать метод протокола, который мой класс имел в определении.

Ответ 10

Это все еще проблема в 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]

Ответ 11

  • Выйти из Xcode
  • Запуск в терминале:

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


Обратите внимание на разницу между принятым ответом LNI и этим:

  • Всегда лучше не крутиться, а крушить. Особенно, когда речь идет о процессах/компонентах Xcode.
  • Я не разработчик Apple, но частичное удаление кеша может нарушить его целостность. Я не заметил существенных задержек после очистки всего кеша.

Ответ 12

У меня была та же проблема с 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 +

Мне понадобилось больше часа, чтобы найти его, я надеюсь, что он может сэкономить время кому-то еще. Я подал отчет об ошибке в Apple с номером 30103533

Ответ 13

Для проектов Objective-C:

У меня была такая же проблема, и в нашем проекте отсутствовал код Swift, поэтому он не был типом проверки вывода.

Я пробовал все другие решения здесь, и ничего не работало - что НАСТОЯЩЕЕ исправлено для меня - это перезагрузка компьютера в режиме восстановления и запуск ремонта диска. Я могу, наконец, снова работать в мире!

Я предполагаю, что это произошло из-за некоторых сломанных символических ссылок, вероятно, указывая друг на друга и заставляя службу работать в бесконечном цикле.

Ответ 14

Я столкнулся с такой же проблемой после переноса проекта в swift 3, выяснил, какое решение он занимает время из-за словарей и массива, созданных без типа данных.

Ответ 15

Это поведение появилось в моем проекте, когда я случайно объявил класс, который унаследовал от себя. Xcode 8.2.1, используя Swift 3.

Ответ 16

У меня также была эта проблема, в моем случае я объявлял большой массив следующим образом:

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

У меня была такая же проблема с SourceKitService.

Я решил. НИКОГДА НЕ ДОБАВЛЯТЬ СУБЪЕКТЫ С ЗАГРУЗКОЙ.

Чтобы обнаружить проблему, я использую:  https://github.com/RobertGummesson/BuildTimeAnalyzer-for-Xcode

Ответ 18

У меня есть аналогичная проблема с Xcode 8.2.1 - с секцией из 1000 строк кода, прокомментированных через /* */. Комментирование раздела вызвало проблему, и удаление кода с комментариями исправлено.

Ответ 19

Я столкнулся с чем-то подобным сочетанием нескольких? операторов для предоставления значения по умолчанию для необязательных строковых значений.

Я экспериментировал с кодом отладки ниже, когда поклонник моего надежного MacBook Pro середины 2010 года начал работать. SourceKitService всасывал каждый процессорный цикл, который он мог получить. Комментирование и расторжение строки оскорбления позволило очень четко понять, что подавляет SourceKitService. Похоже, использование более одного? оператор для предоставления по умолчанию является проблемой на старой машине. Работа вокруг просто не делает этого. Разбейте его на несколько назначений, что делает некоторые уродливые коды отладки еще более уродливыми.

placeMark - это экземпляр CLPlacemark. Используемые здесь свойства возвращают необязательные строки.

Я использовал Xcode Version 8.3.2 (8E2002), работающий на 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 safe to use
var debugString1 = placeMark.locality ?? ""
debugString1 = debugString1 + ", " +  (placeMark.administrativeArea ?? "")
debugString1 = debugString1 + " " + (placeMark.postalCode ?? "")

Ответ 20

Преобразование длинных массивов в функции, похоже, решает проблему для меня:

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

в

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

Ответ 21

Я столкнулся с этой проблемой с Xcode 9 и исследовал несколько решений. Для меня отключить Source Control, похоже, сделал трюк.

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

Если это не сработает, я бы рекомендовал использовать команду renice на терминале . Подробнее об этом здесь

отключить контроль источника

Другие шаги, которые я предпринял, но не помогли:

  • Закрыть Xcode → Удалить производные данные
  • велосипедная машина
  • "чистый" проект

Ответ 22

запустить в терминале:

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