SourceKitService consume CPU y muele Xcode hasta detenerlo

109

Este NO es un problema Beta. Estoy en Xcode 6.0.1, versión de producción. El problema que tengo es que cuando intento hacer una compilación o ejecutar el código en el que estoy trabajando, Xcode deja de responder durante largos períodos de tiempo y SourceKitService consume más del 400% de la CPU (según Activity Monitor). Este problema es nuevo en los últimos días, aunque, curiosamente, había estado en Xcode 6.0 desde que se lanzó oficialmente el 17 de septiembre. Actualicé a 6.0.1 con la esperanza de que contuviera una solución para este problema.

¿Alguna idea de cuál podría ser el problema?

zeeple
fuente
¿Ha verificado el consumo de memoria? No he tenido este problema por un tiempo, pero fue realmente malo en las versiones beta en las que consumiría toda la RAM y luego HCF. Generalmente se debió a líneas aritméticas más largas, especialmente con subíndices. Deberá dividir y conquistar para encontrar el código ofensivo (pero legal). Cuando encuentre la línea, intente reproducirla en Playground y envíe un informe de error.
Chris Conover
También vea estas publicaciones ciertamente fechadas: stackoverflow.com/questions/24873219/… y stackoverflow.com/questions/24873219/…
Chris Conover
Todavía hay algunos errores conocidos como puede leer en varios hilos en los foros de desarrolladores de Apple. Xcode 6.1 Beta 3 resuelve el alto consumo de CPU pero introduce otros diferentes. Muy decepcionante.
Klaas
1
Tengo un problema similar. Tuve el problema en Xcode 7 y ahora en 8. Lo único que cambia es el código que viene en su Xcode. Supongo que la reindexación o el código nuevo es la causa principal. ¿Esto suele suceder cuando extrae código de su flujo ascendente?
Miel

Respuestas:

151

Me encontré con este problema con Xcode 6.1.1 a principios de esta tarde (no beta, versión oficial). Había estado ejecutando un código en Playground y sospechaba que esa era la causa. La CPU estaba vinculada a casi el 100% y Xcode no pudo completar las compilaciones.

Así que esto es lo que hice:

1. Se abrió el "Monitor de actividad", que mostraba a SourceKitService como el principal consumidor de CPU.

2. Dentro de "Activity Monitor", haga doble clic en SourceKitService y haga clic en la sección "Abrir archivos y puertos", que mostró que estaba trabajando en archivos en el directorio / Users / myname / Library / Developer / Xcode / DerivedData / ModuleCache / para una carpeta específica.

3. Eliminó la carpeta especificada (desde una línea de comandos, usando rm -rf). La caché se regenera en función de ¿Puedo eliminar de forma segura el contenido de la carpeta de datos derivados de Xcode? .

4. Usando Activity Monitor de nuevo, fuerce el cierre de SourceKitServer. Vi el letrero ahora demasiado familiar dentro de Xcode que decía que SourceKitService se había bloqueado (¡por eso SourceKitService me sonaba familiar!).

5. Paso 3 repetido.

La Mac vuelve a estar en paz. No se perdieron datos y Xcode ni siquiera tuvo que reiniciarse (lo que intenté sin éxito). La conclusión es que ModuleCache parece estar obteniendo SourceKitService en un bucle y eliminar la carpeta parece solucionarlo. Espero que esto funcione para usted también.

Nota de arranque:

Por cierto, la causa del problema SourceKitService fue que tenía una declaración de matriz demasiado larga en mi clase Swift. Tenía más de 200 entradas en una matriz. Lo redujo a 30 y el error desapareció. Por lo tanto, el problema puede haber surgido debido a algún tipo de desbordamiento de pila en el código de Apple (juego de palabras).

