Letswift tools xcode lldb instrument cover

Swift 개발 환경의 변화 - Interface Builder, Xcode, LLDB, Instrument

Let’Swift는 Swift 개발자들이 만나고, 배우고, 즐기는 컨퍼런스로 총 13개의 세션으로 이뤄졌습니다. Swift 개발자들이 모여 iOS의 넥스트 스텝을 이야기한 행사였습니다. 빠르게 발전하는 언어 Swift에 대한 뜨거운 열의를 엿볼 수 있었던 Let’Swift 행사 동영상을 공유합니다

Swift를 쓰면 쓸수록 애증이 느껴지신다고요? Swift 3에서는 폭넓은 방향의 개발 환경 변화가 예고돼 있습니다. Interface builder, Source editing, Sanitizers, View debugging, LLDB, Instrument 등 여러 개발 환경 변화에 대해 me2day, BAND, Line 앱 개발자, 허혁님이 쉽고 간결하게 설명해 주셨습니다. 곧 업데이트될 Swift 3 개발 환경 변화에 대비하고, Swift 활용에 도움이 될 팁들을 얻어보세요.


Interface Builder

  • 새로운 Adaptive UI - 디바이스 타입별 렌더링
  • Live preview 가능 - 디바이스 타입별: iPad Adaptation도 지원
  • 수정하면서도 확대 축소 가능

Source Editing

  • Xcode Source Editor Extension: 안전한 확장 환경 제공, Extension이 꺼져도 Xcode는 살아 있음
  • 번들 로딩 금지: 알카트라즈 플러그인 등 몇몇 플러그인 활용 불가
  • 새로워진 API 문서

  • 오프라인 API 문서

  • API 문서 자동생성: Markdown 문서로 주석에 표시 가능

  • SF Mono Font
  • Code-signing, Provision: 관리 개선
  • 현재 라인 하이라이트
  • Color Literal: 자동 완성 지원

이런 개발 뉴스를 더 만나보세요

Color Literal #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)


  • Image Literal: 자동 완성 지원
UIImage(#imageLiteral(resourceName: "Screen Shot"))


Sanitizers

  • 런타임 시 버그 추적
  • Swift3 / C/C++/Objective-C
  • 컴파일 시 버그 추적은?
  • Types
  • AddressSanitizer
    • 디버깅 모드로 동작할 때 잠재적인 메모리 누수 탐색
    • 메모리 어드레스 오염 이슈를 탐색
    • Swift도 지원
    • 설정: Scheme의 Diagnostics항목 > Enable Address Sanitizer
    • 성능 저하: 2배 정도 속도 저하
    • 검출 케이스
      • 힙, 스팩, 글로벌 버퍼 오버 플로우
      • 메모리 반환 후 사용
      • return 후 사용
      • 메모리 릭 (leak sanitizer가 합쳐짐)
  • ThreadSanitizer
    • 런타임 시 쓰레드에 의한 데이터 변경에 레이스 컨디션 발생 여부 확인
    • 설정: Scheme의 Diagnostics항목 > Enable
    • 지원범위: 64비트 macOS, iOS 시뮬레이터, tvOS 시뮬레이터 (watchOS와 Device는 아직 미지원)
    • 테스트 돌릴 때 옵션 켜는 것 추천
    • 성능 저하: 5~15배 정도 속도 저하, 메모리 사용량은 5~10배 증가
    • 검출 케이스
      • 초기화 되지 않은 뮤텍스 사용
      • 엉뚱한 쓰레드가 언락
      • 스레드 릭
      • 시그널 핸들러에 안전하지 않은 함수 호출
      • 데이터 레이스

데이터 레이스:

  • 동기화 없이 여러 쓰레드가 한 주소를 접근할 때
  • 그 중 하나는 읽기용 쓰레드
  • 끝난다면 결국 쓰레기 값이나 메모리 오염으로 구조상 문제가 있다는 것
  • 혹은 동기화 작업 누락
  • Memory Graph Debugging
    • 메모리 누수나 버려진 메모리 탐침
    • 디버깅 모드에서 pause된 경우
    • macOS, iOS 10, tvOS 10, watchOS 3 지원
    • Sanitizer가 켜져 있으면 동작 안함, 꼭 끌 것!
    • Scheme의 Diagnostics 탭에서 Malloc Stack설정
      • All Allocation
      • Live Allocation Only


  • Memory Graph Debugging: 두가지 그래프 스타일
    • Root Paths: 참조 메모리 - 얼마나 많은 메모리가 잡혀 있는지
    • Cycles: 메모리 누수 - 누수가 어떻게 다른 누수와 연결되는지


  • Memory Graph Debugging: 파일 저장
    • .memgraph; Plist file
    • 저장하기: File → Export Memory Graph
    • 불러오기: Open the file (디버거 프로세스가 아니라서 트레이스, 퀵룩, po 안됨; 그래프 말고는 아무것도 안됨)

View Debugging


  • 빨라지고 정확해짐
  • 클래스로 바로가기
  • 네비게이터에서 필터링
  • 오토레이아웃 디버깅


  • 유한 상태 머신 Quick Look
    • GKStateMachine; GameplayKit를 써야 함
    • 코드로는 알아보기 힘듦
    • 복잡한 동작을 그래프로 직관적으로 정의 가능
    • 상태별 개별 동작
    • 상태간 전환

LLDB

  • 스위프트 REPL도 LLDB
:<command> enables any LLDB command
  • Xcode와 LLDB는 별도 프로세스로 분리
    • LLDB는 죽어도 Xcode는 적당히 살아남
    • 여러 버전의 디버거 지원: 디버거가 자동 선택됨, 예를 들면 Swift 3는 가장 최신 디버거, Swift 2.3는 Xcode 7.3.1-era 디버거
    • 오픈소스 Swift도 매칭된 디버거를 사용
  • parray
  • poarray
  • 자동 import
@import UIKit settings
show target.auto-import-clang- modules false
  • Debugger Customization
  • Reusable Code $
expr let a = 3; print(a)
expr $addTwoNumbers(a: 2, b: 3)

Instrument

  • 디버깅 시 정보 표시 가독성 향상
  • 시스템 트레이스
    • 스레드, CPU, Point of Interest
  • 타임 프로파일러
    • 앱 라이프 사이클 이벤트에 따른 동작
  • 메탈 시스템 트레이스

참고 자료


발표 슬라이드는 아래를 참고해주세요.

컨텐츠에 대하여

이 컨텐츠는 저자의 허가 하에 이곳에서 공유합니다.

Hyuk Hur

Hyuk is a source code maintainer who want to make congruent software and service good service. One of his talents is finding bugs in the broken source.

4 design patterns for a RESTless mobile integration »

close