web-dev-qa-db-fra.com

SourceKitService utilise le processeur et grinds Xcode pour un arrêt

Ce n'est pas un problème de bêta. Je suis sur Xcode 6.0.1, version de production. Le problème que je rencontre est que lorsque j'essaie de créer ou d'exécuter le code sur lequel je travaille, Xcode ne répond plus pendant de longues périodes et que SourceKitService consomme plus de 400% de la CPU (selon Activity Monitor). Ce problème est nouveau depuis quelques jours, bien que, curieusement, je sois sur Xcode 6.0 depuis sa sortie officielle le 17 septembre. Je suis passé à la version 6.0.1 en espérant qu'il contiendrait un correctif pour ce problème.

Une idée de ce que le problème pourrait être?

96
zeeple

Couru dans ce problème avec Xcode 6.1.1 plus tôt cet après-midi (pas bêta, version officielle publiée). J'avais exécuté du code sur Playground et je soupçonnais que c'était la cause. Le processeur a été indexé à près de 100% et Xcode n'a pas pu terminer les générations.

Alors voici ce que j'ai fait:

1. Ouverture du "Moniteur d'activité", qui montrait que SourceKitService était le principal responsable du processeur.

2. Dans "Moniteur d'activité", double-cliquez sur le SourceKitService et cliquez sur la section "Ouvrir les fichiers et les ports", qui indiquait qu'il travaillait sur des fichiers du répertoire/Utilisateurs/monnom/Bibliothèque/Développeur/Xcode/DerivedData/ModuleCache /. dossier spécifique. 

3. Supprimé le dossier spécifié (à partir d'une ligne de commande, à l'aide de rm -rf). Le cache est régénéré en fonction de Puis-je supprimer en toute sécurité le contenu du dossier de données Xcode Derived?