LNI
fuente
Gracias por tu respuesta. Sin embargo, debe editar su respuesta en lugar de comentar por su cuenta.
Axalo
3
Tuve un problema similar con una declaración de matriz larga en Swift que dependía de la inferencia de tipos durante su inicialización. Descubrí que al anotar explícitamente el tipo se resolvió el problema.
jay492355
2
El mismo problema. gran variedad de diccionarios. Solo puse todos los datos en un archivo .PLIST y lo leo.
Bruno Paulino
64
¿A alguien más le molesta que en 2016 no podamos manejar una matriz de 200 elementos? Usé matrices más largas en BASIC en un Atari 600 en los 80.
Eddie Sullivan
2
Ahora tenía el mismo problema y, como mencionó @ jay492355, debe escribir explícitamente su matriz.
Guy Kogus
24

Estaba viendo el problema porque estaba declarando una matriz con aproximadamente 60 elementos que se veían así:

let byteMap = [

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

Anotando explícitamente el tipo de esta manera:

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

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

Pude hacer que se detuviera. Creo que debe tener algo que ver con la inferencia de tipo y la verificación de tipo de Swift que lo hace entrar en un bucle cuando encuentra una matriz más larga.

Esto fue en Xcode 6.2. También eliminé ModuleCache como se describió anteriormente y ahora todo está bien.

jay492355
fuente
2
Sí, este problema es famoso spin.atomicobject.com/2016/04/26/swift-long-compile-time
onmyway133
1
Problema similar para mí en Xcode 8.1. Tengo una matriz de objetos NSConstraintLayout. Funcionó bien con 4. Funciona bien con 6. No tan bien con 7 y no funciona en absoluto con 8. Creé dos matrices con 4 objetos cada una y funciona bien.
Dan Loughney
@ onmyway133 Me pregunto por qué no sucede todo el tiempo y solo sucede ocasionalmente
Cariño
¿Crees que si tuvieras algo como return ["a", "b", "c", "d", "e", "f"]en una función que devuelve [String], todavía tendría problemas con la inferencia de tipo?
calce el
10

Este problema sucedió como 10 veces, 8 veces sucedió cuando conecté un dispositivo real y no ejecuté el simulador.

No estoy tan seguro de si mi solución es buena, pero creo que el problema se debió al cambio entre el simulador y un dispositivo real. Puede sonar extraño, pero era como si estuviera creando interferencias entre los archivos de caché .

Qué resolvió mi problema:

  • Carpeta de compilación limpia: (en Xcode)Alt + Shift + Command + K
  • Restablecer contenido y configuración: (en el simulador) Command + Shift + K.
  • Esperó un poco más de lo normal y sobrecargó Xcode con clics constantes

Entonces, básicamente, antes de intentar ejecutar en cualquier dispositivo nuevo, simplemente elimine cualquier caché.

EDITAR

Acabo de tener el problema sin ninguna conexión de dispositivo. Salí de Xcode, lo abrí de nuevo y el problema desapareció. No estoy seguro de mi suposición es que podría ser un problema de reindexación después de buscar / extraer el código nuevo.

Miel
fuente
Realmente deseaba que esto funcionara porque estoy desesperado. Desafortunadamente, comienza a perder el control nuevamente momentos después de que comienzo a codificar.
Mr. T
No estoy seguro, pero a veces el simple hecho de cambiar de rama, tirar de aguas arriba ha resuelto mi problema. Mi punto es que no hago lo que sugiere la respuesta aceptada y, sin embargo, mi problema está resuelto de alguna manera. Todavía no lo he resuelto: /
Cariño,
4

Resolví otro problema que causaba que SourceKitService usara hasta 13 GB de memoria ...

Tenía String (línea de formato con muchos argumentos:

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)

cuando se reemplazó con esto funcionó bien (sin acumulación de memoria y consumo normal de 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
Matej Ukmar
fuente
4
¿Cómo averiguaste que este fragmento de código era el problema?
KK
3

Me he encontrado con este problema con Xcode 9 y exploré varias soluciones. Para mí, deshabilitar el control de fuente parecía funcionar.

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

Si esto no funciona, recomendaría usar el comando renice en la terminal . Más sobre eso aquí

deshabilitar el control de fuente

Otros pasos que intenté, pero no ayudaron:

  1. Cerrar Xcode -> Eliminar datos derivados
  2. maquina de ciclismo
  3. proyecto "limpio"
mhit0
fuente
2

Para mí funcionó para eliminar los datos derivados. Seleccione 'Producto' en el menú y mantenga presionada la tecla Alt y seleccione 'Limpiar carpeta de compilación'. Tecla corta: Alt + Mayús + Comando + K

Roland Keesom
fuente
2
  1. Salir de Xcode
  2. Ejecutar en Terminal:

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


Tenga en cuenta la diferencia entre la respuesta aceptada de LNI y esta:

  1. Siempre es mejor no chocar que chocar. Especialmente, cuando se trata de procesos / componentes de Xcode.
  2. No soy un desarrollador de Apple, pero la eliminación parcial de la caché puede romper su integridad. No noté ningún retraso significativo después de limpiar todo el caché.
Dmitry Isaev
fuente
2

Dedico 4 horas a resolver problemas en una larga compilación de mi proyecto. El primer intento tarda 42 minutos en compilarse.

/Users/myname/Library/Developer/Xcode/DerivedData/ModuleCache/Borro todo el caché como sugirió @LNI, después de reiniciar SourceKitServicey aplico algunos cambios para el código:

1 a

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

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

De

           let value1 = obj.property ?? defaultValue

3)

A

           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 }

