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 в терминале. Подробнее об этом здесь
Другие шаги, которые я предпринял, но не помогли:
- Закрыть Xcode -> Удалить производные данные
- велосипедная машина
- "чистый" проект
Я трачу 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".
- Выйти из Xcode
- Запустить в Терминале:
rm -rf ~/Library/Developer/Xcode/DerivedData/ModuleCache/*
Обратите внимание на разницу между принятым ответом LNI и этим:
- Всегда лучше не разбиться, чем разбиться. Особенно, когда речь идет о процессах / компонентах Xcode.
- Я не разработчик 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 секунд вентилятор остановился.