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


110

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

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


Вы проверили потребление памяти? У меня не было этой проблемы какое-то время, но это было действительно плохо в бета-версиях, где она потребляла всю оперативную память, а затем HCF. Обычно это было связано с более длинными арифметическими строками, особенно с нижними индексами. Вам нужно будет разделять и властвовать, чтобы найти оскорбительный (но законный) код. Когда вы найдете строку, попробуйте воспроизвести ее в Playground и отправьте отчет об ошибке.
Крис Коновер,

Также см. Эти предположительно датированные сообщения: stackoverflow.com/questions/24873219/… и stackoverflow.com/questions/24873219/…
Крис Коновер

Есть еще некоторые известные ошибки, о которых вы можете прочитать в нескольких темах на форумах разработчиков Apple. Xcode 6.1 Beta 3 решает проблему высокой загрузки ЦП, но вводит другие. Очень разочаровывает.
Клаас

1
У меня похожая проблема. У меня была проблема с Xcode 7, а теперь с 8. Единственное , что изменилось, - это код, который входит в ваш Xcode. Я предполагаю, что переиндексация или новый код являются основной причиной. Обычно это происходит, когда вы извлекаете код из апстрима?
Мед

Ответы:


151

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

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

1. Открыл «Монитор активности», который показал SourceKitService в качестве основной нагрузки на ЦП.

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

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

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

5. Повторяем шаг 3.

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

Сноска:

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


Спасибо за Ваш ответ. Вам следует отредактировать свой ответ, а не комментировать самостоятельно.
Axalo

3
У меня была аналогичная проблема с объявлением длинного массива в Swift, которое полагалось на вывод типа во время его инициализации. Я обнаружил, что явное аннотирование типа решает проблему.
jay492355

2
Та же проблема. большой массив со словарями. Я просто помещаю все данные в файл .PLIST и читаю его.
Бруно Паулино,

64
Кого-то еще беспокоит, что в 2016 году мы не сможем обрабатывать массив из 200 элементов? Я использовал более длинные массивы в BASIC на Atari 600 еще в 80-х.
Эдди Салливан

2
Теперь у меня была такая же проблема, и, как упоминал @ jay492355, вам нужно явно ввести свой массив.
Гай Когус,

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, как описано выше, и теперь все в порядке.


2
Да, эта проблема известна spin.atomicobject.com/2016/04/26/swift-long-compile-time
onmyway133

1
Похожая проблема у меня на Xcode 8.1. У меня есть массив объектов NSConstraintLayout. Работает нормально с 4. Работает нормально с 6. Не очень хорошо с 7 и совсем не работает с 8. Я создал два массива по 4 объекта каждый, и он отлично работает.
Дэн Лоуни

@ onmyway133 Интересно, почему это не происходит постоянно, а случается только изредка
Дорогая,

Как вы думаете, если бы у вас было что-то вроде return ["a", "b", "c", "d", "e", "f"]функции, которая возвращает [String], у нее все еще были бы проблемы с выводом типа?
прокладка

10

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

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

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

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

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

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

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


Мне действительно хотелось, чтобы это сработало, потому что я в отчаянии. К сожалению, он снова начинает выходить из-под контроля сразу после того, как я начинаю кодировать.
Mr. T

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

4

Я решил еще одну проблему, из-за которой 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

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

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


2

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

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

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


как ты решил? Я добавил свои подпредставления с помощью цикла for, и теперь очистка кеша не исправляет @Zhanserik
10donovanr

1
@ 10donovanr НИКОГДА НЕ ДОБАВЛЯЙТЕ ПОДПИСКИ С FOR LOOP. После этого попробуйте очистить кеш приложения с помощью CMD + SHITF + K
Жансерик

2

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

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

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


2

Я столкнулся с такой проблемой. Служба исходного набора использовала 10 ГБ. Быстрый процесс в мониторе активности достигает более 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: [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


Человек .... кто бы мог подумать .... У меня был точно такой же код и SourceKitService высасывал жизнь из процессора. Изменение кода просто заставило его исчезнуть.
AnBisw,

2

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

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


Круто, но меньше, чем необходимо, если его измельчение Xcode остановится.
Шейн

1

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

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


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 +

Мне потребовалось больше часа, чтобы найти его, я надеюсь, что это поможет кому-то еще сэкономить время. Я отправил отчет об ошибке в Apple с номером 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 - с разделом из более чем 1000 строк кода, закомментированным через / * * /. Комментарий к разделу вызвал проблему, а удаление закомментированного кода исправило ее.


1

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

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

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

Я использовал Xcode версии 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'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

1

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


Я столкнулся с аналогичной проблемой в XCode 11.6. Создан класс наблюдателя. который пытался транслировать (публиковать) «необязательные» элементы. Я наблюдал за статусом AVPlayer (необязательно) в классе. SourceKitService потреблял всю память, поэтому Mac выглядел как повешенный. Я изменил и удалил «необязательные» элементы. Возможно, XCode исправит ошибку в следующей версии. Мы можем оставить «Монитор активности» приложения -> Утилиты для мониторинга памяти во время разработки :)
SHS


0

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.