Como resultado, tiempo de compilación: 3 minutos, no tan rápido pero mejor durante 42 minutos.

Como resultado, antes SourceKitService- toma ~ 5,2Gb de memoria y después ~ 0.37Gb

ingrese la descripción de la imagen aquí

gbk
fuente
2

Tuve el mismo problema con SourceKitService.

Lo resolví. NUNCA AGREGUE SUBVIEWS CON FOR LOOP.

Para detectar el problema, uso: https://github.com/RobertGummesson/BuildTimeAnalyzer-for-Xcode

Zhanserik
fuente
como lo resolviste Agregué mis subvistas con for loop y ahora la limpieza de caché no soluciona @Zhanserik
10donovanr
1
@ 10donovanr NUNCA AGREGUE SUBVIEWS CON FOR LOOP. Después de eso, intente limpiar el caché de la aplicación con CMD + SHITF + K
Zhanserik
2

No cree un diccionario rápido sin especificar los tipos de datos o con [String: Any]

Si usamos el tipo 'Cualquiera', el compilador podría ejecutar un bucle infinito para verificar el tipo de datos.

No creará ningún error de compilación, hará que nuestra Mac se congele en 'compilar archivos de origen rápidos' con la adquisición de mucha memoria para las tareas llamadas 'swift' y 'SourceKitService'.

Ak_ninan
fuente
2

Me he enfrentado a tal problema. El servicio del kit de origen estaba utilizando 10 GB de uso. El proceso rápido en el monitor de actividad alcanza un uso de más de 6 GB. Estaba usando el siguiente código:

var detalles: [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]

He cambiado el código al siguiente para resolver este problema:

var detalles: [String: Any] = [:]

detalles ["1"] = 1

detalles ["2"] = 2

detalles ["3"] = 3

detalles ["4"] = 4

detalles ["5"] = 5

detalles ["6"] = 6

detalles ["7"] = 7

detalles ["8"] = 8

detalles ["9"] = 9

detalles ["10"] = 10

detalles ["11"] = 11

detalles ["12"] = 12

detalles ["13"] = 13

detalles ["14"] = 14

detalles ["15"] = 15

detalles ["16"] = 16

Jignesh Patel
fuente
Hombre ... ¿quién hubiera pensado ...? Tenía exactamente un código similar y SourceKitService chupaba la vida de la CPU. Cambiar el código hizo que desapareciera.
AnBisw
2

El problema aún ocurre en XCode 10.0. Puede solucionarlo desactivando "Mostrar cambios de control de fuente" en las opciones de control de fuente.

ingrese la descripción de la imagen aquí

DennyDog
fuente
Genial, pero menos de lo necesario si está frenando Xcode.
Shayne
1

Enfrentó el mismo problema en Xcode 7.2 (7C68)

La solución fue implementar un método de protocolo, que mi clase tenía en la definición.

Dmitry Kurilo
fuente
1

