SourceKitServiceがCPUを消費し、Xcodeを停止する


108

これはベータ版の問題ではありません。Xcode 6.0.1、製品版を使用しています。私が抱えている問題は、作業中のコードをビルドまたは実行しようとすると、Xcodeが長時間応答しなくなり、SourceKitServiceがCPUの400%以上を消費することです(Activity Monitorによると)。この問題はここ数日で新しくなりましたが、奇妙なことに、9月17日に正式にリリースされてからXcode 6.0を使用していました。この問題の修正が含まれることを期待して6.0.1にアップグレードしました。

問題が何であるかについて何か考えはありますか?


メモリ消費量を確認しましたか?私はしばらくの間この問題に遭遇していませんが、すべてのRAMを消費してからHCFを消費するベータ版では本当に悪かったです。これは一般的に、特に添字を使用した場合の算術の長い行が原因でした。問題のある(ただし合法的な)コードを見つけるには、分割して征服する必要があります。行が見つかったら、プレイグラウンドで再現して、バグレポートを送信してください。
Chris Conover、2014年

また、これらの確か日付の記事を参照してください。stackoverflow.com/questions/24873219/...stackoverflow.com/questions/24873219/...
クリス・コノバー

Apple開発者フォーラムのいくつかのスレッドで読むことができるので、まだいくつかの既知のバグがあります。Xcode 6.1 Beta 3は、CPUの高い消費を解決しますが、異なるものを導入します。期待はずれの。
Klaas、2014年

1
同様の問題が発生しています。Xcode 7と8で問題が発生しました。変更されるのは、Xcodeに含まれるコードのみです。私の推測では、インデックスの再作成または新しいコードが根本的な原因です。これは通常、上流からコードをプルしたときに発生しますか?
Honey

回答:


150

今日の午後にXcode 6.1.1でこの問題に遭遇しました(ベータ版ではなく、公式リリースバージョン)。私はPlaygroundでいくつかのコードを実行しており、それが原因であると疑っていました。CPUがほぼ100%に固定され、Xcodeはビルドを完了できませんでした。

だからここに私がやったことがあります:

1.「アクティビティモニター」を開き、SourceKitServiceをメインのCPUホグとして表示しました。

2. [アクティビティモニター]内で、SourceKitServiceをダブルクリックし、[ファイルとポートを開く]セクションをクリックしました。特定のフォルダ用。

3.指定したフォルダーを削除します(コマンドラインから、rm -rfを使用)。Xcode Derived dataフォルダーの内容を安全に削除できますか?に基づいてキャッシュが再生成されますか?

4.アクティビティモニターを再び使用して、SourceKitServerをForce-Quitします。Xcode内であまりに馴染みのあるサインを見て、SourceKitServiceがクラッシュしたと述べました(そのため、SourceKitServiceはおなじみのように聞こえました!)。

5.手順3を繰り返します。

Macもまた平和です。データが失われることはなく、Xcodeを再起動する必要もありませんでした(これは失敗しました)。結論としては、ModuleCacheがSourceKitServiceをループで取得しているようで、フォルダーを削除すると問題が解決するようです。これもあなたのために働くことを願っています。

ブートノート:

ちなみに、SourceKitServiceの問題の原因は、Swiftクラスの配列宣言が長すぎることです。配列に200を超えるエントリがありました。それを30に減らし、エラーはなくなりました。そのため、問題は、アップルコードでのある種のスタックオーバーフローが原因で発生した可能性があります(意図的なしゃれ)。


ご回答有難うございます。ただし、自分でコメントするのではなく、回答を編集する必要があります。
Axalo、2015年

3
初期化中に型推論に依存していたSwiftの長い配列宣言で同様の問題が発生しました。型に明示的に注釈を付けることで問題が解決することがわかりました。
jay492355 2015年

2
同じ問題。辞書付きの大きな配列。すべてのデータを.PLISTファイルに入れて読み取るだけです。
Bruno Paulino

64
2016年に200要素の配列を処理できないことを他の人が気にしていますか?私は80年代のAtari 600のBASICで長いアレイを使用していました。
Eddie Sullivan

2
今は同じ問題があり、@ jay492355が述べたように、配列を明示的に入力する必要があります。
Guy Kogus 2017

23

次のような要素が約60個ある配列を宣言していたため、問題が発生していました。

