SourceKitService Consome CPU e Grinds Xcode para um Halt


108

Este NÃO é um problema Beta. Estou no Xcode 6.0.1, versão de produção. O problema que estou tendo é que quando tento fazer um Build ou Run o código em que estou trabalhando, o Xcode deixa de responder por longos períodos de tempo e o SourceKitService consome mais de 400% da CPU (de acordo com o Activity Monitor). Esse problema é novo nos últimos dias, embora, estranhamente, eu estivesse no Xcode 6.0 desde que foi oficialmente lançado em 17 de setembro. Eu atualizei para 6.0.1 esperando que contivesse uma correção para esse problema.

Alguma ideia de qual poderia ser o problema?


Você verificou o consumo de memória? Eu não tive esse problema por um tempo, mas era muito ruim nos betas, em que consumia toda a RAM e HCF. Geralmente era devido a linhas mais longas de aritmética, especialmente com subscritos. Você precisará dividir e conquistar para encontrar o código ofensivo (mas legal). Quando você encontrar a linha, tente reproduzi-la no Playground e envie um relatório de bug.
Chris Conover,


Ainda existem alguns bugs conhecidos, como você pode ler em vários tópicos nos fóruns de desenvolvedores da Apple. O Xcode 6.1 Beta 3 resolve o alto consumo de CPU, mas apresenta outros diferentes. Muito decepcionante.
Klaas,

1
Estou tendo um problema semelhante. Tive o problema no Xcode 7 e agora no 8. A única coisa que muda é o código que vem em seu Xcode. Meu palpite é que reindexar ou novo código é a causa raiz. Isso geralmente acontece quando você puxa o código do seu upstream?
Honey

Respostas:


150

Tive esse problema com o Xcode 6.1.1 no início desta tarde (não beta, versão oficial lançada). Eu estava executando alguns códigos no Playground e suspeitava que essa fosse a causa. A CPU foi fixada em quase 100% e o Xcode não conseguiu completar as compilações.

Então aqui está o que eu fiz:

1. Abriu o "Monitor de atividade", que mostrou SourceKitService como o principal devorador de CPU.

2. Em "Activity Monitor", clique duas vezes em SourceKitService e clique na seção "Open Files and Ports", que mostra que está trabalhando em arquivos no diretório / Users / myname / Library / Developer / Xcode / DerivedData / ModuleCache / para uma pasta específica.

3. Excluída a pasta especificada (de uma linha de comando, usando rm -rf). O cache é gerado novamente com base em Posso excluir com segurança o conteúdo da pasta de dados derivados do Xcode? .

4. Usando o Activity Monitor novamente, Force-Quit SourceKitServer. Vi o sinal agora muito familiar no Xcode dizendo que SourceKitService havia travado (então é por isso que SourceKitService parecia familiar!).

5. Etapa 3 repetida.

O Mac está em paz, novamente. Nenhum dado foi perdido e o Xcode nem mesmo teve que ser reiniciado (o que eu tentei sem sucesso). O ponto principal é que ModuleCache parece estar colocando SourceKitService em um loop e excluir a pasta parece consertar isso. Espero que isto funcione para você também.

Nota de inicialização:

A propósito, a causa do problema de SourceKitService era que eu tinha uma declaração de array muito longa em minha classe Swift. Eu tinha mais de 200 entradas em uma matriz. Reduziu para 30 e o erro foi embora. Portanto, o problema pode ter surgido devido a algum tipo de estouro de pilha no código da Apple (trocadilho intencional).


Obrigado pela sua resposta. Você deve editar sua resposta em vez de comentar por conta própria.
Axalo

3
Tive um problema semelhante com uma declaração de matriz longa no Swift que dependia da inferência de tipo durante sua inicialização. Descobri que anotando explicitamente o tipo resolveu o problema.
Jay492355

2
Mesmo problema. grande variedade de dicionários. Acabei de colocar todos os dados em um arquivo .PLIST e lê-lo.
Bruno Paulino

64
Incomoda alguém que em 2016 não possamos lidar com um array de 200 elementos? Eu usei arrays mais longos em BASIC em um Atari 600 nos anos 80.
Eddie Sullivan

2
Eu tive o mesmo problema agora e, como @ jay492355 mencionou, você precisa digitar explicitamente seu array.
Guy Kogus

23

Eu estava vendo o problema porque estava declarando uma matriz com cerca de 60 elementos que se pareciam com isto:

