source

SourceKit 서비스가 CPU를 사용하고 X코드를 그라인딩하여 중지

lovecheck 2023. 5. 17. 23:18
반응형

SourceKit 서비스가 CPU를 사용하고 X코드를 그라인딩하여 중지

이것은 베타 문제가 아닙니다.저는 Xcode 6.0.1, 생산 릴리즈에 있습니다.문제는 작업 중인 코드를 빌드하거나 실행하려고 하면 Xcode가 장시간 응답하지 않고 SourceKit Service가 CPU의 400% 이상을 사용한다는 것입니다(Activity Monitor에 따르면).9월 17일 공식 출시된 이후로 저는 Xcode 6.0을 사용하고 있었지만, 이 문제는 지난 며칠 동안 새로운 문제입니다.이 문제에 대한 수정 사항이 포함되기를 바라며 6.0.1로 업그레이드했습니다.

문제가 무엇인지 아십니까?

오늘 오후 초에 Xcode 6.1.1에서 이 문제가 발생했습니다(베타가 아닌 공식 출시 버전).나는 플레이그라운드에서 코드를 실행하고 있었고 그것이 원인이라고 의심하고 있었습니다.CPU가 거의 100%로 고정되었고 Xcode는 빌드를 완료할 수 없었습니다.

그래서 제가 한 일은 다음과 같습니다.

소스킷 서비스를 주 CPU 호그로 표시하는 "활동 모니터"를 열었습니다.

"Activity Monitor"에서 SourceKit 서비스를 두 번 클릭하고 "Open Files and Ports" 섹션을 클릭하면 특정 폴더의 /Users/myname/Library/Developer/Xcode/DerivedData/ModuleCache/디렉토리 아래의 파일에서 작업 중임을 알 수 있습니다.

지정한 폴더를 삭제했습니다(명령줄에서 rm -rf 사용)."Xcode Derived data folder의 내용을 안전하게 삭제할 수 있습니까?"에 따라 캐시가 재생성됩니다.

작업 모니터를 다시 사용하여 소스 키트 서버를 강제 종료합니다.소스킷 서비스가 충돌했다는 Xcode 내의 친숙하지 않은 표지판을 보았습니다(그래서 소스킷 서비스가 친숙하게 들렸습니다!).

3단계를 반복합니다.

맥은 다시 평화롭습니다.데이터가 손실되지 않았으며 Xcode를 다시 시작할 필요도 없었습니다(제가 시도했지만 실패했습니다).결론은 ModuleCache가 SourceKitService를 루프에서 가져오는 것처럼 보이고 폴더를 삭제하면 해결되는 것처럼 보인다는 것입니다.이것이 당신에게도 효과가 있기를 바랍니다.

부팅 노트:

그런데 소스킷 서비스 문제의 원인은 스위프트 수업에서 어레이 선언이 너무 길었기 때문입니다.저는 200개 이상의 항목을 배열했습니다.30으로 줄이자 오류가 사라졌습니다.따라서 애플 코드의 스택 오버플로(pun 의도)로 인해 문제가 발생했을 수 있습니다.

다음과 같은 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)],

저는 그것을 멈출 수 있었습니다.스위프트의 활자 추론과 활자 점검이 긴 배열을 만나면 루프 상태가 되는 것과 관련이 있을 것이라고 생각합니다.

이것은 Xcode 6.2에 있었습니다.ModuleCache도 위와 같이 삭제하여 현재 모든 것이 정상입니다.

이 문제는 실제 장치를 연결하고 시뮬레이터를 통해 실행하지 않았을 때 10번, 8번 정도 발생했습니다.

제 솔루션이 좋은 솔루션인지는 잘 모르겠지만, 시뮬레이터와 실제 장치 간의 전환으로 인해 문제가 발생했다고 생각합니다.이상하게 들릴 수도 있지만 마치 캐시 파일 간에 간섭을 일으키는 것 같았습니다.