let byteMap = [

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

次のようにタイプに明示的に注釈を付けることにより:

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

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

やめることができました。長い配列に遭遇したときにループに入るようにするSwiftの型推論と型チェックと関係があるのではないかと思います。

これはXcode 6.2にありました。上記のようにModuleCacheも削除しましたが、すべて正常になりました。



1
Xcode 8.1で同様の問題が発生しました。NSConstraintLayoutオブジェクトの配列があります。4.で問題なく動作します。6。で問題なく動作します。7。ではあまり良くなく、8。ではまったく動作しません。それぞれ4つのオブジェクトを持つ2つの配列を作成しましたが、うまく動作します。
Dan Loughney、2016年

@ onmyway133なぜそれがいつも起こらないのか、それがたまにしか起こらないのかしら
ハニー

あなたはのようなものがあったらと思いますreturn ["a", "b", "c", "d", "e", "f"]機能に戻っていることを[String]それそれはまだ、型推論に問題があるのでしょうか?
シム2017年

10

この問題は、実際のデバイスを接続してシミュレータを実行しなかった場合に10回、8回のように発生しました。

私のソリューションが良いものかどうかはわかりませんが、問題はシミュレータと実際のデバイスの切り替えが原因だったと思います。奇妙に聞こえるかもしれませんが、それはまるでキャッシュファイル間の干渉を引き起こしているかのようでした。

私の問題を解決したもの:

  • クリーンビルドフォルダー:(Xcode上)Alt + Shift + Command + K
  • コンテンツと設定のリセット:(シミュレータ上)Command + Shift + K
  • 通常より少し長く待機し、一定のクリックでXcodeをオーバーロード

したがって、基本的には、新しいデバイスで実行する前に、キャッシュを削除してください。

編集

デバイスを接続せずに問題が発生しました。Xcodeを終了して再び開いたところ、問題は解決しました。新しいコードをフェッチまたはプルしてマージした後、インデックスの再作成の問題が発生する可能性があるかどうかはわかりません。


私は私が絶望的であるこの働いたクスを本当に望みました。残念ながら、コーディングを開始した直後に、再び制御不能になり始めます。
T氏

よくわかりませんが、ブランチを切り替えるだけで、アップストリームからプルすることで問題が解決しました。私のポイントは、受け入れられた答えが示唆していることを私はしていませんが、それでも私の問題は何とか解決されていません:/
Honey

4

SourceKitServiceが最大13GBのメモリを使用する原因となっていた別の問題を解決しました...

私は文字列(たくさんの引数を持つフォーマット行:

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)

これと置き換えると、うまく機能しました(メモリが蓄積せず、通常の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
このコードが問題であるとどうやってわかりましたか?
KK

3

Xcode 9でこの問題に遭遇し、いくつかの解決策を模索してきました。私にとって、ソース管理を無効にすることでうまくいくように見えました。

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

これが機能しない場合は、ターミナルreniceコマンドを使用することをお勧めします。詳細はこちら

ソース管理を無効にする

私が試みたが助けにはならなかった他のステップ:

  1. Xcodeを閉じる->派生データを削除
  2. サイクリングマシン
  3. 「クリーン」プロジェクト

2

私にとっては、派生データを削除するのに役立ちました。メニューから[Product]を選択し、Altキーを押しながら[Clean Build Folder]を選択します。ショートカット:Alt + Shift + Command + K


2
  1. Xcodeを終了
  2. ターミナルで実行:

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


LNIの受け入れられた回答とこの回答の違いに注意してください。

  1. クラッシュするよりも、クラッシュしない方が常に良いです。特に、Xcodeプロセス/コンポーネントに関しては。
  2. 私はApple開発者ではありませんが、キャッシュを部分的に削除すると整合性が失われる可能性があります。すべてのキャッシュを消去した後、大幅な遅延に気づきませんでした。

2

私はプロジェクトの長いコンパイルの問題を理解するために4時間を費やしています。最初の試行は、コンパイルに42分かかります。

/Users/myname/Library/Developer/Xcode/DerivedData/ModuleCache/再起動後、@ LNIの提案に従ってすべてのキャッシュをクリアしSourceKitService、コードにいくつかの変更を適用します。

1)に

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

から

    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
            }

から

           let value1 = obj.property ?? defaultValue

3)

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

から

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

その結果、コンパイル時間-3分、それほど速くはありませんが、42分ほど良くなります。

その結果、前にSourceKitService-約5,2Gbのメモリを使用し、約0.37Gb後に使用します。

ここに画像の説明を入力してください


2

SourceKitServiceにも同じ問題がありました。

解決しました。FOR LOOPでサブビューを追加しないでください。

私が使用する問題を検出するには:https : //github.com/RobertGummesson/BuildTimeAnalyzer-for-Xcode


どのように解決しましたか?forループを使用してサブビューを追加しましたが、キャッシュをクリーンアップしても@Zhanserikは修正されません
10donovanr

1
@ 10donovanrは、ループのサブビューを追加しないでください。その後、CMD + SHITF + Kでアプリのキャッシュをクリーンアップしてみてください
Zhanserik

2

データ型を指定せずに、または[String:Any]を使用して迅速に辞書を作成しないでください

