SourceKitService споживає процесор і перемелює Xcode до зупинки


109

Це НЕ бета-версія. Я на Xcode 6.0.1, випуск виробництва. Проблема, яка у мене виникає, полягає в тому, що коли я намагаюся зробити збірку або запустити код, над яким я працюю, Xcode стає невідповідним протягом великих періодів часу, і SourceKitService споживає більше 400% ЦП (за даними Monitor 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 та натиснув на розділ "Відкрити файли та порти", який показав, що він працює над файлами в каталозі / Користувачі / Ім'я / Бібліотека / Розробник / Xcode / DerivedData / ModuleCache / для певної папки.

3. Видалено вказану папку (з командного рядка, використовуючи rm -rf). Кеш відновлюється на основі Чи можна безпечно видалити вміст папки даних, отриманих Xcode? .

4. Знову використовуючи Monitor Monitor, Force-Quit SourceKitServer. Побачив тепер уже надто знайомий знак у Xcode, який говорить про те, що SourceKitService зазнала аварії (тому саме SourceKitService звучало знайомо!).

5. Повторний крок 3.

Мак знову мирний. Жодних даних не було втрачено, і Xcode навіть не довелося перезавантажувати (що я намагався невдало). Підсумок полягає в тому, що ModuleCache, здається, отримує SourceKitService в циклі, а видалення папки, здається, виправляє її. Сподіваємось, це працює і для вас.

Основна примітка:

До речі, причиною проблеми SourceKitService було те, що я мав занадто довге оголошення масиву у своєму класі Swift. У мене було понад 200 записів у масиві. Зменшили його до 30 і помилка пішла. Таким чином, проблема може виникнути через якесь переповнення стека в яблучному коді (призначений каламбур).


Дякую за вашу відповідь. Ви повинні редагувати свою відповідь, а не коментувати самостійно.
Аксало

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)],

Я зміг змусити це зупинитися. Я думаю, що це повинно мати щось спільне з висновком типу та перевірки типу Свіфта, що змушує його переходити в цикл, коли він стикається з довгим масивом.

Це було в 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 Цікаво, чому це не відбувається постійно, а це трапляється лише зрідка
Honey

Як ви думаєте, якби у вас виникло щось на зразок return ["a", "b", "c", "d", "e", "f"]функції, яка повертається, [String]що вона все-таки матиме проблеми з висновком типу?
шим

10

Ця проблема траплялася приблизно 10 разів, 8 разів траплялася, коли я підключав фактичний пристрій і не запускався через тренажер.

Я не дуже впевнений, чи добре це рішення, але для мене я вважаю, що проблема була пов’язана з перемиканням між тренажером та фактичним пристроєм. Це може здатися дивним, але це було так, ніби створює перешкоди між файлами кешу .

Що вирішило мою проблему:

  • Очистити папку збірки: (на Xcode)Alt + Shift + Command + K
  • Скидання вмісту та налаштувань: (на Simulator) Command + Shift + K.
  • Зачекали трохи довше, ніж зазвичай, і перевантажуйте Xcode постійними клацаннями

Отже, перш ніж спробувати запустити будь-який новий пристрій, просто видаліть кеш.

EDIT

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


Я дуже хотів, щоб ця відпрацьована робота була в відчаї. На жаль, він починає знову виходити з-під контролю через моменти після того, як я розпочну кодування.
Містер T

Я не впевнений, але іноді просто перемикання гілок вирізало мою проблему. Моя думка, я не роблю те, що пропонує прийнята відповідь, і все ж моя проблема вирішена якось, я ще не тріснув: /
Мед

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

4
Як ви зрозуміли, що цей фрагмент коду був проблемою?
К. К.

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.

Я вирішив. НІКОЛИ НЕ ДОДАЙТЕ ПІДПРИЄМНИЦТВА ДЛЯ ШЛЯХУ.

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


як ти вирішив? Я додав свої підпогляди на для циклу і тепер кеш очищення не виправляється @Zhanserik
10donovanr

1
@ 10donovanr НІКОЛИ ДОДАЙТЕ ПІДПРИЄМНИЦТВ ДЛЯ ЛОПА Після цього спробуйте очистити кеш додатків із CMD + SHITF + K
Жансерик

2

Не створюйте словник швидко, не вказуючи типи даних або за допомогою [String: Any]

Якщо ми використовуємо тип "Будь-який", компілятор може зіткнутися з нескінченним циклом для перевірки типу даних.

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


2

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

деталі ["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

Я зіткнувся з тією самою проблемою після перенесення проекту на швидкий 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

Я наткнувся на щось подібне, поєднуючи кілька ?? оператори для надання за замовчуванням для необов'язкових значень рядків.

Я експериментував з кодом налагодження нижче, коли вентилятор мого надійного середини 2010 року MacBook Pro почав важко працювати. 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

Перетворення довгих масивів у функції, здається, вирішує проблему для мене:

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

0

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

SourceKitService взяв на себе відповідальність за висновки типу Swift.

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

змінити на явно введений

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

Використання процесора SourceKitService негайно знизиться。


0

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


0

У мене була така ж проблема, і це було викликано помилкою програмування.

У моєму випадку я реалізовував порівнянні та вирівняні протоколи, і lhs.param і rhs.param не відповідали параметрам класів lhs та rhs.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.