내 문제를 해결한 것:

  • 빌드 폴더 정리:(Xcode에서)Alt + Shift + Command + K
  • 콘텐츠 설정 재설정: (Simulator에서)Command + Shift + K.
  • 정상보다 조금 오래 대기하고 계속 클릭하여 Xcode를 과부하시킵니다.

따라서 기본적으로 새 장치에서 실행하기 전에 캐시를 삭제하면 됩니다.

편집

장치 연결 없이 문제가 발생했을 뿐입니다.방금 Xcode를 종료하고 다시 열었더니 문제가 사라졌습니다. 코드를 가져오거나 끌어다 놓은 후에 다시 인덱싱하는 문제가 발생할 수 있습니다.

SourceKit Service에서 최대 13GB의 메모리를 사용하게 되는 다른 문제를 해결했습니다.

String(인수가 많은 형식 줄:

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

XCode 10.0에서 여전히 문제가 발생합니다.소스 제어 옵션에서 "소스 제어 변경사항 표시"를 사용 불가능으로 설정하여 수정할 수 있습니다.

여기에 이미지 설명 입력

저는 제 프로젝트의 긴 편집 과정에서 문제를 파악하기 위해 4시간을 소비합니다.첫 번째 시도는 컴파일하는 데 42분이 걸립니다.

모든캐지우에서 ./Users/myname/Library/Developer/Xcode/DerivedData/ModuleCache/@ @LNI를 재시작한 에는 @LNI를 합니다.SourceKitService코드에 대해 몇 가지 변경 사항을 적용합니다.

행선지

    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: "" ]

행선지

            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 이후의 메모리 사용

여기에 이미지 설명 입력

소스킷 서비스에 대해서도 같은 문제가 있었습니다.

풀었어요.루프에 대한 하위 뷰를 추가하지 마십시오.

문제를 탐지하려면 https://github.com/RobertGummesson/BuildTimeAnalyzer-for-Xcode 을 사용합니다.

저는 Xcode 9에서 이 문제에 부딪혔고 몇 가지 해결책을 탐구했습니다.게는 소스 제어를 비활성화하는 것이 효과가 있는 것처럼 보였습니다.

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

이것이 작동하지 않으면 터미널에서 renice 명령을 사용하는 것을 추천합니다.자세한 내용은 여기.

소스 제어 사용 안 함

시도했지만 도움이 되지 않는 다른 단계:

  1. Xcode 닫기 -> 파생 데이터 삭제
  2. 사이클링 머신
  3. "깨끗한" 프로젝트

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

소스킷 서비스는 스위프트의 유형 추론 작업을 담당했습니다.

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

명시적 유형으로 변경

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

SourceKitService CPU 사용량 즉시 드롭다운 »

저에게는 파생 데이터를 삭제하는 것이 효과가 있었습니다.메뉴에서 'Product'를 선택하고 Alt 키를 누른 상태에서 'Clean Build Folder'를 선택합니다.단축키:Alt + Shift + 명령 + K

  1. Xcode 종료
  2. 터미널에서 실행:

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


LNI의 승인된 답변과 다음 답변의 차이점에 유의하십시오.

  1. 충돌하는 것보다 충돌하지 않는 것이 항상 더 좋습니다.특히 Xcode 프로세스/구성요소에 관해서는 더욱 그렇습니다.
  2. 저는 Apple 개발자는 아니지만 캐시를 부분적으로 삭제하면 무결성이 손상될 수 있습니다.모든 캐시를 청소한 후에 큰 지연이 발생하지 않았습니다.

데이터 형식을 지정하지 않거나 [String:임의]

Any' 유형을 사용하면 컴파일러가 데이터 유형을 확인하기 위해 무한 루프에 빠질 수 있습니다.

컴파일 오류가 발생하지 않으며, 'swift' 및 'SourceKitService'라는 작업을 위해 많은 메모리를 획득하면서 'swift 소스 파일 컴파일'에서 Mac이 동결됩니다.

나는 여러 개를 결합한 비슷한 것과 마주쳤습니다?연산자를 사용하여 선택적 문자열 값의 기본값을 제공합니다.

