SourceKitService потребляет процессор и останавливает Xcode

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

Есть идеи о том, в чем проблема?

27 ответов

Решение

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

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

1. Открыл "Монитор активности", в котором SourceKitService отображался как основной процессор.

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

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

4. Снова используя Activity Monitor, принудительно завершите SourceKitServer. Увидел теперь все слишком знакомый знак в Xcode о том, что SourceKitService потерпел крах (вот почему SourceKitService звучит знакомо!).

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

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

Bootnote:

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

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

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

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

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

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

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

РЕДАКТИРОВАТЬ

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

Проблема по-прежнему возникает в XCode 10.0. Вы можете исправить это, отключив "Показать изменения управления исходным кодом" в параметрах управления исходным кодом.

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

У меня была строка (строка формата с большим количеством аргументов:

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

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

SourceKitService взял на себя ответственность за определение типа работы Swift.

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

изменить на явный тип

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

Использование CPU SourceKitService немедленно падает down

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

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

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

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

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

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

отключение Source Control

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

  1. Закрыть Xcode -> Удалить производные данные
  2. велосипедная машина
  3. "чистый" проект

Я трачу 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,2 ГБ памяти и после ~0,37 ГБ

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

У меня получилось удалить производные данные. Выберите "Product" из меню, удерживайте нажатой клавишу "Alt" и выберите "Clean Build Folder". Клавиша: Alt + Shift + Command + K

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

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]

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

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

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

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

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

  1. Выйти из Xcode
  2. Запустить в Терминале:

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


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

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

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

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

чтобы:

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

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

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

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

Я использовал версию Xcode 8.3.2 (8E2002), работающую на ОС 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 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))
.
.
.

это решило проблему.

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

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

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

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

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

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

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

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

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

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

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 8.2.1, использующий Swift 3.

Со мной случилось в XCode 11.4.1 при вызове индексов @dynamicMemberLookup внутри блока SwiftUI @ViewBuilder.

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

У меня была такая же проблема, и она была вызвана ошибкой программирования.

В моем случае я реализовал сопоставимые и равноправные протоколы, и lhs.param и rhs.param не соответствовали параметрам классов lhs и rhs.

Это случилось со мной только в XCode 14.2, когда я использовал.1для константы с плавающей запятой вместо0.1. Предварительный просмотр застрял, когда я исправил значение. Я выбрал «Проект/Очистить папку сборки», и через 10 секунд вентилятор остановился.

Другие вопросы по тегам