Esto sigue siendo un problema en la versión 7.3.1 de xcode (7D1014), la causa para mí fue, como lo señaló LNI, una matriz demasiado larga, no tan larga en realidad. Solucioné mi problema dividiendo la matriz en varias matrices como esta:

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]
Tharak
fuente
1

Tuve el mismo problema con XCode 8.2.1 (8C1002) y el siguiente código:

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

y estas extensiones:

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

Lo resolví comentando esta línea en TestViewController:

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

Me tomó más de una hora encontrarlo, espero que pueda salvar algo de tiempo a alguien más. Presenté un informe de error a Apple con el número 30103533

Werner Kratochwil
fuente
1

Me enfrenté al mismo problema después de migrar el proyecto a swift 3, descubrí la solución que estaba tomando tiempo debido a los diccionarios y la matriz creados sin el tipo de datos.

Vijay Pal
fuente
1

Este comportamiento apareció en mi proyecto cuando declaré accidentalmente una clase que heredó de sí misma. Xcode 8.2.1, usando Swift 3.

zath
fuente
1

También tuve este problema, en mi caso, estaba declarando una gran matriz como esta:

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

Resolví el problema agregando los elementos 1 por línea en lugar de todos al mismo tiempo:

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

esto solucionó el problema.

Chuy47
fuente
1

Para proyectos Objective-C:

Tuve el mismo problema y no hay ningún código Swift en nuestro proyecto, por lo que no era el verificador de inferencia de tipos.

Probé todas las demás soluciones aquí y nada funcionó; lo que FINALMENTE lo solucionó fue reiniciar la computadora en modo de recuperación y ejecutar la reparación del disco. ¡Por fin puedo volver a trabajar en paz!

Supongo que sucedió debido a algunos enlaces simbólicos rotos, probablemente apuntando uno hacia el otro y haciendo que el servicio funcione en un bucle sin fin.

Accatyyc
fuente
1

Tengo un problema similar con Xcode 8.2.1, con una sección de más de 1,000 líneas de código comentadas a través de / * * /. Comentar la sección causó el problema y eliminar el código comentado lo solucionó.

KGBherrero
fuente
1

Me encontré con algo similar combinando múltiples? operadores para proporcionar un valor predeterminado para valores de cadena opcionales.

Estaba experimentando con el siguiente código de depuración cuando el ventilador de mi confiable MacBook Pro de mediados de 2010 comenzó a funcionar con fuerza. SourceKitService estaba absorbiendo cada ciclo de CPU que podía obtener. Comentar y descomentar la línea ofensiva dejó muy claro en qué se estaba ahogando SourceKitService. ¿Parece usar más de uno? que el operador proporcione un valor predeterminado es un problema en una máquina vieja. La solución es simplemente no hacerlo. Divídalo en múltiples asignaciones, lo que hace que un código de depuración desagradable sea aún más desagradable.

placeMark es una instancia de CLPlacemark. Las propiedades utilizadas aquí devuelven cadenas opcionales.

Estaba usando Xcode versión 8.3.2 (8E2002) ejecutándose en 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 ?? "")
Positrón
fuente
Creo que esto es un problema con la concatenación de cadenas y no ??. En su lugar, valdría la pena intentarlo con "\() \()" (interpolación de cadenas)
Brooks DuBois
1

La conversión de matrices largas en funciones parece resolver el problema para mí:

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

a:

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

ejecutar en terminal:

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

también puede crear un comando de terminal usando este alias:

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

y luego solo corre

xcodeFix
Dmitry Kozlov
fuente
0

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

SourceKitService se hizo cargo del trabajo de inferencia de tipos de Swift.

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

cambiar para escribir explícitamente

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

El uso de la CPU de SourceKitService se despliega inmediatamente。

libras semanales
fuente
0

Me pasó en XCode 11.4.1 al llamar a los subíndices @dynamicMemberLookup dentro de un bloque SwiftUI @ViewBuilder.

Objectif
fuente
0

Tuve el mismo problema y fue causado por un error de programación.

En mi caso, estaba implementando los protocolos comparables y equiparables y lhs.param y rhs.param no se correspondían con los parámetros de las clases lhs y rhs.

rockdaswift
fuente