Weekoding

[Swift] How to Debugging(LLDB, breakpoint) 본문

카테고리 없음

[Swift] How to Debugging(LLDB, breakpoint)

Weekoding 2022. 8. 23. 01:07

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 표시는 남겨진 채 비활성화 되며,

드래그 하여 밖으로 끌어내면 표시도 삭제할 수 있다. 

컴파일 시 아래에 뜨는 부분을 총괄적으로 'Debuging Area'라고 한다.(Debugging bar + Variables View + Console)

실행 도중 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 b로 내가 직접 변수나 프로퍼티 값을 체크할 수 있다.
Breakpoint를 벗어난 상태. 이 때는 콘솔창에 명령어를 입력해도 아무 효과가 없다.

 

값에 대한 출력뿐만 아니라 아래와 같이 변수 값을 수정하거나,( po 변수명 = 값 / 변수 )

새로운 변수를 생성 및 사용할 수 있다. ( po var $변수명 = 값 / 변수 )

 

 

 

 

 

 

📂  Network Debugging

네트워크 연결이 항상 깔끔하게 유지될 수는 없는데, 여러가지 네트워크 상황을 부여하여 이를 테스트해 볼 수 있다.

(Simulator로는 할 수 없는 것 같다.)

 

Window - Devices and Simulators - Device Conditions - ConditionNetwork Link로 설정해주면 된다.

구현 가능한 상황이 엄청 많아서, 디테일하게 여러가지 상황을 재현해 볼 수 있다.

 

 

 

 

📂  UI (Preview) Debugging

Preview는 SwiftUI의 등장 이후에 나타난 기능이다.

 

원래는 StoryBoard를 이용하여 View가 놓여진 정적인 부분만 확인이 가능했고, 코드로 구현 시에는 볼 수도 없었다.

그래서 View의 동적 변화들을 확인하기 위해서는 컴파일(실행) 후 해당 View까지 들어가야 했다.

 

그러나 Preview를 사용하면 컴파일을 하지 않아도 바로 View의 동적 변화가 확인 가능하다.

 

SwiftUI를 사용하면 기본적으로 구현이 되어 있으며,

UIkit을 사용할 때는 아래 포스팅의 코드를 참고하면 된다.

 

[Swift] UIKit코드로 SwiftUI Preview 사용해 보기

Storyboard 없으면 세상이 무너지는 줄만 알았던 나... Snapkit과 code 형식으로 AutoLayout을 짜는 것에 재미를 붙이고 있는 중이다. 코드로 작성된 UIKit 기반 레이아웃의 한 가지 불편한 점은 Simulator 혹은

weekoding.tistory.com

 

 

 

 

📌 마치며

와.. print()만 찍어냈던 나 진짜 반성해라

디버깅 할 때마다 의식하면서 이것저것 써보도록 반드시!! 노력할 것이다.

포스팅 정리하는데에도 낯이 익지가 않아 꽤 시간이 걸렸다.

 

무작정 개발이나 IDE 사용에 풍덩 뛰어들기 전에, 

준비운동의 개념으로 디버깅 관련 포스팅들을 훑고 가는 것도 좋을 것 같다는 생각이 들었다.

 

 

오류 및 지적사항은 댓글로 남겨주시면 감사하겠습니다!

참고 : 

https://meetup.toast.com/posts/315

https://cmindy.tistory.com/7

 

 

Comments