SourceKitService consuma CPU e macina Xcode fino a un arresto


109

Questo NON è un problema beta. Sono su Xcode 6.0.1, versione di produzione. Il problema che sto riscontrando è che quando provo a creare o eseguire il codice su cui sto lavorando, Xcode non risponde per lunghi periodi di tempo e SourceKitService consuma fino al 400% della CPU (secondo Activity Monitor). Questo problema è nuovo negli ultimi giorni, anche se, stranamente, ero su Xcode 6.0 da quando è stato ufficialmente rilasciato il 17 settembre. Ho aggiornato a 6.0.1 sperando che contenesse una soluzione per questo problema.

Qualche idea su quale potrebbe essere il problema?


Hai controllato il consumo di memoria? Non ho avuto questo problema per un po ', ma è stato davvero brutto nelle beta in cui consumava tutta la RAM e poi l'HCF. Era generalmente dovuto a linee aritmetiche più lunghe, specialmente con i pedici. Dovrai dividere e conquistare per trovare il codice offensivo (ma legale). Quando trovi la riga, prova a riprodurre in Playground e invia una segnalazione di bug.
Chris Conover


Ci sono ancora alcuni bug noti come puoi leggere in diversi thread sui forum degli sviluppatori Apple. Xcode 6.1 Beta 3 risolve l'elevato consumo di CPU ma ne introduce di differenti. Molto deludente.
Klaas

1
Ho un problema simile. Ho avuto il problema su Xcode 7 e ora su 8. L' unica cosa che cambia è il codice che entra nel tuo Xcode. La mia ipotesi è che la reindicizzazione o il nuovo codice sia la causa principale. Questo di solito accade quando estrai il codice dal tuo upstream?
Miele

Risposte:


151

Ho riscontrato questo problema con Xcode 6.1.1 questo pomeriggio (non beta, versione ufficiale rilasciata). Avevo eseguito del codice su Playground e sospettavo che fosse quella la causa. La CPU è stata fissata a quasi il 100% e Xcode non è stato in grado di completare le build.

Quindi ecco cosa ho fatto:

1. Aperto "Activity Monitor", che mostrava SourceKitService come il maiale principale della CPU.

2. All'interno di "Monitoraggio attività", fare doppio clic su SourceKitService e fare clic sulla sezione "Apri file e porte", che mostrava che stava lavorando sui file nella directory / Users / myname / Library / Developer / Xcode / DerivedData / ModuleCache / per una cartella specifica.

3. Eliminata la cartella specificata (da una riga di comando, utilizzando rm -rf). La cache viene rigenerata in base a Posso eliminare in modo sicuro i contenuti della cartella dei dati derivati ​​da Xcode? .

4. Utilizzando nuovamente Monitoraggio attività, chiudere forzatamente SourceKitServer. Ho visto il segno ormai fin troppo familiare all'interno di Xcode che diceva che SourceKitService era andato in crash (ecco perché SourceKitService suonava familiare!).

5. Passaggio 3 ripetuto.

Il Mac è di nuovo tranquillo. Nessun dato è stato perso e Xcode non ha nemmeno bisogno di essere riavviato (cosa che avevo provato senza successo). La conclusione è che ModuleCache sembra ottenere SourceKitService in un ciclo e l'eliminazione della cartella sembra risolverlo. Spero che funzioni anche per te.

Bootnote:

A proposito, la causa del problema di SourceKitService era che avevo una dichiarazione di array troppo lunga nella mia classe Swift. Avevo più di 200 voci in una matrice. Ridotto a 30 e l'errore è andato via. Quindi il problema potrebbe essere sorto a causa di una sorta di overflow dello stack nel codice Apple (gioco di parole).


Grazie per la tua risposta. Tuttavia, dovresti modificare la tua risposta invece di commentare da solo.
Axalo

3
Ho avuto un problema simile con una dichiarazione di array lungo in Swift che si basava sull'inferenza del tipo durante la sua inizializzazione. Ho scoperto che annotando esplicitamente il tipo ha risolto il problema.
jay492355

2
Stesso problema. grande matrice con dizionari. Ho appena messo tutti i dati in un file .PLIST e l'ho letto.
Bruno Paulino

