2023년 1월 1일
08:00 AM
Buffering ...

최근 글 👑

[Swift-Study] iOS 앱 개발 심화 1주차 - Instruments

2024. 5. 1. 01:30ㆍIOS/Swift-Study
SMALL

Xcode Instruments란?

Xcode Instruments는 Xcode 내에 포함된 성능분석 및 디버깅 도구

iOS, watchOS, tvOS 및 macOS 앱의 성능을 분석, 최적화하는데에 도움을 줌


Xcode Instruments 실행

첫번째 방법

[Xcode > Open Developer Tool > Instruments]

Instruments를 직접 실행하기 위해서 사용되는 방법

이미 빌드되어 있는 앱을 선택하여 디버깅 가능

두번째 방법

[Prudoct > Build For > Profiling]

앱의 빌드와 함께 Instruments를 실행하기 위해서 사용되는 방법

새로 빌드된 앱을 바로 디버깅 가능

 

Profiling Templates 둘러보기

실행시 아래와 같은 창이 표시됨

각 분석 영역에 따라 일반적으로 필요한 데이터를 볼 수 있게 구성되어 있는 "Profiling Template"

Profiling Template을 통해 디버깅 가능 → 상황에 따라 고유한 템플릿을 만들어서 사용가능

“Leaks”을 사용해서 메모리 누수를 찾는 방법


수집 화면 구성 알아보기

Template을 선택 → 수집을 시작 후 보여지는 수집 화면의 구성

Trace Document

 

Toolbar

데이터 수집을 시작/중지

기기추가 및 수집 타깃 선택 등의 작업을 수행가능

 

Timeline Pane

각 항목별 기록된 데이터의 요약을 시각적으로 표시

 

Detail Pane

수집한 데이터에 대한 자세한 정보를 표시

 

Inspector Pane

실행정보 및 stack trace가 표시


Toolbar

데이터 수집을 시작/중지

기기추가 및 수집 타깃 선택 등의 작업을 수행가능

 

 

Profiling control

데이터 수집을 시작/중지/일시중지 가능

 

Target device list

데이터를 수집할 장치를 선택 가능

 

Target process list

데이터를 수집할 타겟(앱)을 선택 가능

 

Activity viewer

데이터 추적 횟수와, 현재 추적의 경과 시간을 표시

 

Add Instrument button

사용가능한 Instruments 팔레트를 표시

이곳에서 추적 항목을 추가 가능

 

View Buttons

Detail 영역과 inspector 영역을 표시하거나 숨깁니다.


메모리 누수 확인하기

STEP 1.

Circular References(순환참조)의 예시를 활용

버튼이 클릭되었을 때 순환참조가 발생하도록 코드를 작성

import UIKit

class Person {
  var name: String
  var pet: Pet? // Person이 소유하는 Pet
  
  init(name: String) {
    self.name = name
  }
}

class Pet {
  var species: String
  var owner: Person? // Pet을 소유하는 Person
  
  init(species: String) {
    self.species = species
  }
}

class ViewController: UIViewController {

  @IBAction func tappedButton(_ sender: Any) {
    let person: Person? = Person(name: "Alice") // Person 클래스의 인스턴스를 생성
    let pet: Pet? = Pet(species: "Dog") // Pet 클래스의 인스턴스를 생성

    person?.pet = pet // Person 클래스의 pet에 Pet 인스턴스를 할당
    pet?.owner = person // Pet 클래스의 owner에 Person 인스턴스를 할당
  }

  override func viewDidLoad() {
    super.viewDidLoad()
  }
  
}

STEP 2.

그리고, Leaks을 선택한 다음,

Profiling control의 빨간색 버튼을 눌러 데이터 수집을 시작

STEP 3.

메모리 누수가 발생하지 않는 상황에서

데이터의 수집이 어떻게 이루어지는지 관찰

STEP 4.

버튼을 눌러 메모리 누수를 발생시키고,

데이터의 수집이 어떻게 이루어지는지 관찰

STEP 5.

어디에서 메모리 누수가 발생했는지 확인

누수된 지점의 빨간색 ❌ 아이콘을 클릭,

 

Detail Pan 상단의 네비게이션 바의

Leaks을 클릭해 Call Tree를 선택

 

하단의 CallTree를 클릭해서 invert Call Tree (트리 반전),

Hide System Libraries (시스템 라이브러리 숨기기)를 체크

그러면, 아래와 같이 가장 최근의 메서드 호출이 먼저 표시되고,

앱에서 호출한 Call Tree만 표시되는데요.

이곳에서 Call Tree에서 오른쪽을 클릭해서

Reveal in Xcode를 눌러 누수가 발생한 파일을 Xcode에서 확인 가능

 

추가로, 오른쪽의 Stack Trace에서 가장 상단에 노출된(가장 최근에 호출된 Trace)를 오른쪽 클릭

Open in Source Viewer를 클릭 시 보다 상세한 위치를 파악하는데에 도움되는 정보를 확인가능

 

728x90