4. En utilisant de nouveau le Moniteur d'activité, forcez-fermez SourceKitServer. Vu le signe désormais trop familier dans Xcode, indiquant que SourceKitService s'était écrasé (c'est pourquoi SourceKitService semblait familier!).

5. Répétez l'étape 3.

Le Mac est paisible, encore. Aucune donnée n'a été perdue et Xcode n'a même pas dû être redémarré (ce que j'avais essayé sans succès). Le résultat inférieur est que ModuleCache semble obtenir SourceKitService dans une boucle et la suppression du dossier semble résoudre le problème. J'espère que cela fonctionne pour vous aussi.

Note de démarrage:

Soit dit en passant, le problème SourceKitService était dû au fait que j'avais une déclaration de tableau trop longue dans ma classe Swift. J'ai eu plus de 200 entrées dans un tableau. Réduit à 30 et l'erreur disparut. Le problème peut donc être dû à un dépassement de pile dans le code Apple (jeu de mots).

139
LNI

Je voyais le problème parce que je déclarais un tableau avec environ 60 éléments ressemblant à ceci:

let byteMap = [

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

En annotant explicitement le type comme ceci:

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

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

J'ai pu le faire arrêter. Je pense que cela doit avoir quelque chose à voir avec l'inférence de type et la vérification de type de Swift, qui la placent dans une boucle lorsqu'elle rencontre un tableau long. 

C'était dans Xcode 6.2. J'ai également supprimé le ModuleCache comme décrit ci-dessus et maintenant tout est bon.

21
jay492355

Ce problème est survenu environ 10 fois, 8 fois lorsque j'ai connecté un appareil réel et que je ne suis pas passé par le simulateur.

Je ne suis pas sûr de savoir si ma solution est bonne, mais j'estime que le problème tient à la permutation entre le simulateur et un appareil réel. Cela peut sembler étrange, mais c'était comme si cela créait des interférences entre les fichiers de cache .

Qu'est-ce qui a résolu mon problème:

  • Nettoyer le dossier de construction: (sur Xcode) Alt + Shift + Command + K 
  • Réinitialiser le contenu et les paramètres: (sur le simulateur ) Command + Shift + K
  • A attendu un peu plus longtemps que la normale et surchargez Xcode avec des clics constants

Donc, fondamentalement, avant d'essayer de fonctionner sur un nouveau périphérique, supprimez simplement tout cache.

MODIFIER

Je viens d'avoir le problème sans aucune connexion de périphérique. Je viens de quitter Xcode et de l'ouvrir à nouveau et le problème avait disparu. Je ne suis pas sûr que mon suppose que soit que cela pourrait être un problème de réindexation après avoir récupéré/extrait un nouveau code.

10
Honey

J'ai résolu un autre problème qui faisait que SourceKitService utilisait jusqu'à 13 Go de mémoire ... 

J'ai eu String (ligne de format avec beaucoup d'arguments:

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)

lorsqu’il a été remplacé, cela a fonctionné correctement (pas d’accumulation de mémoire ni de consommation normale du processeur)

    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

Pour moi, cela a fonctionné pour supprimer les données dérivées. Sélectionnez «Produit» dans le menu, maintenez la touche Alt enfoncée et sélectionnez «Nettoyer le dossier de construction». Touche de raccourci: Alt + Maj + Commande + K

2
Roland Keesom

J'ai rencontré ce problème avec Xcode 9 et j'ai exploré plusieurs solutions. Pour moi, désactiver le contrôle de la source semblait faire l'affaire. 

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

Si cela ne fonctionne pas, je vous recommande d'utiliser la commande renice sur terminal. Plus sur cela ici

désactivation du contrôle de source

Autres étapes que j'ai tentées mais qui n'ont pas aidé:

  1. Fermer Xcode -> Supprimer les données dérivées 
  2. machine à vélo 
  3. projet "propre"
2
mhit0

J'ai fait face à un tel problème. Le service de kit source utilisait 10 Go d’utilisation. Le processus rapide dans le moniteur d'activité atteint plus de 6 Go d'utilisation. J'utilisais le code suivant:

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 ]

J'ai changé le code en suivant pour résoudre ce problème:

détails de la var: [String: Any] = [:]

détails ["1"] = 1

détails ["2"] = 2

détails ["3"] = 3

détails ["4"] = 4

détails ["5"] = 5

détails ["6"] = 6

détails ["7"] = 7

détails ["8"] = 8

détails ["9"] = 9

détails ["10"] = 10

détails ["11"] = 11

détails ["12"] = 12

détails ["13"] = 13

détails ["14"] = 14

détails ["15"] = 15

détails ["16"] = 16

2
Jignesh Patel

Je passe 4 heures à résoudre des problèmes dans une longue compilation de mon projet ..__ Le premier essai prend 42 minutes à compiler.

J'efface tout le cache de /Users/myname/Library/Developer/Xcode/DerivedData/ModuleCache/ comme suggéré par @LNI, après le redémarrage de SourceKitService et applique quelques modifications au code:

1) À

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

De

    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
            }

De 

           let value1 = obj.property ?? defaultValue

3) 

À

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

De

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

En conséquence, compilez le temps - 3 min, pas si vite mais mieux pour 42 min.

Par conséquent, avant SourceKitService - prenez environ 5,2 Go de mémoire et après ~ 0,37 Go

 enter image description here

2
gbk

Ne créez pas de dictionnaire dans Swift sans spécifier les types de données ou avec [String: Any]

Si nous utilisons le type 'Any', le compilateur pourrait se retrouver dans une boucle infinie pour vérifier le type de données.

Cela ne créera aucune erreur de compilation, cela obligera notre mac à se figer lors de la compilation de fichiers source Swift avec beaucoup de mémoire pour les tâches nommées "Swift" et "SourceKitService".

2
ak_ninan

C’est toujours un problème dans la version 7.3.1 de xcode (7D1014). J'ai résolu mon problème en divisant le tableau en plusieurs tableaux comme celui-ci:

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

Ce comportement est apparu dans mon projet lorsque j'ai accidentellement déclaré une classe héritée d'elle-même. Xcode 8.2.1, en utilisant Swift 3.

1
zath
  1. Quitter Xcode
  2. Run in Terminal: 

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


Notez la différence entre la réponse acceptée de LNI et celle-ci:

  1. Il vaut toujours mieux ne pas tomber en panne que de tomber en panne. Surtout en ce qui concerne les processus/composants Xcode.
  2. Je ne suis pas un développeur Apple, mais la suppression partielle du cache peut altérer son intégrité. Je n'ai pas remarqué de retard important après le nettoyage de la mémoire cache.
