wake-up-neo.net

SourceKitService verbraucht CPU und schleift Xcode bis zum Stillstand

Dies ist KEIN Beta-Problem. Ich bin auf Xcode 6.0.1, Produktionsfreigabe. Das Problem, das ich habe, ist, dass, wenn ich versuche, den Code, an dem ich gerade arbeite, zu erstellen oder auszuführen, Xcode für längere Zeit nicht mehr reagiert und der SourceKitService mehr als 400% der CPU verbraucht (laut Activity Monitor). Dieses Problem ist in den letzten Tagen neu, obwohl ich seltsamerweise auf Xcode 6.0 war, seit es offiziell am 17. September veröffentlicht wurde. Ich habe ein Upgrade auf 6.0.1 in der Hoffnung gemacht, dass es ein Update für dieses Problem enthalten würde.

Irgendeine Idee, was das Problem sein könnte?

96
zeeple

Ist heute Nachmittag mit Xcode 6.1.1 auf dieses Problem gestoßen (keine Beta, offizielle veröffentlichte Version). Ich hatte Code auf Playground ausgeführt und vermutete, dass dies die Ursache war. Die CPU war zu fast 100% gebunden, und Xcode konnte Builds nicht abschließen.

Also hier ist was ich getan habe:

1. Öffnete "Activity Monitor", in dem SourceKitService als Haupt-CPU-Hog angezeigt wurde.

2. Doppelklicken Sie in "Activity Monitor" auf den SourceKitService und klicken Sie auf den Abschnitt "Open Files and Ports" (Dateien und Ports öffnen), der anzeigt, dass Dateien im Verzeichnis/Users/myname/Library/Developer/Xcode/DerivedData/ModuleCache/bearbeitet werden für einen bestimmten Ordner.

3. Löschte den angegebenen Ordner (über eine Befehlszeile mit rm -rf). Der Cache wird basierend auf Kann ich den Inhalt des Xcode Derived-Datenordners sicher löschen? neu generiert.

4. Verwenden Sie Activity Monitor erneut, um SourceKitServer zu beenden. Das mittlerweile allzu vertraute Zeichen in Xcode besagt, dass SourceKitService abgestürzt ist (daher kam SourceKitService mir bekannt vor!).

5. Wiederholen Sie Schritt 3.

Der Mac ist wieder friedlich. Es gingen keine Daten verloren und Xcode musste nicht einmal neu gestartet werden (was ich erfolglos versucht hatte). Unterm Strich scheint ModuleCache SourceKitService in eine Schleife zu bringen, und das Löschen des Ordners scheint das Problem zu beheben. Ich hoffe, das funktioniert auch für Sie.

Bootnote:

Die Ursache für das SourceKitService-Problem war übrigens, dass ich in meiner Klasse Swift) eine zu lange Array-Deklaration hatte. Ich hatte über 200 Einträge in einem Array. Reduzierte sie auf 30 und der Fehler verschwand Das Problem ist möglicherweise auf einen Stapelüberlauf in Apple Code (Wortspiel beabsichtigt) zurückzuführen.

142
LNI

Ich habe das Problem gesehen, weil ich ein Array mit etwa 60 Elementen deklarierte, das so aussah:

