본문 바로가기

Xcode

[Xcode] Breakpoint 사용하기 (2) - LLDB

지난 글 보기

 

[Xcode] Breakpoint 사용하기 (1)

Xcode 에서는 코드의 진행을 의도적으로 멈추고 그 시점에서의 메모리나 변수 값들을 확인할 수 있는 브레이크 포인트를 제공합니다. 이 글은 시리즈의 첫 편으로 간단하게 브레이크 포인트를 사

darth-vader.tistory.com

 

지난 글에서 브레이크 포인트를 소개하고 사용하는 방법에 대해서 간단히 이야기했었습니다. 

오늘은 브레이크 포인트를 사용해서 어떤 것을 할 수 있는지 다루기 전에 LLDB 에 대해서 알아보겠습니다.


 

어디선가 많이 본 화면이다.

저와 여러분들 모두 개발하면서 많이들 본 화면입니다. 브레이크 포인트에 의해 코드의 진행이 멈추거나, 크래시가 발생했거나 하는 상황에서 Xcode 의 Debug Area 에 위치한 콘솔에 노출되는 화면입니다. 얼마 전까지도 (lldb) 라는 4글자가 뭘 의미하는 건지 알지 못했고, 사실 지금까지도 LLDB 에 대해서 자세히 알지는 못합니다.

 

콘솔에 노출된 LLDB 는 Xcode 에 내장된 Debugger 의 이름입니다. LLDB 에 명령어를 작성함으로써 우리는 좀 더 쉽게 디버깅할 수 있습니다. 아래 이미지와 같이 개발자가 입력을 할 수 있게끔 인터페이스가 구성되어 있습니다.

 

특정한 명령어가 있는 듯한 반응

어렵게 LLDB 가 무엇이며 어떻게 작동하며 어떤 언어로 만들어졌는지에 대한 글들은 구글에 검색하시면 많이 찾아보실 수 있습니다.

이 글에서는 "그래서 이걸 어떻게 사용해야하는건데?" 에 초점을 맞추었습니다. 이 글에서는 사용하는 방법에 대한 기초적인 것들을 알려드리고 응용은 여러분들의 몫입니다.


구체적인 사용법에 앞서 대부분의 개발자들은 디버깅을 할 때 크게 세 가지 방법을 사용합니다. (물론 제 뇌피셜입니다만...)

 

첫 번째 방법은 실제 작동하는 코드 사이에 print 나 NSLog 등을 이용해 값을 출력해서 확인하는 방법입니다. 이 방법의 장점별도의 학습 없이 자연스럽게 하고 있는 행동이며 원하는 지점에 코드를 작성하거나 특정 조건을 작성하는 방법으로 원하는 타이밍에 값을 출력할 수 있다는 점입니다. 반면에 불편한 점은 다른 값을 확인하고 싶을 때마다 매번 새롭게 빌드를 해야 한다는 것입니다. (빌드 타임이 길어진다면 끔찍합니다. 다만 우리 모두 여기에 적응해가고 있어요.)

 

이런 방법은 이미 익숙하시죠?

 

두 번째 방법은 브레이크 포인트를 걸어서 Debug Area - Variables View 에서 변수를 확인하는 방법입니다. 이 방법의 장점은 눈썰미가 있다면 자연스럽게 학습할 수 있으며 현재 스코프에서 확인 가능한 모든 변수들을 볼 수 있다는 점입니다. 단점도 마찬가지로 현재 스코프에서 확인 가능한 변수만을 볼 수 있다는 것입니다.

Debug Area - Variables View

 

세 번째 방법은 LLDB 를 사용하는 방법입니다. 브레이크 포인트를 사용한다는 점은 두 번째 방법과 동일하지만 변수를 확인하는 방법 뿐만 아니라 새로운 코드도 런타임에 추가할 수 있다는 점입니다. (엥 그게 말이 되냐?)

 

모두 비슷하거나 동일한 동작을 수행한다.

 

이 역시도 p, po, e, expr, expression 에 대해서 다룬 글들이 이미 존재합니다. 역시 이 글에서는 다루지 않겠습니다. 저 같은 경우엔 po 를 선호합니다. (이유는 묻지 말아주세요. 사실 단지 이게 손에 익숙해요.)

p print prints value of primitive variable or value of a reference
po print object try to call -description for that object and print returned string

 

변수를 확인하는 방법에 대해서는 알았고, 다음은 새로운 코드를 추가하는 방법입니다. 저 같은 경우엔 회사에서 스토리보드를 사용하지 않고 코드 베이스로 작업을 하다보니 UI 배치가 제가 원하는 형태로 됬는지 확인하기 위해 UIView 에 border 와 backgroundColor 를 추가하는 방법을 사용합니다. 이걸 lldb 와 함께 사용하면 원하는 타이밍에 메서드를 호출해서 뷰의 구성을 확인할 수 있습니다.

 

기존 코드에서의 화면
위 화면을 구성하는 코드
debug 메서드는 UIView+Extension 에 제가 정의한 메서드입니다.

 

위 이미지처럼 화면이 구성된 다음 브레이크 포인트에 걸린 상황에서 lldb 에 코드를 작성한다면 런타임 도중에 코드가 새롭게 실행됩니다. 그리고 브레이크 포인트에서 빠져나왔을 때 실행된 코드가 반영된 것을 볼 수 있습니다. 즉, 런타임 과정에서 특정 객체의 프로퍼티를 바꾸는 등의 행동이 가능해지는 거죠.


어때요? 실무에서 어떻게 활용하실지 감이 잡히시나요? (부디 그랬으면 좋겠습니다.)

다음 포스팅에서는 브레이크 포인트와 LLDB 를 섞어서 사용하는 방법에 대해 다루겠습니다.

 

 

What's the difference between "p" and "po" in Xcode's LLDB debugger?

Example. I write the following string in my old project and a new, clear one: UIInterfaceOrientation k = [UIApplication sharedApplication].statusBarOrientation; Console input-output for a clear p...

stackoverflow.com