it-swarm.com.ru

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

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

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

96
zeeple

С этой проблемой столкнулся 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 и ошибка ушла. Так что проблема могла возникнуть из-за некоторого переполнения стека в коде Apple (каламбур).

139
LNI

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

21
jay492355

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

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

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

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

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

Правка

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

10
Honey

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

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

2
Roland Keesom

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

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

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

отключение контроля источника

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

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

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

2
Jignesh Patel

Я трачу 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 Гб

 enter image description here

2
gbk

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

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

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

2
ak_ninan

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

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

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

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


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

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

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

1
Vijay Pal

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

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
Chuy47

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

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

чтобы:

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

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

1
KGBlacksmith

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

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

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

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

1
Accatyyc

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

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

1
Dmitry Kurilo

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

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
Dmitry Kozlov

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

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

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

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

1
Zhanserik

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

Я экспериментировал с приведенным ниже кодом отладки, когда вентилятор на моем верном 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 ?? "")
1
Positron

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

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

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

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

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

Использование CPU SourceKitService сразу же падает。

0
lbsweek

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

 enter image description here

0
DennyDog