let byteMap = [

["ECG" : (0,12)],
["PPG" : (12,3)],
["ECG" : (15,12)],
["PPG" : (27,3)],
["ECG" : (30,12)]

Indem Sie den Typ explizit wie folgt kommentieren:

let byteMap : [String: (Int, Int)] = [

["ECG" : (0,12)],
["PPG" : (12,3)],
["ECG" : (15,12)],
["PPG" : (27,3)],
["ECG" : (30,12)],

Ich konnte es stoppen lassen. Ich denke, es muss etwas mit Swifts Typinferenz und Typprüfung zu tun haben, durch die es in eine Schleife geht, wenn es auf ein längliches Array trifft. 

Dies war in Xcode 6.2. Ich habe auch den ModuleCache wie oben beschrieben gelöscht und jetzt ist alles gut.

21
jay492355

Dieses Problem passierte etwa 10 mal, 8 mal als ich ein echtes Gerät angeschlossen habe und nicht durch den Simulator gelaufen bin.

Ich bin mir nicht so sicher, ob meine Lösung eine gute Lösung ist, aber ich glaube, dass das Problem auf einen Wechsel zwischen dem Simulator und einem tatsächlichen Gerät zurückzuführen ist. Es mag seltsam klingen, aber es war, als ob es Interferenzen zwischen Cache-Dateien erzeugte.

Was hat mein Problem gelöst?

  • Clean Build Folder: (auf Xcode) Alt + Shift + Command + K 
  • Inhalt und Einstellungen zurücksetzen: (on Simulator) Command + Shift + K
  • Warten etwas länger als normal und überladen Xcode mit konstanten Klicks

Bevor Sie also versuchen, auf einem neuen Gerät zu laufen, löschen Sie einfach den Cache.

BEARBEITEN

Ich hatte gerade das Problem ohne Geräteverbindung. Ich habe gerade Xcode beendet und es wieder geöffnet, und das Problem war weg. Ich bin mir nicht sicher, ob es sich bei rate um ein Problem mit der Neuindizierung handelt, nachdem Sie neuen Code abrufen/ziehen.

10
Honey

Ich habe ein anderes Problem behoben, durch das SourceKitService bis zu 13 GB Arbeitsspeicher benötigte. 

Ich hatte String (Formatzeile mit vielen Argumenten:

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)

wenn es damit ersetzt wurde, hat es gut funktioniert (kein Speicheraufbau und normaler CPU-Verbrauch)

    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

Für mich funktionierte es, die abgeleiteten Daten zu löschen. Wählen Sie "Product" aus dem Menü, halten Sie die Alt-Taste gedrückt und wählen Sie "Clean Build Folder". Kurztaste: Alt + Umschalt + Befehl + K

2
Roland Keesom

Ich bin mit Xcode 9 auf dieses Problem gestoßen und habe verschiedene Lösungen untersucht. Für mich schien das Deaktivieren von Source Control den Trick auszuführen. 

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

Wenn dies nicht funktioniert, würde ich empfehlen, den Befehl renice am terminal zu verwenden. Mehr dazu hier

Deaktivieren der Quellcodeverwaltung

Andere Schritte, die ich versucht habe, aber nicht geholfen habe:

  1. Schließen Sie Xcode -> Abgeleitete Daten löschen 
  2. fahrradmaschine 
  3. "sauberes" Projekt
2
mhit0

Ich bin mit einem solchen Problem konfrontiert. Der Quell-Kit-Service verwendete 10 GB. Der schnelle Prozess im Aktivitätsmonitor erreicht eine Auslastung von über 6 GB. Ich habe folgenden Code verwendet:

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 ]

Ich habe den Code in Folgendes geändert, um dieses Problem zu lösen:

var details: [String: Any] = [:]

details ["1"] = 1

details ["2"] = 2

details ["3"] = 3

details ["4"] = 4

details ["5"] = 5

details ["6"] = 6

details ["7"] = 7

details ["8"] = 8

details ["9"] = 9

details ["10"] = 10

details ["11"] = 11

details ["12"] = 12

details ["13"] = 13

details ["14"] = 14

details ["15"] = 15

details ["16"] = 16

2
Jignesh Patel

Ich brauche 4 Stunden, um Probleme in einer langen Zusammenstellung meines Projekts herauszufinden. Der erste Versuch dauert 42 Minuten.

Ich lösche den gesamten Cache von /Users/myname/Library/Developer/Xcode/DerivedData/ModuleCache/, wie von @LNI vorgeschlagen, nach dem Neustart von SourceKitService und wende einige Änderungen für Code an:

1 zu

    var initDictionary:[String:AnyObject] = [
                    "details" : "",
                    "duration" : serviceDuration,
                    "name" : serviceName,
                    "price" : servicePrice,
                    "typeId" : typeID,
                    "typeName" : typeName,
                    "url" : "",
                    "serviceId" : serviceID,
                    "imageName" : ""
                ]

Von

    var initDictionary= [
                    "details" : "",
                    "duration" : serviceDuration,
                    "name" : serviceName,
                    "price" : servicePrice,
                    "typeId" : typeID,
                    "typeName" : typeName,
                    "url" : "",
                    "serviceId" : serviceID,
                    "imageName: "" ]

2) bis 

            if let elem = obj.property,
                let elem2 = obj.prop2,
                etc
                 {
                 // do stuf here
            }

Von 

           let value1 = obj.property ?? defaultValue

3) 

