Xcode 11을 사용하여 iOS 14에서 디버깅

매년 우리는 새로운 주요 iOS 버전을 가지고 우리의 응용 프로그램을 테스트한다.행운의 사람은 최신 iOS 14 SDK를 기반으로 최신 Xcode 12로 즉시 업그레이드할 수 있습니다.다른 더 큰 프로젝트는 업그레이드에 시간이 걸릴 수 있습니다.또한 이 항목들은 Xcode 11을 사용하여 구성해야 합니다.그러나 이 프로그램들이 업그레이드되지 못하더라도 최신 iOS에서 잘 실행될 가능성이 높다.문제와 버그를 해결하려면 디버깅이 필요합니다.
나는 최근에 iOS 14의 아이폰 11 프로에서만 재현되는 보기 드문 카메라 오류를 만났다.이 프로그램은 아직 업그레이드되지 않았습니다. Xcode 11로 구축되었습니다.이 버그는 관건적인 작업입니다. Xcode 12로 업그레이드할 때까지 기다릴 수 없습니다.
기존 Xcode 버전은 iOS 14와 함께 사용할 수 없습니다.그러나 몇 가지 기교를 통해 저는 iOS 14에서 실행할 수 있을 뿐만 아니라 단점 등을 사용하여 디버깅을 할 수 있습니다.

개요