1
Dmitry Isaev

Je faisais face au même problème après la migration du projet vers Swift 3. Trouvez la solution qui prenait du temps à cause des dictionnaires et du tableau créé sans type de données.

1
Vijay Pal

J'ai également eu ce problème, dans mon cas, je déclarais un grand tableau comme ceci:

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

J'ai résolu le problème en ajoutant les éléments 1 par ligne au lieu de tous en même temps:

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

cela a résolu le problème.

1
Chuy47

La conversion de tableaux longs en fonctions semble résoudre le problème pour moi:

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

à:

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

J'ai un problème similaire avec Xcode 8.2.1 - avec une section de plus de 1 000 lignes de code commentée via// * * /. Le commentaire de la section a été à l'origine du problème et la suppression du code commenté a corrigé le problème. 

1
KGBlacksmith

Pour les projets Objective-C:

J'ai eu le même problème, et il n'y a aucun code Swift dans notre projet, donc ce n'était pas le vérificateur d'inférence de type.

J'ai essayé toutes les autres solutions ici et rien n'a fonctionné - ce qui a finalement été résolu pour moi était de redémarrer l'ordinateur en mode de récupération et d'exécuter la réparation du disque. Je peux enfin travailler à nouveau en paix!

J'imagine que c'est dû à des liens symboliques brisés, qui se dirigeaient probablement l'un vers l'autre et faisaient en sorte que le service tourne en boucle.

1
Accatyyc

A fait face au même problème sur Xcode 7.2 (7C68)

La solution consistait à implémenter une méthode de protocole, que ma classe avait dans la définition. 

1
Dmitry Kurilo

courir dans le terminal:

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

vous pouvez également créer une commande de terminal en utilisant cet alias:

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

et puis juste courir

xcodeFix
1
Dmitry Kozlov

J'ai eu le même problème avec XCode 8.2.1 (8C1002) et le code suivant: 

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

et ces extensions: 

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

Je l'ai résolu en commentant cette ligne dans TestViewController: 

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

Il m'a fallu plus d'une heure pour le trouver, j'espère que cela peut faire gagner du temps à quelqu'un d'autre. J'ai déposé un rapport de bogue à Apple avec le numéro 30103533

1
Werner Kratochwil

J'ai eu le même problème avec SourceKitService. 

J'ai résolu. NE JAMAIS AJOUTER DE SOUS-VUES AVEC POUR LA BOUCLE.

Pour détecter le problème, j'utilise: https://github.com/RobertGummesson/BuildTimeAnalyzer-for-Xcode

1
Zhanserik

J'ai rencontré quelque chose de similaire combinant plusieurs ?? opérateurs pour fournir une valeur par défaut pour les valeurs de chaîne facultatives. 

J'essayais avec le code de débogage ci-dessous lorsque le ventilateur de mon fidèle MacBook Pro, mi-2010, a commencé à fonctionner sérieusement. SourceKitService absorbait tous les cycles de traitement possibles. En commentant et en supprimant les commentaires de la ligne incriminée, il était très clair que SourceKitService était étouffé. Cela ressemble à utiliser plus d'un ?? L’opérateur qui fournit une valeur par défaut pose problème sur un ancien ordinateur. Le travail consiste simplement à ne pas le faire. Découpez-le en plusieurs assignations, ce qui rend encore plus laid un code de débogage laid. 

placeMark est une instance de CLPlacemark. Les propriétés utilisées ici renvoient des chaînes facultatives.

J'utilisais Xcode version 8.3.2 (8E2002) sous 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 ?? "")
1
Positron

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

SourceKitService a pris en charge le travail d'inférence de type de Swift.

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

changer pour taper explicitement

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

Utilisation du processeur SourceKitService dans le menu déroulant immédiatement

0
lbsweek

Le problème persiste dans XCode 10.0. Vous pouvez y remédier en désactivant "Afficher les modifications du contrôle de code source" dans les options du contrôle de code source.

 enter image description here

0
DennyDog