Zu

           let serviceImages = images.filter { $0.serviceId == service.id }
           let sorted = serviceImages.sort { $0.sort > $1.sort }

Von

            let serviceImages = images.filter { $0.serviceId == service.id }. sort { $0.sort > $1.sort }

Als Ergebnis Kompilierzeit - 3 Minuten, nicht so schnell, aber besser für 42 Minuten.

Als Ergebnis nehmen Sie vor SourceKitService ~ 5,2 GB Speicher und nach ~ 0,37 GB

 enter image description here

2
gbk

Erstellen Sie kein Wörterbuch in Swift, ohne Datentypen anzugeben, oder mit [String: Any].

Wenn wir 'Any' verwenden, läuft der Compiler möglicherweise in einer Endlosschleife, um den Datentyp zu überprüfen.

Es wird kein Kompilierungsfehler erzeugt, es wird unseren Mac dazu bringen, beim 'Kompilieren von Swift-Quelldateien' einfrieren, wobei viel Speicher für die Aufgaben mit den Namen 'Swift' und 'SourceKitService' erworben wird.

2
ak_ninan

Dies ist immer noch ein Problem in xcode Version 7.3.1 (7D1014). Die Ursache für mich war, wie LNI herausstellte, ein zu langes Array, eigentlich nicht so lang. Ich habe mein Problem behoben, indem ich das Array in verschiedene Arrays unterteilt habe:

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

Dieses Verhalten trat in meinem Projekt auf, als ich versehentlich eine Klasse deklarierte, die von sich selbst geerbt wurde. Xcode 8.2.1 mit Swift 3.

1
zath
  1. Beenden Sie Xcode
  2. Im Terminal ausführen: 

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


Beachten Sie den Unterschied zwischen der akzeptierten Antwort von LNI und dieser:

  1. Es ist immer besser nicht zu stürzen als zu stürzen. Besonders, wenn es um Xcode-Prozesse/-Komponenten geht.
  2. Ich bin kein Apple-Entwickler, aber das teilweise Löschen des Cache kann seine Integrität beeinträchtigen. Ich habe keine nennenswerten Verzögerungen nach dem Reinigen des Cache festgestellt.
1
Dmitry Isaev

Nach der Migration des Projekts zu Swift 3 stand ich vor dem gleichen Problem. Ich fand heraus, dass die Lösung aufgrund von Wörterbüchern und Arrays ohne Datentyp Zeit benötigte.

1
Vijay Pal

Ich hatte auch dieses Problem, in meinem Fall hatte ich ein großes Array wie folgt deklariert:

var myArray: [(String, Bool?)]?
myArray = [("someString", someBool),
("someString", someBool),
("someString", someBool),
("someString", someBool),
("someString", someBool)
.
.
("someString", someBool)]

Ich habe das Problem gelöst, indem ich die Elemente 1 statt nur 1 zur selben Zeit hinzufügte:

var myArray = [(String, Bool?)]()
myArray.append(("someString", someBool))
myArray.append(("someString", someBool))
myArray.append(("someString", someBool))
myArray.append(("someString", someBool))
myArray.append(("someString", someBool))
.
.
.

das Problem wurde behoben.

1
Chuy47

Das Konvertieren langer Arrays in Funktionen scheint das Problem für mich zu lösen:

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

zu:

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

Ich habe ein ähnliches Problem mit Xcode 8.2.1 - mit einem Abschnitt von mehr als 1.000 Codezeilen, der über/* */auskommentiert wurde. Das Kommentieren des Abschnitts verursachte das Problem und das Entfernen des auskommentierten Codes wurde behoben. 

