티스토리 뷰
오늘은 다양한 디버깅 방법에 대해 알아볼까 합니다.
구구절절 작성하기보다는 핵심만 간결하게 작성해보도록 하겠습니다 ㅎㅎ
1. 콘솔 창 메시지 확인
런타임 에러 발생 시, 앱 종료와 함께 앱이 종료된 이유를 콘솔 창을 통해 확인할 수 있습니다.
2. 디버거 활용 (Breakpoints & lldb)
두 번째 방법은 Breakpoints와 lldb를 활용하는 것입니다. 잘 사용하기 위해서는 디버깅 툴 바에 대해 이해하고 넘어갈 필요가 있습니다.
툴 바 설명
- Disable/enable breakpoint: 브레이크 포인트 활성화/비활성화 .
- Pause/continue execution: 프로그램 실행 중지/이어서 실행 (만약 다음 breakpoint가 있다면 해당 breakpoint에서 멈추게 됩니다.)
- Step over: 다음 라인으로 이동
- Step into: 특정 메서드 안으로 들어가기 (만약 현재 라인에서 특정 메서드를 호출하고 있다면 해당 메서드 안으로 들어갑니다.)
- Step out: 메서드 바깥으로 나가기
Breakpoints는 의미에서 유추해 볼 수 있듯이, 런타임 시 Breakpoint를 걸어둔 곳에서 실행을 멈출 수 있는 기능을 제공하는데요. Breakpoints는 코드 라인의 번호를 클릭하면 활성화되고 또 한 번 더 클릭하면 비활성화가 되게 됩니다. (삭제하고 싶을 시 바깥으로 Drag & Drop)
(참고로 Breakpoints는 런타임 시에도 활성화 및 비활성화가 가능합니다)
Breakpoint를 활성화할 경우 다음과 같이 Breakpoint가 걸린 지점에서 실행이 멈추게 됩니다.
그럼 아래와 같이 현재 멈춘 시점에서의 메모리 상태를 파악할 수 있고, 콘솔 창의 lldb를 통해 변수나 객체의 상태와 값들을 출력해 볼 수 있습니다.
여기서 lldb란 Low-Level Debugger의 약자로 다양한 command를 제공합니다.
조사하고 싶은 객체나 변수를 확인하는 용도로 po와 p를 사용하며 다음과 같이 help를 통해 어떤 command가 있는지 확인해 볼 수 있습니다.
또 만약 특정 command의 subcommand를 파악하고 싶다면, 다음과 같이 help + 특정 command 하시면 됩니다.
3. UI 디버깅
UI의 경우 기대와 다르게 이상하게 나오거나 잘리거나 혹은 보여야 할 뷰가 보이지 않거나 등등 다양한 문제가 있을 수 있는데요. 이럴 경우 View Hierarchy(아래 빨간 박스)를 활용하면 어떤 문제가 있는 건지 조금 더 직관적으로 파악할 수 있습니다.
위와 같이 View Hierarchy를 통해 뷰 계층 파악, 사이즈, 설정 등을 확인해 볼 수 있고, 디버깅 툴 바의 continue excution 버튼을 통해 앱 실행을 이어나갈 수 있습니다.
4. Thread Sanitizer
개발을 하다 보면 *동시성 문제와 마주할 수도 있는데요. 만약 경쟁상태가 발생할 경우, 매번 실행할 때마다 동일한 값을 기대할 수 없게 됩니다. 만약 이미지 캐싱을 라이브러리를 사용하지 않고 자체적으로 구현한다 했을 때, Dictionary를 사용하면 Dictionary의 경우 thread-safe하지 않기 때문에 동시성 문제가 발생할 수 있습니다. 그럼 런타임 에러가 발생하거나 예상하지 못한 결과값이 나올 수 있게 되죠 ㅜㅜ
* 여러 개의 스레드가 동시에 동일한 메모리에 접근하는 경우 발생하는 문제들
Xcode는 이러한 동시성 문제를 확인할 수 있도록 Thread Sanitizer를 제공합니다.
Product > scheme > editScheme > Run > Diagnostics로 가시면 Thread Sanitizer 체크박스를 볼 수 있는데요.
이 Thread Sanitizer를 체크한 후 빌드하면 다음과 같이 thread safe하지 않은 코드에 대해 보라색 warning 알림을 띄워주게 됩니다.
경쟁상태가 발생하고 있음을 알려주는군요 ㅎㅎ
(참고로 위와 같은 경우에는 Dictionary대신 NSCache를 사용하면 동시성 문제를 해결할 수 있습니다. NSCache는 thread-safe)
추가적으로 Thread Sanitizer를 체크할 경우 빌드에 소요되는 시간이 더 길어지니, 문제 해결 후에는 체크를 해제하시기 바랍니다.
'Swift&iOS > iOS' 카테고리의 다른 글
[iOS] 아이폰 검색(spotlight)에 앱 이름과 다른 이름으로 검색되도록 하기 (1) | 2022.08.07 |
---|---|
[iOS] Instruments (0) | 2021.09.10 |
[iOS] SwiftUI 기초 - 공식 튜토리얼 정리(2) (0) | 2021.04.15 |
[iOS] SwiftUI 기초 - 공식 튜토리얼 정리(1) (4) | 2021.04.14 |
[iOS] GCD - QoS, DispatchWorkItem, DispatchGroup 제대로 알고 쓰자! (2) (0) | 2021.04.13 |