신뢰할 수 있는 2010년 중반 맥북 프로의 팬이 열심히 작동하기 시작했을 때 아래 디버깅 코드를 실험하고 있었습니다.SourceKitService는 얻을 수 있는 모든 CPU 사이클을 흡수하고 있었습니다.악의적인 부분에 대해 언급하고 주석을 제거함으로써 소스킷 서비스가 질식하는 원인이 무엇인지 매우 분명해졌습니다.둘 이상을 사용하는 것처럼 보입니다.기본값을 제공하는 연산자는 이전 컴퓨터의 문제입니다.주변의 일은 단지 그것을 하지 않는 것입니다.여러 개의 할당으로 분할하여 일부 추악한 디버그 코드를 더욱 추하게 만듭니다.

placeMark는 CLPplaceMark의 인스턴스입니다.여기에 사용된 속성은 선택적 문자열을 반환합니다.

OS 10.12.4(16E195)에서 실행되는 Xcode Version 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 ?? "")

긴 배열을 함수로 변환하면 문제가 해결되는 것 같습니다.

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

대상:

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

저는 그런 문제에 직면한 적이 있습니다.소스 키트 서비스가 10gb의 사용량을 사용하고 있습니다.작업 모니터의 빠른 프로세스가 6GB 이상의 사용량에 도달합니다.다음 코드를 사용했습니다.

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, "13":13, "14":14, "15":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

에 대해 동일한 문제에 직면했습니다.Xcode 7.2 (7C68)

해결책은 프로토콜의 방법을 구현하는 것이었는데, 우리 반은 이 정의를 가지고 있었습니다.

이것은 xcode Version 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]

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 +

찾는 데 한 시간 이상 걸렸어요. 다른 사람의 시간을 절약할 수 있기를 바랍니다.나는 애플에 버그 리포트를 30103533번으로 제출했습니다.

프로젝트를 swift 3으로 마이그레이션한 후에도 동일한 문제에 직면했습니다. 데이터 유형 없이 생성된 사전과 어레이 때문에 솔루션에 시간이 소요되었습니다.

이러한 행동은 제가 실수로 자신으로부터 물려받은 클래스를 선언했을 때 제 프로젝트에 나타났습니다.Xcode 8.2.1(스위프트 3 사용).

저도 이 문제가 있었습니다. 제 경우에는 다음과 같은 대규모 어레이를 선언했습니다.

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

저는 모든 항목을 동시에 추가하지 않고 한 줄에 한 항목을 추가하여 문제를 해결했습니다.

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

이것이 문제를 해결했습니다.

목표-C 프로젝트의 경우:

저도 같은 문제가 있었고, 우리 프로젝트에는 스위프트 코드가 0개 있어서 유형 추론 검사기가 아니었습니다.

여기서 다른 모든 솔루션을 시도했지만 아무 것도 작동하지 않았습니다. 결국 복구 모드에서 컴퓨터를 재부팅하고 디스크 복구를 실행하는 것이었습니다.나는 마침내 다시 평화롭게 일할 수 있습니다!

아마도 서로를 가리키며 서비스를 무한 루프 형태로 실행하는 일부 손상된 심볼릭 링크 때문에 발생한 것으로 추측됩니다.

Xcode 8.2.1에서도 비슷한 문제가 발생했습니다. /**/를 통해 1,000줄 이상의 코드가 주석 처리되었습니다. 해당 섹션을 주석 처리한 후 주석 처리된 코드를 제거하여 문제를 해결했습니다.

터미널에서 실행:

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

XCode 11.4.1에서 Swift 내부의 @dynamicMemberLookup 구독자를 호출할 때 발생했습니다.UI @ViewBuilder 블록.

저도 같은 문제가 있었는데 프로그래밍 오류로 인해 발생했습니다.

저의 경우 비교 가능하고 동등한 프로토콜을 구현하고 있었는데 lhs.param 및 rhs.param이 lhs 및 rhs 클래스의 매개 변수와 일치하지 않았습니다.

언급URL : https://stackoverflow.com/questions/26151954/sourcekitservice-consumes-cpu-and-grinds-xcode-to-a-halt

반응형