티스토리 뷰

Swift&iOS/iOS

[iOS] 앱 디버깅 방법들

lsh424 2021. 9. 9. 14:53

오늘은 다양한 디버깅 방법에 대해 알아볼까 합니다. 

구구절절 작성하기보다는 핵심만 간결하게 작성해보도록 하겠습니다 ㅎㅎ

 

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를 통해 변수나 객체의 상태와 값들을 출력해 볼 수 있습니다. 

현재 멈춘 시점에서의 메모리 할당 상태

 

po(print object)를 사용한 변수 값 출력
po를 사용한 collectionview 출력

여기서 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를 체크할 경우 빌드에 소요되는 시간이 더 길어지니, 문제 해결 후에는 체크를 해제하시기 바랍니다.

댓글
링크
최근에 올라온 글
최근에 달린 댓글