let byteMap = [

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

Anotando explicitamente o tipo como este:

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

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

Eu fui capaz de fazer isso parar. Acho que deve ter algo a ver com a inferência de tipo e verificação de tipo do Swift que o faz entrar em um loop quando encontra um array longo.

Isso estava no Xcode 6.2. Eu também deletei o ModuleCache conforme descrito acima e agora está tudo bem.



1
Problema semelhante para mim no Xcode 8.1. Eu tenho uma matriz de objetos NSConstraintLayout. Funcionou bem com 4. Funciona bem com 6. Não tão bem com 7 e nem funciona com 8. Eu criei dois arrays com 4 objetos cada e funcionou bem.
Dan Loughney

@ onmyway133 Eu me pergunto por que isso não acontece o tempo todo e só acontece ocasionalmente
Honey

Você acha que se tivesse algo como return ["a", "b", "c", "d", "e", "f"]em uma função que retorna [String]que ainda teria problemas com a inferência de tipo?
shim de

10

Esse problema aconteceu umas 10, 8 vezes quando conectei um dispositivo real e não executei o simulador.

Não tenho certeza se minha solução é boa, mas para mim acredito que o problema foi devido à troca entre o simulador e um dispositivo real. Pode parecer estranho, mas era como se estivesse criando interferência entre os arquivos de cache .

O que resolveu meu problema:

  • Limpar pasta de compilação: (no Xcode)Alt + Shift + Command + K
  • Redefinir conteúdo e configurações: (no simulador) Command + Shift + K.
  • Esperou um pouco mais do que o normal e sobrecarregou o Xcode com cliques constantes

Portanto, basicamente, antes de tentar executar em qualquer novo dispositivo, basta excluir qualquer cache.

EDITAR

Acabei de ter o problema sem qualquer conexão de dispositivo. Acabei de sair do Xcode, abri-o novamente e o problema desapareceu. Não tenho certeza, meu palpite é que pode haver algum problema de reindexação depois de buscar / puxar mesclar novo código.


Eu realmente queria que isso funcionasse, porque estou desesperado. Infelizmente, ele começa a sair do controle novamente momentos depois que eu começo a programar.
Sr. T

Não tenho certeza, mas às vezes apenas trocar de branch, puxar do upstream já resolveu meu problema. O que quero dizer é que não faço o que a resposta aceita está sugerindo e, no entanto, meu problema foi resolvido de alguma forma que ainda não resolvi: /
Honey

4

Resolvi outro problema que fazia com que SourceKitService usasse até 13 GB de memória ...

Eu tinha String (linha de formato com muitos 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)

quando substituído por este funcionou bem (sem acumulação de memória e 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

4
Como você descobriu que esse pedaço de código era o problema?
KK

3

Tenho encontrado esse problema com o Xcode 9 e explorei várias soluções. Para mim, desabilitar o controle de origem parecia funcionar.

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

Se isso não funcionar, eu recomendaria usar o comando renice no terminal . Mais sobre isso aqui

desabilitando o controle de fonte

Outras etapas que tentei, mas não ajudaram:

  1. Fechar Xcode -> Excluir Dados Derivados
  2. máquina de ciclismo
  3. projeto "limpo"

2

Para mim, funcionou para excluir os Dados Derivados. Selecione 'Produto' no menu e segure a tecla Alt e selecione 'Limpar pasta de compilação'. Atalho: Alt + Shift + Command + K


2
  1. Saia do Xcode
  2. Executar no Terminal:

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


Observe a diferença entre a resposta aceita de LNI e esta:

  1. É sempre melhor não travar do que travar. Especialmente, quando se trata de processos / componentes do Xcode.
  2. Não sou um desenvolvedor da Apple, mas a exclusão parcial do cache pode quebrar sua integridade. Não notei nenhum atraso significativo após limpar todo o cache.

2

Eu gasto 4 horas para descobrir problemas em uma longa compilação do meu projeto. A primeira tentativa leva 42 minutos para compilar.

/Users/myname/Library/Developer/Xcode/DerivedData/ModuleCache/Limpo todo o cache conforme sugerido por @LNI, após reiniciar SourceKitServicee aplico algumas alterações no código:

1) Para

    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)

Para

           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, o tempo de compilação - 3 min, não tão rápido, mas melhor por 42 min.

Como resultado, antes SourceKitService- leva ~ 5,2 Gb de memória e depois de ~ 0,37 Gb

insira a descrição da imagem aqui



2

Não crie dicionário rapidamente sem especificar os tipos de dados ou com [String: Any]

Se usarmos o tipo 'Qualquer', o compilador pode executar um loop infinito para verificar o tipo de dados.

Não criará nenhum erro de compilação, fará com que nosso mac congele na 'compilação de arquivos de origem swift' com a aquisição de muita memória para as tarefas chamadas 'swift' e 'SourceKitService'.


2

Eu enfrentei esse problema. O serviço do kit de origem estava usando 10 gb de uso. O processo rápido no monitor de atividade atinge mais de 6 GB de uso. Eu estava usando o seguinte código:

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]

Mudei o código a seguir para resolver esse problema:

detalhes da var: [String: Qualquer] = [:]

detalhes ["1"] = 1

detalhes ["2"] = 2

detalhes ["3"] = 3