64
Non dà fastidio a qualcun altro il fatto che nel 2016 non possiamo gestire un array di 200 elementi? Ho usato array più lunghi in BASIC su un Atari 600 negli anni '80.
Eddie Sullivan

2
Ho avuto lo stesso problema ora e, come menzionato da @ jay492355, devi digitare esplicitamente il tuo array.
Guy Kogus

24

Stavo vedendo il problema perché stavo dichiarando un array con circa 60 elementi che assomigliavano a questo:

let byteMap = [

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

Annotando esplicitamente il tipo in questo modo:

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

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

Sono riuscito a fermarlo. Penso che debba avere qualcosa a che fare con l'inferenza del tipo e il controllo del tipo di Swift che lo fanno andare in loop quando incontra un array lungo.

Questo era in Xcode 6.2. Ho anche eliminato ModuleCache come descritto sopra e ora è tutto a posto.



1
Problema simile per me su Xcode 8.1. Ho un array di oggetti NSConstraintLayout. Ha funzionato bene con 4. Funziona bene con 6. Non così bene con 7 e non funziona affatto con 8. Ho creato due array con 4 oggetti ciascuno e funziona bene.
Dan Loughney

@ onmyway133 Mi chiedo perché non succede sempre e solo occasionalmente
Honey

Pensi che se avessi qualcosa di simile return ["a", "b", "c", "d", "e", "f"]in una funzione che restituisce [String], avrebbe ancora problemi con l'inferenza del tipo?
spessore

10

Questo problema si è verificato 10 volte, 8 volte è successo quando ho collegato un dispositivo reale e non ho eseguito il simulatore.

Non sono così sicuro che la mia soluzione sia buona, ma per me credo che il problema fosse dovuto al passaggio dal simulatore a un dispositivo reale. Può sembrare strano ma era come se stesse creando interferenze tra i file della cache .

Cosa ha risolto il mio problema:

  • Clean Build Folder: (su Xcode)Alt + Shift + Command + K
  • Ripristina contenuto e impostazioni: (sul simulatore) Command + Shift + K.
  • Ho aspettato un po 'più a lungo del normale e sovraccarico Xcode con clic costanti

Quindi, in pratica, prima di provare a eseguire su qualsiasi nuovo dispositivo, elimina qualsiasi cache.

MODIFICARE

Ho appena avuto il problema senza alcuna connessione al dispositivo. Ho appena chiuso Xcode e l'ho aperto di nuovo e il problema era scomparso. Non sono sicuro che la mia ipotesi sia che potrebbe essere un problema di reindicizzazione dopo aver recuperato / estratto un nuovo codice.


Avrei davvero voluto che funzionasse perché sono disperato. Sfortunatamente, inizia di nuovo a girare fuori controllo pochi istanti dopo aver iniziato a programmare.
Mr. T

Non ne sono sicuro, ma a volte il semplice cambio di ramo, tirare da monte ha risolto il mio problema. Il punto è che non faccio quello che suggerisce la risposta accettata e tuttavia il mio problema è risolto in qualche modo non ho ancora risolto: /
Honey

4

Ho risolto un altro problema che causava l'utilizzo di SourceKitService fino a 13 GB di memoria ...

Avevo String (riga di formato con molti argomenti:

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)

quando sostituito con questo ha funzionato bene (nessun accumulo di memoria e normale consumo di CPU)

    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
Come hai capito che questo pezzo di codice era il problema?
KK

3

Ho riscontrato questo problema con Xcode 9 e ho esplorato diverse soluzioni. Per me, disabilitare il controllo del codice sorgente sembrava fare il trucco.

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

Se questo non funziona, consiglierei di utilizzare il comando renice sul terminale . Maggiori informazioni qui

disabilitare il controllo del codice sorgente

Altri passaggi che ho tentato, ma non sono stati d'aiuto:

  1. Chiudi Xcode -> Elimina dati derivati
  2. macchina da ciclismo
  3. progetto "pulito"

2

Per me ha funzionato per eliminare i dati derivati. Seleziona "Prodotto" dal menu e tieni premuto il tasto Alt e seleziona "Pulisci cartella build". Tasto di scelta rapida: ALT + MAIUSC + COMANDO + K


2
  1. Esci da Xcode
  2. Esegui nel terminale:

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


Nota la differenza tra la risposta accettata di LNI e questa:

  1. È sempre meglio non schiantarsi che schiantarsi. Soprattutto, quando si tratta di processi / componenti Xcode.
  2. Non sono uno sviluppatore Apple, ma l'eliminazione parziale della cache può comprometterne l'integrità. Non ho notato ritardi significativi dopo aver pulito tutta la cache.

2

Passo 4 ore a risolvere i problemi in una lunga compilation del mio progetto. Il primo tentativo richiede 42 minuti per la compilazione.

/Users/myname/Library/Developer/Xcode/DerivedData/ModuleCache/Svuoto tutta la cache da come suggerito da @LNI, dopo il riavvio SourceKitServicee applico alcune modifiche al codice:

1) A.

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

