Weekoding
[Swift] How to Debugging(LLDB, breakpoint) 본문
Android Studio나 Xcode 등의 개발툴을 사용하게 되었을 때를 돌이켜보면,
바다에 무작정 입수하는 느낌이었던 것 같다.
여러 컴포넌트를 여러 레이아웃으로 만들어 보고,
여러 에러들과 직접 몸통박치기를 해보면서 배웠던 것 같다.
효율면에서 부족할 수는 있겠지만, 그렇기에 코딩에 흥미를 가질 수 있었다고 생각한다.
그런데 생각해보니 정작 디버깅에 대해서는 따로 깊게 공부해 본 적이 없었다.(???)
부딪히며 코딩하는 것이야 둘째 쳐도, 한 번의 디버깅을 할 때 제대로 한다면
좀 더 효율성 높은 개발자가 될 수 있을 것이란 생각에 정리해보기로 하였다.
[ 목차 ]
📂 print?
📂 Breakpoint
📂 LLDB(Low-Level Debugger) - po
📂 Network Debugging
📂 UI(Preview) Debugging
📂 print?
사진 : Swift에는 print() 함수가 있다.
print() 함수를 이용하여 콘솔 창에 문장이나 변수나 프로퍼티 값을 출력할 수 있다.
복합적으로는 다음과 같이 이용한다.
print("value is : \(a)")
'\()' 안에 변수나 프로퍼티 이름을 넣어서 출력한다.
가장 큰 장점은 편의성인데 그게 전부이다.
귀찮기도 하고 print문이 워낙에 익숙한 함수이다 보니 이걸 이용해서 디버깅을 하는 경우가 있는데,
아래에 나열된 방법들을 이용하는 것이 더 좋을 것이다.
출력할 변수들이 많아지는 경우를 예로 들어 보자.
print(x)
print(y)
print(z)
위와 같은 식으로 출력하게 되면 어느 변수가 어떤 값을 갖고 있는지 헷갈릴 수 있다.
결국 \()를 사용해 일일이 설명을 붙여주어야 한다는 것과, 불필요한 코드들이 생기는 것이 단점이라고 할 수 있겠다.
📂 breakpoint
breakpoint: 프로그램을 의도적으로 멈추게 하는 지점.
Xcode는 해당 명령줄 자체에 breakpoint를 거는 line breakpoint로 사용된다.
왼쪽에 해당 코드가 몇번 째 줄인지 알려주는 숫자를 누르면 line breakpoint를 걸 수 있다.
한번 더 클릭하면 breakpoint 표시는 남겨진 채 비활성화 되며,
드래그 하여 밖으로 끌어내면 표시도 삭제할 수 있다.
실행 도중 breakpoint가 걸려서
b의 값에 최종적으로 a(0)가 들어가지 않고, 3에서 멈춘것을 확인할 수 있다.
상단의 Debuging bar를 자세히 보면, 귀여운(?) 기호들이 많은데 이 친구들도 breakpoint를 다루는데 참 중요하다.
왼쪽부터 다음과 같다.
- Continue : 다음 breakpoint가 나올 때 까지 계속 진행한다.(breakpoint가 여러개일 때 많이 쓰인다.)
- Step over : breakpoint가 걸린 라인의 다음 라인으로 넘어갈 수 있다. 단축키는 F6.
- Step into : 호출하는 함수가 있으면 함수 내부로 들어가서 단계별로 진행한다. 단축키는 F7.
- Step out : 들어갔던 함수 밖으로 나간다(return 문을 호출한다). 그 후 호출된 위치로 빠져 나온다. 단축키는 F8.
• breakpoint - Edit Breakpoint
지정한 breakpoint를 두 번 클릭하면, 해당 breakpoint에 대해 좀 더 자세한 설정을 할 수가 있다.
- Name : breakpoint에 이름을 지어줄 수 있다.
- Condition : Swift문으로 작성한 조건을 걸어줄 수 있다. (ex) self.b > 5)
- Ignore : 특정 횟수 이후부터 break가 되게끔 걸어줄 수 있다.
- Action : break가 걸리기 전 특정 동작을 수행하게 할 수 있다. (AppleScript, Debugger Command, Sound 등...)
- Option : 'Edit Breakpoint'에서 지정한 동작들은 수행하지만, break는 걸리지 않게 할 수 있다.
• breakpoint - Watchpoint
Watchpoint를 통해 변수값의 흐름을 개별로 추적할 수 있다.
왼쪽 창(Variables View)에서 추적하고 싶은 변수에 대고 오른쪽 클릭을 해보자.
Watch "변수명"으로 Watchpoint를 걸어주면, 변수값이 수정되는 곳마다 breakpoint가 걸리게 된다.
변수값이 수정되는 곳마다 일일이 breakpoint를 걸어주지 않아도 된다.
📂 LLDB(Low-Level Debugger) - po
LLDB(Low-Level Debugger) : Xcode IDE에 기본 내장되어있는 Command-Line Debug 환경.
po : 객체의 정보를 확인할 수 있는 명령어.
가장 보편적인 디버깅 방법이라고 한다.
Error 혹은 Breakpoint 를 기점으로, 변수나 프로퍼티에 어떤 값이 저장되어 있는지 알 수 있는 방법이다.
po '변수명' 을 이용해 해당 변수에 대한 description을 불러올 수 있다.
Breakpoint에 걸리거나 Error가 발생했을 때, 왼쪽의 디버깅 창에 기본적으로 변수들에 대한 정보들이 나타난다.
더 자세히 알아보기 위해서는 오른쪽 창(Console)에 po 명령어를 이용하여 찍어보면 되는 것이다.
(Console에서는 print()의 실행 결과도 찍힌다.)
값에 대한 출력뿐만 아니라 아래와 같이 변수 값을 수정하거나,( po 변수명 = 값 / 변수 )
새로운 변수를 생성 및 사용할 수 있다. ( po var $변수명 = 값 / 변수 )
📂 Network Debugging
네트워크 연결이 항상 깔끔하게 유지될 수는 없는데, 여러가지 네트워크 상황을 부여하여 이를 테스트해 볼 수 있다.
(Simulator로는 할 수 없는 것 같다.)
Window - Devices and Simulators - Device Conditions - Condition을 Network Link로 설정해주면 된다.
구현 가능한 상황이 엄청 많아서, 디테일하게 여러가지 상황을 재현해 볼 수 있다.
📂 UI (Preview) Debugging
Preview는 SwiftUI의 등장 이후에 나타난 기능이다.
원래는 StoryBoard를 이용하여 View가 놓여진 정적인 부분만 확인이 가능했고, 코드로 구현 시에는 볼 수도 없었다.
그래서 View의 동적 변화들을 확인하기 위해서는 컴파일(실행) 후 해당 View까지 들어가야 했다.
그러나 Preview를 사용하면 컴파일을 하지 않아도 바로 View의 동적 변화가 확인 가능하다.
SwiftUI를 사용하면 기본적으로 구현이 되어 있으며,
UIkit을 사용할 때는 아래 포스팅의 코드를 참고하면 된다.
📌 마치며
와.. print()만 찍어냈던 나 진짜 반성해라
디버깅 할 때마다 의식하면서 이것저것 써보도록 반드시!! 노력할 것이다.
포스팅 정리하는데에도 낯이 익지가 않아 꽤 시간이 걸렸다.
무작정 개발이나 IDE 사용에 풍덩 뛰어들기 전에,
준비운동의 개념으로 디버깅 관련 포스팅들을 훑고 가는 것도 좋을 것 같다는 생각이 들었다.
오류 및 지적사항은 댓글로 남겨주시면 감사하겠습니다!
참고 :
https://meetup.toast.com/posts/315