[Xcode] 디버깅 입문

[Xcode] 디버깅 입문

Xcode 디버깅 입문

코딩을 하다가 버그를 발견하거나 내가 원하는 결과가 나오지 않을 때면, 프린트 문을 써서 문제를 해결하곤 했는데 디버깅 툴 이라는 것을 발견한 후로
잘 쓰면 생산성을 향상 시킬 수 있을 것 같아서 정리 해 놓습니다. Xcode에 있는 디버깅 도구를 활용해 버그를 잡아봅시다.

BreakPoint

브레이크 포인트는 실행중인 앱을 일시정지 하는 포인트 입니다. 사용 법은 매우 간단합니다.
Xcode 소스코드의 왼쪽에 있는 라인 넘버를 클릭하면 파란 화살표가 생깁니다.


브레이크 포인트가 생성된 것 입니다. 이제 앱을 실행시키면, 브레이크 포인트에서 앱이 일시정지 되는 것을 볼 수 있습니다.
다시 앱을 동작하게 하는 방법도 간단합니다. 디버깅 창 중간의 삼각형 모양의 화살표를 눌러주면 다시 실행됩니다.

만약 브레이크 포인투가 두개라면 다음 브레이크 포인트에서 일시정지합니다.

브레이크 포인트를 다시 한번 클릭하면, 비활성화됩니다. 토글 형태이기 때문에 활성화, 비 활성화 하면서 브레이크 포인트를 사용할 수 있습니다.
브레이크 포인트는 오른쪽으로 드래그 하면 제거됩니다. 위 아래 방향으로 드래그 해서 옮길 수 있습니다.
디버깅 창에서 브레이크 포인트와 같은 파란색 화실표 버튼을 누르면, 한번에 모든 브레이크 포인트를 활성화, 비활성화 시킬 수 있습니다.
Xcode의 왼쪽 네비게이터에서 브레이크 포인트 모양의 아이콘을 누르면 현재 설정된 브레이크 포인트들을 한번에 볼 수 있습니다.

디버깅 중 일시 정지된 브레이크 포인트에서 현재 변수 상태를 확인할 수 있습니다.
가리키고 있는 브레이크 포인트에서 변수에 어떤 값이 할당되어있는지 확인 할 수 있습니다.
이 창을 통해 내가 기대하고 있는 값이 제대로 들어가 있는지 확인하면 문제를 해결하는데 큰 도움이 됩니다.

Control flow

앱의 사용 흐름을 체크 하는데 모든 라인에 일일이 브레이크 포인트를 걸어주어야 한다면,
브레이크 포인트 부터 한줄 한줄 실행해보고 싶을 때 매우 불편하겠죠?
그래서 흐름을 제어할 수 있는 기능이 있습니다.
흐름을 제어하는 방법에는 크게 세가지가 있는데요 아래와 같습니다.

  1. 다음 브레이크 포인트로 넘어가는 방법
  2. 진입 포인트가 있을 때 진입하는 방법
  3. 다음 코드가 실행되게 하는 방법

1번은 위에 설명이 되어있으니 생략하겠습니다.

2번(Step into)은 어떤 함수나 메소드를 호출 하는 부분으로 이동해서 실행합니다. 예를 들어 let row6Item = ShmecklistItem()라는 포인트에 브레이크 포인트에 걸어놓고 진입 버튼을 누르면,
class ShmecklistItem 클래스의 내부로 진입하게 됩니다. 내부 프로퍼티의 할당 과정을 한 줄 한 줄 볼 수 있습니다.
클래스 밖으로 나가고 싶을 때는 Step out 버튼을 누르면 됩니다.

3번은 현재 실행되고 있는 소스코드를 한 줄 한 줄 실행합니다. 물론 실행 중간 중간 변수 값들을 확인 할 수 있습니다.
let row6Item = ShmecklistItem()에서 스텝 오버하면, 그 다음줄이 실행됩니다.

let row6Item = ShmecklistItem()
row6Item.text = "Read iOS Apprentice"
row6Item.checked = true
items.append(row6Item)

Call Stack

Show the debug navigator 창에 가면 브레이크 포인트가 걸린 시점의 call stack을 볼 수 있습니다.
어느 시점에서 함수가 호출 되었고, 어디가 실행되고 있는지 볼 수 있습니다.
ViewController.viewDidLoad()에서 호출 되었고 KingfisherCompatible.kf.getter를 호출했습니다..


함수가 종료되면 돌아가는 리턴 포인트를 확인할 수 있습니다.

donaricano-btn

댓글

이 블로그의 인기 게시물

[IOS] AppDelegate는 뭐하는 녀석이지?

[git] git의 upstream과 origin 헷갈리는 사람 손!

[git] Github 이슈 라벨(issue labels)