A partire dal

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

2) A.

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

A partire dal

           let value1 = obj.property ?? defaultValue

3)

Per

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

A partire dal

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

Come risultato, il tempo di compilazione - 3 min, non così veloce ma migliore per 42 min.

Di conseguenza, prima SourceKitService- prendi ~ 5,2 Gb di memoria e dopo ~ 0,37 Gb

inserisci qui la descrizione dell'immagine


2

Ho avuto lo stesso problema con SourceKitService.

Ho risolto NON AGGIUNGERE MAI SUBVIEW CON FOR LOOP.

Per rilevare il problema che uso: https://github.com/RobertGummesson/BuildTimeAnalyzer-for-Xcode


come hai risolto? Ho aggiunto le mie visualizzazioni secondarie con il ciclo for e ora la pulizia della cache non risolve @Zhanserik
10donovanr

1
@ 10donovanr NON AGGIUNGERE MAI SUBVISTE CON PER LOOP. Dopodiché prova a pulire la cache dell'app con CMD + SHITF + K
Zhanserik

2

Non creare un dizionario in swift senza specificare i tipi di dati o con [String: Any]

Se usiamo il tipo "Qualsiasi", il compilatore potrebbe eseguire un ciclo infinito per il controllo del tipo di dati.

Non creerà alcun errore di compilazione, farà sì che il nostro Mac si blocchi durante la "compilazione di file sorgente rapidi" con l'acquisizione di molta memoria per le attività denominate "rapido" e "SourceKitService".


2

Ho affrontato un problema del genere. Il servizio del kit di origine utilizzava 10 GB di utilizzo. Il processo rapido nel monitoraggio delle attività raggiunge oltre 6 GB di utilizzo. Stavo usando il seguente codice:

dettagli 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]

Ho cambiato il codice come segue per risolvere questo problema:

dettagli var: [String: Any] = [:]

dettagli ["1"] = 1

dettagli ["2"] = 2

dettagli ["3"] = 3

dettagli ["4"] = 4

dettagli ["5"] = 5

dettagli ["6"] = 6

dettagli ["7"] = 7

dettagli ["8"] = 8

dettagli ["9"] = 9

dettagli ["10"] = 10

dettagli ["11"] = 11

dettagli ["12"] = 12

dettagli ["13"] = 13

dettagli ["14"] = 14

dettagli ["15"] = 15

dettagli ["16"] = 16


Amico ... chi avrebbe mai pensato ... Avevo esattamente un codice simile e avevo SourceKitService che risucchiava la vita dalla CPU. Cambiare il codice l'ha semplicemente fatto sparire.
AnBisw

2

Il problema si verifica ancora in XCode 10.0. Puoi risolverlo disabilitando "Mostra modifiche al controllo del codice sorgente" nelle opzioni del controllo del codice sorgente.

inserisci qui la descrizione dell'immagine


Fantastico, ma meno del necessario se si blocca Xcode.
Shayne

1

Ha affrontato lo stesso problema Xcode 7.2 (7C68)

La soluzione era implementare un metodo di un protocollo, che la mia classe aveva nella definizione.


1