1
KGBlacksmith

Für Objective-C-Projekte:

Ich hatte das gleiche Problem und es gibt keinen Swift-Code in unserem Projekt. Es war also nicht der Typ-Inferenz-Checker.

Ich habe jede andere Lösung hier ausprobiert und nichts hat funktioniert - was ENDLICH für mich behoben wurde, war, den Computer im Wiederherstellungsmodus neu zu starten und die Festplattenreparatur auszuführen. Ich kann endlich wieder in Ruhe arbeiten!

Ich vermute, dass dies auf einige gebrochene Symlinks zurückzuführen ist, die wahrscheinlich auf einander zeigen und den Dienst in einer Endlosschleife laufen lassen.

1
Accatyyc

Konfrontiert mit demselben Problem bei Xcode 7.2 (7C68)

Die Lösung bestand darin, eine Methode eines Protokolls zu implementieren, die meine Klasse in der Definition hatte. 

1
Dmitry Kurilo

im Terminal laufen:

killall Xcode
rm -rf ~/Library/Developer/Xcode/DerivedData/ModuleCache
open /Applications/Xcode.app

sie können auch einen Terminalbefehl mit diesem Alias ​​erstellen:

echo alias xcodeFix='killall Xcode;rm -rf ~/Library/Developer/Xcode/DerivedData/ModuleCache;open /Applications/Xcode.app' >> ~/.profile
source ~/.profile

und dann einfach laufen

xcodeFix
1
Dmitry Kozlov

Ich hatte das gleiche Problem mit XCode 8.2.1 (8C1002) und dem folgenden Code: 

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") + "%")
    }
}

und diese Erweiterungen: 

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)
    }
}

Ich habe es gelöst, indem ich diese Zeile in TestViewController kommentierte: 

        "frames/s: \(self.anz_total_frames / self.movieFileOutput.recordedDuration.seconds)" + String.newLine +

Ich brauchte mehr als eine Stunde, um es zu finden. Ich hoffe, ich kann etwas Zeit für jemanden sparen. Ich habe einen Fehlerbericht mit der Nummer 30103533 bei Apple eingereicht

1

Ich hatte das gleiche Problem mit SourceKitService. 

I löste. NIEMALS SUBVIEWS MIT FOR LOOP HINZUFÜGEN.

Um ein Problem zu erkennen, verwende ich: https://github.com/RobertGummesson/BuildTimeAnalyzer-for-Xcode

1
Zhanserik

Ich bin auf etwas Ähnliches gestoßen, das mehrere kombiniert? Operatoren, um einen Standardwert für optionale Zeichenfolgenwerte anzugeben. 

Ich experimentierte mit dem folgenden Debug-Code, als der Lüfter meines vertrauten MacBook Pro Mitte 2010 hart lief. SourceKitService saugte jeden CPU-Zyklus auf, den er bekommen konnte. Durch Kommentieren und Entkommentieren der beanstandeten Zeile wurde deutlich, worauf der SourceKitService drosselte. Es sieht so aus, als würde man mehr als einen benutzen? Ein Operator, der einen Standardwert angibt, ist ein Problem auf einer alten Maschine. Die Arbeit ist nur nicht zu tun. Unterteilen Sie es in mehrere Zuweisungen, wodurch hässlicher Debug-Code noch hässlicher wird. 

placeMark ist eine Instanz von CLPlacemark. Die hier verwendeten Eigenschaften geben optionale Zeichenfolgen zurück.

Ich habe Xcode Version 8.3.2 (8E2002) unter OS 10.12.4 (16E195) verwendet.

// 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/de/archives/2209.html

SourceKitService übernahm die Arbeit der Typinferenz von Swift.

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

zu explizit tippen

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

SourceKitService Die CPU-Nutzung fällt sofort ab。

0
lbsweek

Das Problem tritt weiterhin in XCode 10.0 auf. Sie können dies beheben, indem Sie "Quellcodeverwaltungsänderungen anzeigen" in den Quellcodeverwaltungsoptionen deaktivieren.

 enter image description here

0
DennyDog