detalhes ["4"] = 4

detalhes ["5"] = 5

detalhes ["6"] = 6

detalhes ["7"] = 7

detalhes ["8"] = 8

detalhes ["9"] = 9

detalhes ["10"] = 10

detalhes ["11"] = 11

detalhes ["12"] = 12

detalhes ["13"] = 13

detalhes ["14"] = 14

detalhes ["15"] = 15

detalhes ["16"] = 16


Cara .... quem teria pensado .... Eu tinha exatamente um código semelhante e tinha SourceKitService sugando a vida da CPU. Alterar o código simplesmente fez com que ele desaparecesse.
AnBisw

2

O problema ainda ocorre no XCode 10.0. Você pode corrigi-lo desativando "Mostrar alterações de controle de origem" nas opções de controle de origem.

insira a descrição da imagem aqui


Legal, mas menos do que o necessário se estiver fazendo o Xcode parar.
Shayne

1

Enfrentou o mesmo problema em Xcode 7.2 (7C68)

A solução foi implementar um método de protocolo, que minha classe tinha na definição.


1

Este ainda é um problema no xcode versão 7.3.1 (7D1014) a causa para mim era, como LNI apontou, um array muito longo, não tão longo na verdade. Corrigi meu problema dividindo a matriz em várias matrizes 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]

1

Tive o mesmo problema com o XCode 8.2.1 (8C1002) e o seguinte 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") + "%")
    }
}

e essas extensões:

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

Eu resolvi isso comentando esta linha no TestViewController:

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

Levei mais de uma hora para encontrá-lo, espero que possa economizar algum tempo de outra pessoa. Eu preenchi um relatório de bug para a Apple com o número 30103533


1

Eu estava enfrentando o mesmo problema depois de migrar o projeto para o swift 3, descobrir a solução que estava demorando por causa dos dicionários e array criados sem tipo de dados.


1

Esse comportamento apareceu em meu projeto quando eu acidentalmente declarei uma classe que herdou de si mesma. Xcode 8.2.1, usando Swift 3.


1

Eu também tive esse problema, no meu caso, eu estava declarando uma grande matriz como esta:

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

Resolvi o problema adicionando os itens 1 por linha em vez de todos ao mesmo tempo:

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

isso resolveu o problema.


1

Para projetos Objective-C:

Eu tive o mesmo problema e não há código Swift em nosso projeto, então não era o verificador de inferência de tipo.

Tentei todas as outras soluções aqui e nada funcionou - o que FINALMENTE consertou para mim foi reiniciar o computador em modo de recuperação e executar o reparo do disco. Posso finalmente trabalhar em paz de novo!

Eu estou supondo que isso aconteceu por causa de alguns links simbólicos quebrados, provavelmente apontando um para o outro e fazendo o serviço funcionar em um loop infinito.


1

Estou tendo um problema semelhante com o Xcode 8.2.1 - com uma seção de mais de 1.000 linhas de código comentadas via / * * /. Comentar a seção causava o problema e a remoção do código comentado corrigiu o problema.


1

Corri para algo semelhante combinando vários ?? operadores para fornecer um padrão para valores de string opcionais.

Eu estava testando o código de depuração abaixo quando o ventilador do meu confiável MacBook Pro de meados de 2010 começou a funcionar com força. SourceKitService estava sugando cada ciclo de CPU que podia obter. Comentar e descomentar a linha ofensiva deixou muito claro o que SourceKitService estava sufocando. Parece que está usando mais de um ?? operador fornecer um padrão é um problema em uma máquina antiga. A solução é simplesmente não fazer isso. Divida-o em várias atribuições, o que torna alguns códigos de depuração feios ainda mais feios.

placeMark é uma instância de CLPlacemark. As propriedades usadas aqui retornam strings opcionais.

Eu estava usando o Xcode versão 8.3.2 (8E2002) em execução no 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 ?? "")

Eu acredito que este é um problema com a concatenação de strings e não ??. Em vez disso, valeria a pena tentar com "\() \()" (interpolação de string)
Brooks DuBois

1

A conversão de matrizes longas em funções parece resolver o problema para mim:

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

para:

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

1

executado no terminal:

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

você também pode criar um 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

e então apenas corra

xcodeFix

0

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

SourceKitService se encarregou do trabalho de inferência de tipo de Swift.

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

mude para digitar explicitamente

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

O uso da CPU do SourceKitService cai imediatamente。


0

Aconteceu comigo no XCode 11.4.1 ao chamar os subscritos @dynamicMemberLookup dentro de um bloco SwiftUI @ViewBuilder.


0

Eu tive o mesmo problema e foi causado por um erro de programação.

No meu caso, eu estava implementando os protocolos comparáveis ​​e equacionáveis ​​e lhs.param e rhs.param não correspondiam aos parâmetros das classes lhs e rhs.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.