Questo è ancora un problema in xcode Versione 7.3.1 (7D1014) la causa per me era, come ha sottolineato LNI, un array troppo lungo, non così lungo in realtà. Ho risolto il mio problema suddividendo l'array in vari array come questo:

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

Ho avuto lo stesso problema con XCode 8.2.1 (8C1002) e il seguente codice:

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

e queste estensioni:

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

L'ho risolto commentando questa riga in TestViewController:

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

Mi ci è voluta più di un'ora per trovarlo, spero di poter risparmiare tempo a qualcun altro. Ho presentato una segnalazione di bug ad Apple con il numero 30103533


1

Stavo affrontando lo stesso problema dopo aver migrato il progetto a Swift 3, ho scoperto la soluzione che richiedeva tempo a causa dei dizionari e dell'array creati senza tipo di dati.


1

Questo comportamento è apparso nel mio progetto quando ho dichiarato accidentalmente una classe che ha ereditato da se stessa. Xcode 8.2.1, utilizzando Swift 3.


1

Ho anche avuto questo problema, nel mio caso stavo dichiarando un grande array come questo:

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

Ho risolto il problema aggiungendo gli elementi 1 per riga anziché tutti contemporaneamente:

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

questo ha risolto il problema.


1

Per i progetti Objective-C:

Ho avuto lo stesso problema e nel nostro progetto non c'è codice Swift, quindi non è stato il controllo dell'inferenza del tipo.

Ho provato tutte le altre soluzioni qui e niente ha funzionato: quello che FINALMENTE l'ha risolto per me è stato il riavvio del computer in modalità di ripristino e l'esecuzione della riparazione del disco. Finalmente posso lavorare di nuovo in pace!

Immagino che sia successo a causa di alcuni collegamenti simbolici interrotti, probabilmente che puntano l'uno verso l'altro e che fanno funzionare il servizio in un ciclo infinito.


1

Sto riscontrando un problema simile con Xcode 8.2.1, con una sezione di oltre 1.000 righe di codice commentate tramite / * * /. Commentare la sezione ha causato il problema e rimuovere il codice commentato lo ha risolto.


1

Mi sono imbattuto in qualcosa di simile combinando più? operatori per fornire un valore predefinito per i valori stringa facoltativi.

Stavo sperimentando con il codice di debug di seguito quando la ventola del mio fidato MacBook Pro di metà 2010 ha iniziato a funzionare con difficoltà. SourceKitService stava risucchiando ogni ciclo della CPU che poteva ottenere. Commentando e rimuovendo il commento dalla linea incriminata è stato molto chiaro su cosa SourceKitService stava soffocando. Sembra che ne usi più di uno ?? operatore di fornire un valore predefinito è un problema su una vecchia macchina. Il problema è semplicemente non farlo. Suddividilo in più assegnazioni che rendono ancora più brutto un brutto codice di debug.

placeMark è un'istanza di CLPlacemark. Le proprietà qui utilizzate restituiscono stringhe opzionali.

Stavo usando Xcode versione 8.3.2 (8E2002) in esecuzione su 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 ?? "")

Credo che questo sia un problema con la concatenazione di stringhe e non ??. Varrebbe la pena provare con "\() \()" (interpolazione di stringhe) invece
Brooks DuBois

1

La conversione di array lunghi in funzioni sembra risolvere il problema per me:

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

per:

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

1

eseguire nel terminale:

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

potresti anche creare un comando da terminale usando questo alias:

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

e poi corri

xcodeFix

0

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

SourceKitService ha preso in carico il lavoro di inferenza sul tipo di Swift.

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

cambiare per digitare esplicitamente

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

L'utilizzo della CPU di SourceKitService scende immediatamente。


0

Mi è successo su XCode 11.4.1 quando ho chiamato gli indici @dynamicMemberLookup all'interno di un blocco SwiftUI @ViewBuilder.


0

Ho avuto lo stesso problema ed è stato causato da un errore di programmazione.

Nel mio caso stavo implementando i protocolli confrontabili ed equiparabili e lhs.param e rhs.param non corrispondevano ai parametri delle classi lhs e rhs.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.