Xcode에서 흔히 볼 수 있는 실행 작업은 몇 가지 독립적인 절차로 구성된다.
  • 설비 건축.
  • 은 장치에 응용 프로그램을 설치합니다.
  • 응용 프로그램을 시작합니다.
  • 추가 디버거.
  • 이 절차는 Xcode가 물리적 장치와 통신할 수 있고 iOS 버전 간에 통신 인터페이스를 변경할 수 있다는 데 의존한다.따라서 이전 버전의 Xcode로 구축된 응용 프로그램을 디버깅하는 데는 약간의 기교가 필요하다.

    iOS 14의 디버그 버전 구축 및 설치


    최신 iOS 버전에서 실행할 수 있는 것은 우리가 매년 해결해야 할 문제이다.고맙게도 매번 같은 해결 방안이다.Xcode 응용 프로그램 패키지에는 iOS 버전마다 사용할 수 있는 지원 파일이 포함되어 있습니다.Xcode 11에 iOS 14에 대한 지원을 추가하면 iOS 14의 장치 지원 파일을 Xcode 11로 복사합니다.일반적으로 이 장치 지원 파일은 나란히 설치된 Xcode 12에서 복사하거나, 동료의 기계에서 복사하거나, 유행하는 공유 Repo에서 다운로드할 수 있다.
    이것은 이미 광범위하게 토론되었기 때문에 나는 이 화제에 관한 문장을 좋아한다. How to Fix Xcode: “Could Not Locate Device Support Files” Error.

    응용 프로그램 시작


    기본 설정에서 디버그 프로그램 버전은 설치 후 선택한 장치에서 자동으로 시작됩니다.불행하게도 Xcode 11은 iOS 14에서 프로그램을 시작하는 방법을 몰라서 매번 이 괴로운 오류 경보를 받습니다. "장치에서 원격 서비스를 시작할 수 없습니다. 장치 연결을 확인하십시오."

    그러나 우리는 여전히 이 프로그램을 수동으로 시작할 수 있다.우리는 매번 오류 경보가 발생하지 않도록 자동 시작을 비활성화할 수 있다.실행 가능한 파일 디버깅 확인란을 비활성화하여 스키마 설정에서 이 비헤이비어를 변경할 수 있습니다.

    이것은 프로그램이 자동으로 시작하고 디버거를 추가하는 것을 막을 것입니다.
    프로그램이 실행 중이면 프로그램을 설치하면 프로그램이 종료됩니다.이것은 그것이 이미 성공적으로 재설치되었다는 것을 아는 방법이다.그곳에서 이 아이콘을 누르기만 하면 수동으로 시작할 수 있다.

    로그인 중


    응용 프로그램이 Xcode 11을 사용하여 구축, 설치하고 상기 장치에서 수동으로 시작한 후에 응용 프로그램을 테스트할 수 있습니다.
    만약 우리가 로그를 보고 싶다면, 우리는 컨트롤러 프로그램에서 그것들을 볼 수 있다.응용 프로그램의 로그를 표시하기 위해서, 우리는 비교적 새로운 시스템 os 프레임워크를 사용하여 그것들을 기록해야 한다.
    import os
    ...
    func logError(_ msg: StaticString, _ params: Any...) {
        os_log(msg, log: OSLog.default, type: .error, params)
    }
    ...
    logError("Value: %{public}@", property)
    
    %{public}@뿐만 아니라 %@을 사용하면 추가 디버거가 없어도 변수를 볼 수 있습니다.기본적으로 변수는 로그를 통해 민감한 데이터가 유출되는 것을 방지하기 위해 개인적인 것입니다.Read more about unified logging on SwiftLee .
    장치 로그를 확인하고 응용 프로그램 이름, 로그 수준 등 여러 매개 변수를 통해 필터링할 수 있습니다.

    나는 로그 레벨 .error으로 나의 응용 프로그램 메시지를 기록했다. 왜냐하면 모든 메시지 옆에 뚜렷한 노란색 점이 있기 때문에 대부분의 시스템 메시지를 쉽게 필터할 수 있기 때문이다.
    특히 NSLog으로 기록된 메시지도 컨트롤러 응용 프로그램에 표시됩니다.나는 Swift 코드에서 NSLog을 사용하는 것을 건의하지 않는다. 왜냐하면 os_log은 현재 애플 플랫폼에서 로그인하는 가장 좋은 방법이기 때문이다.
    지금까지 우리는 iOS 14에서 이 프로그램을 구축하고 시작하며 테스트할 수 있으며 시스템 컨트롤러 프로그램을 사용하여 로그를 검사하고 Xcode 11만 사용할 수 있다.
    그러나 때때로 로그만 기록하는 것은 부족하다. 단점을 사용하여 디버깅을 하는 것은 보통 버그 조사에 필요한 것이다.

    인터럽트


    불행하게도 Xcode 11은 iOS 14에서 응용 프로그램을 디버깅하는 방법을 몰랐습니다.하지만 Xcode 12는 그렇습니다!인터럽트 작업을 수행하려면 Xcode 12를 사용해야 합니다.
    이미 Xcode 11로 컴파일된 프로그램의 경우 디버거를 실행할 수 있는 두 가지 옵션이 있습니다.우리는 디버거를 실행 중인 프로그램에 추가하거나 Xcode 12에서도 이 프로그램을 시작하고 디버거를 추가할 수 있습니다.

    Xcode 12에서 시작


    Xcode 11(cmd+B)을 사용하여 목표를 구축한 후 Xcode 12로 전환한 다음 메뉴 옵션 Run Without Building으로 이동하거나 cmd+control+R을 사용하여 Product > Perform Action > Run Without Building을 실행합니다. 이것은 프로그램을 설치하고 시작하며 디버거를 연결합니다.
    이 방법을 사용하면 프로젝트 설정에서 자동 시작이나 디버깅을 사용하지 않아도 됩니다. 이 단계에서 Xcode 12를 사용하면 iOS 14 장치와 어떻게 통신하는지 알 수 있습니다.그러나 또 하나의 단점은 우리가 응용 프로그램을 실행하기 위해 Xcode 12를 사용해야 한다는 것이다.항상 인터럽트가 필요한 경우에만 이렇게 하는 것을 권장합니다. Xcode 버전 사이를 계속 전환하는 번거로움은 당신에게 가치가 있습니다.
    이 기교를 제시해 주셔서 대단히 감사합니다!

    실행 중인 프로그램에 디버거 추가


    어떤 이유로든 Xcode 12를 사용하지 않으려면 디버거를 실행 중인 프로그램 (실행 중인 프로세스) 에 수동으로 추가할 수 있습니다.
    프로그램을 테스트할 때, 우리는 Xcode 12에서 항목을 열 수 있으며, 메뉴 옵션 Debug > Attach to Process으로 이동하여 프로그램의 프로세스를 선택하여 디버거를 연결할 수 있습니다.응용 프로그램 이름은 가능한 대상 아래에 나타나야 합니다.이것은 몇 번의 시도가 필요할 수도 있지만, 그것은 효과가 있다.

    Xcode 12에서 디버깅의 한계


    디버거(Xcode 12에서 실행하거나 수동으로 연결)를 연결하면 평소와 같이 인터럽트를 탐색할 수 있습니다.우리는 어느 곳에서든 멈추고, 건너고, 들어갈 수 있다. 우리는 창고의 궤적을 정상적으로 볼 수 있다.보기 차원 구조를 디버깅하고 메모리 그림을 탐색하며 텍스트 크기나 어두운 모드 등 환경 설정을 덮어쓸 수 있습니다. 이 모든 것은 iOS 14 장치에서 Xcode 11을 사용하여 만든 디버깅 구축을 실행합니다.
    제한 사항 - 중단점에서 일시 중지할 때 변수에 대한 접근이 제한됩니다.대부분의 Swift 변수는 볼 수 없고 po 등 디버거 명령도 작동하지 않습니다.이것은 이 오류 때문이다: Cannot load Swift type information; AST validation error in <...>: The module file format is too old to be used by this version of the debugger.그러나 po은 UI 디버거에서 일하는 것 같아서 Objective-C 코드를 작성할 수 있습니다.이것은 결코 이상적이지 않지만, 이것은 우리가 해결할 수 있는 문제다.
    앞에서 말한 바와 같이, 디버거가 Swift 변수에 접근할 수 없는 경우, 좋은 이전 로그 기록은 도움이 될 수 있습니다.
    디버깅 기능에 한계가 있지만, 일반적으로 코드 경로를 멈추고 한 걸음 한 걸음 훑어보고 창고 프레임을 보면 오류의 원인을 찾을 수 있습니다.

    Xcode 12를 사용하여 예기치 않은 재구축을 방지하는 방법


    우리가 사용하는 것은 Xcode 11이지만, Xcode 12에서 실행하고 디버깅을 하기 때문에, 우리는 의외로 Xcode 12에서 재구성할 수 있으며, 최종 테스트의 응용 프로그램 버전은 처음에 예상한 것과 매우 다르다.디버깅 시 Xcode 12 생성이 예기치 않게 발생하지 않도록 조건부 컴파일 오류를 추가할 수 있습니다.
    #if compiler(>=5.3)
    #error("This project should not be built on Xcode 12")
    #endif
    
    이 코드는 원본 코드의 어느 곳에나 놓을 수 있다.소스 코드가 5.3(Xcode 11 또는 이전 버전에 해당) 이하의 모든 버전의 Swift 컴파일러를 사용하면 #error 명령을 건너뜁니다.이렇게 하면 기술적으로 의외로 Xcode 12에서 구축할 수도 없다.

    끝내다


    Xcode 12로 바로 업그레이드할 수 있는 행운이 없는 사람이라도 iOS 14를 실행하는 장치에서 프로그램을 실행하고 디버깅할 수 있다.Xcode 11을 완전히 사용할 수 있으며, 간혹 Xcode 12를 인터럽트와 추가 항목으로 사용할 수 있습니다. 예를 들어 UI 디버거입니다.나는 나의 관건적인 버그를 찾아서 복구할 수 있다. 나는 이 기교들이 언젠가 다른 사람들을 도울 수 있기를 바란다.

    좋은 웹페이지 즐겨찾기