ios iphone swift xcode sourcekit

ios - SourceKitService consume CPU y muele Xcode a un alto



iphone swift (22)

Esto NO es un problema Beta. Estoy en Xcode 6.0.1, lanzamiento de producción. El problema que estoy teniendo 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 (de acuerdo con el Monitor de actividad). Este problema es nuevo en los últimos días, aunque, curiosamente, he 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?


correr en la terminal:

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

también puedes 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


  1. Salir de Xcode
  2. Ejecutar en la 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 estrellarse. Especialmente, cuando se trata de procesos / componentes Xcode.
  2. No soy un desarrollador de Apple, pero la eliminación parcial de la memoria caché puede romper su integridad. No noté ningún retraso significativo después de limpiar todo el caché.

Enfrentando 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.


Estaba enfrentando el mismo problema después de migrar el proyecto a Swift 3, descubrí que la solución estaba tomando tiempo debido a los diccionarios y la matriz creada sin tipo de datos.


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

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

Al anotar explícitamente el tipo como este:

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 tipos y la comprobación de tipos de Swift, que lo hacen entrar en un bucle cuando encuentra una matriz larga.

Esto fue en Xcode 6.2. También eliminé ModuleCache como se describe arriba y ahora todo está bien.


Este comportamiento apareció en mi proyecto cuando accidentalmente declare una clase heredada de sí misma. Xcode 8.2.1, usando Swift 3.


Este problema ocurrió como 10 veces, 8 veces sucedió cuando conecté un dispositivo real y no funcionó a través del simulador.

No estoy seguro de si mi solución es buena, pero para mí creo que el problema se debió al cambio entre el simulador y un dispositivo real. Puede sonar extraño, pero fue como si estuviera creando interferencia 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
  • Esperado un poco más de lo normal y sobrecarga 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. Acabo de salir de Xcode y lo abrí de nuevo y el problema desapareció. No estoy seguro de que suponga que podría tratarse de un problema de re indización después de buscar / extraer un nuevo código.


Esto sigue siendo un problema en xcode Versión 7.3.1 (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]


La conversión de Arrays largos a Funciones parece resolver el problema para mí:

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

a:

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


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

Estaba experimentando con el código de depuración a continuació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 podría obtener. Comentarios y comentarios sobre la línea ofensiva dejaban muy claro a lo que SourceKitService se estaba ahogando. Parece que usar más de uno? el operador para proporcionar un valor predeterminado es un problema en una máquina vieja. El trabajo es simplemente no hacerlo. Divídelo en múltiples asignaciones, lo que hace que un feo código de depuración sea incluso más feo.

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

Estaba usando Xcode Version 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 ?? "")


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

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 here

desactivando el control de fuente

Otros pasos que intenté, pero que no ayudaron:

  1. Cerrar Xcode -> Eliminar datos derivados
  2. máquina de ciclismo
  3. proyecto "limpio"

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

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

Cambié el código a siguiente para resolver este problema:

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


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

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

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


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 rápida: Alt + Shift + Comando + K


Paso 4 horas para 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/ todo el caché de /Users/myname/Library/Developer/Xcode/DerivedData/ModuleCache/ como lo sugirió @LNI, después de reiniciar SourceKitService y aplicar 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, el tiempo de compilación es de 3 minutos, no tan rápido, pero mejor durante 42 minutos.

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


Resolví otro problema que causaba que SourceKitService utilizara hasta 13GB 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


Se topó con este problema con Xcode 6.1.1 a principios de esta tarde (no beta, versión oficial lanzada). Había estado ejecutando algún código en el patio de recreo y sospechaba que esa era la causa. La CPU estaba vinculada a casi el 100%, y Xcode no pudo completar las compilaciones.

Entonces esto es lo que hice:

1. Abierto "Activity Monitor", que mostró a SourceKitService como el principal cerdo de la CPU.

2. Dentro de "Monitor de actividad", hizo doble clic en SourceKitService y hizo clic en la sección "Abrir archivos y puertos", que mostraba 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 (de una línea de comando, usando rm -rf). La memoria caché se regenera en función de ¿Puedo eliminar de forma segura los contenidos de la carpeta de datos derivada de Xcode? .

4. Usando Activity Monitor nuevamente, Force-Quit SourceKitServer. Vi el signo ahora demasiado familiar dentro de Xcode diciendo que SourceKitService se había bloqueado (¡por eso es que SourceKitService sonaba familiar!).

5. Repita el paso 3.

La Mac es pacífica, de nuevo. No se perdieron datos y Xcode ni siquiera tuvo que reiniciarse (lo que intenté sin éxito). La conclusión es que ModuleCache parece estar recibiendo SourceKitService en un bucle y borrar la carpeta parece arreglarlo. Espero que esto funcione para usted también.

Bootnote:

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


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 artículos 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.


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 provocó el problema, y ​​eliminar el código comentado lo solucionó.



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 uno pueda ahorrar algo de tiempo a otra persona. Archivé un informe de error a Apple con el número 30103533


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 tipo.

Intenté cualquier otra solución aquí y nada funcionó. Lo que FINALMENTE me arregló fue reiniciar la computadora en modo de recuperación y ejecutar la reparación del disco. ¡Finalmente puedo trabajar en paz nuevamente!

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