「Any」タイプを使用する場合、コンパイラはデータタイプをチェックするために無限ループに陥る可能性があります。

コンパイルエラーは発生せず、「swift」と「SourceKitService」という名前のタスク用に多くのメモリを獲得して、Macを「迅速なソースファイルのコンパイル」でフリーズさせます。


2

私はそのような問題に直面しました。ソースキットサービスは10 GBの使用量を使用していました。アクティビティモニターのSwiftプロセスが6 GBを超える使用に達します。私は次のコードを使用していました:

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]

この問題を解決するために、コードを次のように変更しました。

var詳細:[文字列:任意] = [:]

詳細["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


男...誰が思ったのだろう...私もまったく同じようなコードを持っていて、SourceKitServiceにCPUの命を奪ってもらいました。コードを変更すると、コードが消えてしまいます。
AnBisw 2017年

2

問題はXCode 10.0でも発生します。ソース管理オプションで「ソース管理の変更を表示」を無効にすることで修正できます。

ここに画像の説明を入力してください


クールですが、Xcodeの動作が止まってしまう場合は、それほど必要ではありません。
Shayne、

1

同じ問題に直面しました Xcode 7.2 (7C68)

解決策は、私のクラスが定義に持っていたプロトコルのメソッドを実装することでした。


1

これはまだxcodeバージョン7.3.1(7D1014)の問題です。LNIが指摘したように、配列が長すぎるため、実際にはそれほど長くありませんでした。このように配列をさまざまな配列に分割することで問題を解決しました。

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

XCode 8.2.1(8C1002)と次のコードでも同じ問題が発生しました。

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

そしてこれらの拡張:

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

TestViewControllerでこの行をコメント化して解決しました。

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

それを見つけるのに1時間以上かかったので、他の誰かの時間を節約できることを願っています。番号30103533のバグレポートをAppleに提出しました


1

プロジェクトをSwift 3に移行した後も同じ問題に直面していました。データ型なしで作成された辞書と配列のために時間がかかっていた解決策を見つけてください。


1

この動作は、自分から継承したクラスを誤って宣言したときに私のプロジェクトに表示されました。Xcode 8.2.1、Swift 3を使用。


1

私にもこの問題があり、私の場合、次のような大きな配列を宣言していました:

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

一度にすべてではなく1行に1つずつ項目を追加することで問題を解決しました。

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

これで問題が解決しました。


1

Objective-Cプロジェクトの場合:

同じ問題があり、プロジェクトにSwiftコードが含まれていないため、型推論チェッカーではありませんでした。

私はここで他のすべての解決策を試しましたが、何もうまくいきませんでした-最後に私のためにそれを修正したのは、回復モードでコンピューターを再起動し、ディスク修復を実行することでした。ようやく安心して働けるようになりました!

おそらくシンボリックリンクが壊れているために起こったのではないかと思います。おそらく互いに向き合っており、サービスを無限ループで実行させています。


1

Xcode 8.2.1で同様の問題が発生しています。1,000行以上のコードのセクションが/ * * /でコメント化されています。セクションをコメントアウトすると問題が発生し、コメントアウトされたコードを削除すると修正されました。


1

私は複数を組み合わせて似たようなものに遭遇しました?? オプションの文字列値のデフォルトを提供する演算子。

2010年中頃に信頼できるMacBook Proのファンが激しく動作し始めたとき、以下のデバッグコードを試していました。SourceKitServiceは、取得可能なすべてのCPUサイクルを吸収していました。問題のある行にコメントを付けたり、コメントを外したりすると、SourceKitServiceが何を要求しているかが非常に明確になりました。複数使用しているようです?? デフォルトを提供するオペレーターは、古いマシンの問題です。回避策は、実行しないことです。それを複数の割り当てに分割すると、醜いデバッグコードがさらに醜くなります。

placeMarkはCLPlacemarkのインスタンスです。ここで使用されるプロパティは、オプションの文字列を返します。

OS 10.12.4(16E195)で実行されているXcodeバージョン8.3.2(8E2002)を使用していました

// 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 ?? "")

これは文字列連結の問題であり、?? "\() \()" 代わりに(文字列補間)を試してみる価値があります
Brooks DuBois

1

長い配列を関数に変換すると、問題が解決するようです:

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

に:

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

1

端末で実行:

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

このエイリアスを使用して端末コマンドを作成することもできます。

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

そして、ただ走る

xcodeFix


0

SwiftUI @ViewBuilderブロック内で@dynamicMemberLookup添え字を呼び出すときに、XCode 11.4.1で私に起こりました。


0

同じ問題が発生しましたが、それはプログラミングエラーが原因でした。

私の場合、同等でエクアタブルなプロトコルを実装していて、lhs.paramとrhs.paramがlhsクラスとrhsクラスのパラメーターに対応していませんでした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.