[Xcode] LLDB의 기능 활용해서 디버깅 하기

[Xcode] LLDB의 기능 활용해서 디버깅 하기

디버깅을 하면서 데이터를 출력하는 방법에는 크게 3가지가 있습니다. po, p, fr v 이들은 각각의 특성을 가지고 있습니다. po는 debugDescription의 포맷팅으로 출력해줍니다. p는 빌트인 포맷터를 사용합니다. fr v는 빌트인 포맷터를 쓰지만 사이드 이펙트를 만들지 않습니다. 하지만 제한된 조건에서만 출력할 수 있습니다. 빌트인 포맷터는 우리가 디버깅을 할 때 볼 수 있는 왼쪽의 구조와 같습니다. fr v가 안전하면서 사이드 이펙트를 발생시키지 않는 이유는, p와 po는 실행문 입니다. 그러므로 출력 이외에 코드를 실행할 수 있습니다. 그러므로 우리가 생각하지 못한 부분을 만들어 낼 수 있지만, fr v는 출력만 해 줍니다.

디버깅 변수 활용

특정 상황에서 브레이트 포인트를 걸고 싶을 때가 있습니다. 예를 들면 테이블 뷰의 셀이 100개 이지만, 47번째 셀이 그려질 때가 그 예입니다. 이럴 때는 디버깅 변수를 하나 생성하여, 조건문에 그 값을 넣어 조건을 만족할 때만 브레이크 포인트에서 멈추게 할 수 있습니다.

변수를 만드는 방법은 간단합니다. viewDidLoad 메소드에서 디버깅 변수를 하나 선언해줍니다. 메소드 중간에 아무라인이나 우클릭 합니다. Edit Breakpoint -> Add Action 그리고 Debugger Command를 입력해줍니다. p var $row = 0
그리고 테이블뷰의 cellForRowAt 메소드에서, 브레이크 포인트를 만들어 준 후에, Edit Breakpoint -> Add Action 그리고 Debugger Command를 입력해줍니다. p $row = indexPath.row 라고 만들겠습니다. 이러면 인덱스 패스가 바뀔 때 마다 우리의 디버깅 변수도 값이 바뀌겠죠? 마지막으로 셀이 그려지는 메소드에 가서, 브레이크 포인트를 만들어주고 Edit Breakpoint -> Condition 에 $row == 47 이라고 적어주겠습니다.
준비는 다 되었으니 이제 실행해 보도록 하겠습니다. 짜잔!

UI 변경

앱을 실행중에 UI를 변경 해 본 적이 있으신가요? 예를 들면, 라벨의 길이가 길어지면 어떻게 변할지를 보고 싶을 때, 계속 가짜 데이터를 넣어 빌드 하고 계시진 않으신가요?

라벨이 다 그려지기 전, 데이터는 이미 들어있는데 라벨의 데이터를 변화하려면 저는 매번 가짜 데이터를 넣고 빌드하는 방법을 반복하고 있었는데요. 다음과 같은 방법을 쓰면 됩니다.

먼저 데이터를 입력해 주는 곳에 브레이크 포인트를 걸어줍니다. 그리고 아래의 명령어를 입력해 봅니다.

po descriptionLabel.text // 값 출력

p descriptionLabel.text = "asdfasdfasdfasdfasdf" // 새로운 값 입력
p descriptionLabel.backgroundColor = .red // label 배경색 변경

하지만 값을 입력 해 주는 방법만 가지고는 우리가 원하는 결과를 볼 수 없습니다. 왜냐하면, 아직 라벨이 그려지지 않아 화면에 나오지 않고 멈춰있는 상태일 때 이니까요.

p CATransaction.flush()

위 명령어로 변경사항을 반영해줍니다.

어떤가요? 디버깅을 좀 더 편하게 할 수 있게되셨나요?

LLDB step Commands

n - next step
s - step in
finish - finish
c - continue

정리

디버깅을 할 때 좀 더 똑똑하게 하고 싶어서 찾아 정리한 방법들 이었는데요, 이렇게 방법을 정리하는 것 보다는 실제 디버깅을 하면서 예제로 습득하는 방버이 더 좋은 것 같습니다.

댓글

이 블로그의 인기 게시물

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

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

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