web-dev-qa-db-ja.com

SourceKitServiceはCPUを消費し、Xcodeを停止させます

これはベータ版の問題ではありません。私はXcode 6.0.1の製品版をリリースしています。私が抱えている問題は、作業中のコードをビルドまたは実行しようとすると、Xcodeが長時間応答しなくなり、SourceKitServiceがCPUの400%以上を消費することです(アクティビティモニターによると)。この問題はここ数日で新しくなりましたが、奇妙なことに、9月17日に公式にリリースされて以来、Xcode 6.0を使用していました。

問題が何であるかについてのアイデアはありますか?

99
zeeple

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

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

1.「Activity Monitor」を開き、SourceKitServiceがメインCPUホグとして表示されました。

2.「アクティビティモニター」内で、SourceKitServiceをダブルクリックし、「ファイルとポートを開く」セクションをクリックしました。これは、/ Users/myname/Library/Developer/Xcode/DerivedData/ModuleCache /ディレクトリの下のファイルで動作していることを示しています特定のフォルダ用。

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

4.再度アクティビティモニターを使用して、SourceKitServerを強制終了します。 SourceKitServiceがクラッシュしたことを示す、Xcode内のあまりにも馴染みのある記号を見ました(そのため、SourceKitServiceはおなじみのように聞こえました!)。

5.手順3を繰り返した。

Macは再び平和です。データは失われず、Xcodeを再起動する必要さえありませんでした(これは失敗しました)。一番下の行は、ModuleCacheがループ内でSourceKitServiceを取得しているようで、フォルダーを削除すると問題が修正されるようです。これがあなたにも役立つことを願っています。

ブートノート:

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

142
LNI

この問題は、次のような約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も削除しましたが、現在はすべて正常です。

21
jay492355

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

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

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

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

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

編集

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

10
Honey

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

String(format行に多くの引数がありました:

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
Matej Ukmar

Xcode 9でこの問題に遭遇し、いくつかの解決策を検討しました。私にとっては、ソース管理の無効化がうまくいくように見えました。

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

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

ソース管理の無効化

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

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

私にとっては、派生データを削除するのに役立ちました。メニューから[製品]を選択し、Altキーを押しながら[ビルドフォルダーのクリーンアップ]を選択します。ショートキー:Alt + Shift + Command + K

2
Roland Keesom

私はそのような問題に直面しました。ソースキットサービスは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 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

2
Jignesh Patel

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

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

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の後にメモリを使用します

enter image description here

2
gbk

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

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

コンパイルエラーは発生しません。「Swift」および「SourceKitService」という名前のタスク用に多くのメモリを取得し、「Swiftソースファイルのコンパイル」でMacがフリーズします。

2
ak_ninan

これはまだ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
Tharak

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

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

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


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

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

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

1
Vijay Pal

私もこの問題を抱えていました。私の場合、次のような大きな配列を宣言していました。

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

私はすべてではなく、行ごとにアイテム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
Chuy47

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

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

に:

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

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

1
KGBlacksmith

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

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

ここで他のすべてのソリューションを試しましたが、何も機能しませんでした-最終的に修正したのは、回復モードでコンピューターを再起動し、ディスクの修復を実行することでした。ようやく安心して働けるようになりました!

おそらく相互に指し示し、サービスを無限ループで走らせているいくつかの壊れたシンボリックリンクが原因で起こったと推測しています。

1
Accatyyc

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

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

1
Dmitry Kurilo

ターミナルで実行:

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
1
Dmitry Kozlov

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時間以上かかったので、他の人の時間を節約できるといいのですが。 Appleに番号30103533でバグレポートを提出しました

1

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

enter image description here

1
DennyDog

SourceKitServiceでも同じ問題が発生しました。

解決しました。ループ用にサブビューを追加しないでください。

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

1
Zhanserik

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

2010年半ばの信頼できるMacBook Proのファンが激しく動き始めたとき、以下のデバッグコードを試していました。 SourceKitServiceは、取得できるCPUサイクルごとに吸い上げていました。問題のある行にコメントを付けてコメントを外すと、SourceKitServiceが窒息しているものが非常に明確になりました。複数を使用しているように見えますか?デフォルトを提供する演算子は、古いマシンの問題です。回避策は、それをしないことです。それを複数の割り当てに分割すると、evenいデバッグコードがさらに見苦しくなります。

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 ?? "")
1
Positron

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

SourceKitServiceは、Swiftの型推論作業を担当しました。

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

明示的に入力するように変更する

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

SourceKitServiceのCPU使用率はすぐに低下します。

0
lbsweek