2016년 devfest에서 안드로이드 개발에 유용한 도구들이란 주제로 발표할 때 안드로이드 스튜디오의 디버거 팁을 살짝 다뤘는데, 얼마 전 사내 팀 스터디에서 다시 한번 정리한 내용을 공유해본다.
단위 테스트의 어려움 때문인진 몰라도 안드로이드 앱을 만들다보면 웹 애플리케이션 개발을 할 때 보다 디버거에 의존할 일이 많다. 이 때 몇 가지 디버거의 기능을 사용하면 개발 속도, 특히나 디버깅 시간을 많이 단축할 수 있을 것이다.
아래 모든 설명은 맥을 기반으로 작성했다. 하지만 윈도우도 단축키만 살짝 다를 뿐 모든 기능은 동일하다.
코드와 라인 번호 사이의 공간을 클릭하면 중단점을 설정할 수 있다.

디버깅을 하려면 앱을 디버깅 모드로 실행하거나, 실행중인 안드로이드 앱에 디버거를 붙이면 된다. 대게는 실행중인 앱에 디버거를 붙이는 방식을 사용하게 된다. 이 명령은 툴바의 아이콘을 누르거나, Cmd+Shift+A 를 누르면 나오는 명령 검색 창에서 Attach debugger to Android process를 선택해서 실행할 수 있다. 기왕이면 단축키를 하나 지정하는 편을 권장한다.

중단점에 동작이 멈춘 상태에서 다음 라인으로 넘어가거나, 함수 호출 내부로 이동하는 등으로 프로그램을 순차적으로 실행할 수 있다.
실행이 멈춘 상태에서 다양한 객체나 변수들의 값을 평가하거나 조작할 수 있다. 코틀린에선 val 로 선언된 변수의 값은 바꿀 수 없지만, 디버거에선 그런 제약없이 모두 조작할 수 있다.
Option + F8 을 눌러 Evaluate 기능을 실행하면 표현식을 이용해 값을 평가할 수 있다. 자동완성도 지원한다. 코틀린의 경우 기본은 expression 모드인데, 이 경우 하나의 표현식만 입력할 수 있다. 간단한 표현식의 경우 Expression 모드가 편하지만 하나의 표현식만으로 원하는 평가값을 얻기 힘들 경우엔 evaluate 팝업 우상단의 확대/축소 모양 아이콘을 눌러 Code fragment 모드로 전환하면 여러 줄로 평가 표현식을 만들어낼 수 있다.
지속적으로 관찰해야 하는 표현식은 Watch기능을 이용해 등록해두면 매번 평가식을 입력하지 않아도 된다.
Code fragment 모드
Watch
평가 뿐 아니라 값을 바꿔버릴 수도 있다. http response code가 200이 떨어졌지만 500으로 바꿔버리는 등의 조작을 쉽게 할 수 있다.
Variable 목록에서 우클릭 > Set value... 메뉴를 선택하면 된다. 단순한 숫자/문자값 뿐 아니라 객체 인스턴스도 새로 만들어서 교체할 수 있다. 인스턴스를 바꾸고싶다면 입력창에 생성자를 입력하면 된다.
Set Value... 메뉴
생성자를 입력하여 객체 바꾸기
이제 중단점에서 우클릭하면 나오는 옵션 창의 주요 기능을 다뤄본다. 옵션 창에서 More 영역을 누르면 더욱 세부적인 설정을 할 수 있는 창이 뜬다.
반복문으로 100명의 user list 를 순회하다가 name 이 "홍길동" 인 객체에만 딱 멈추고 싶다면 어떻게 할까? 무조건 중단점을 걸고, 홍길동이 나올 때 까지 resume을 연타해야 할까?
이 땐 Condition 옵션을 활용하면 된다. 이 옵션을 켜면, 입력한 표현식의 평가 결과가 true일 경우에만 중단점에서 동작을 멈춘다. 따라서 user.name == "홍길동" 이런 표현식을 입력하면 간단하게 문제를 해결할 수 있다.

자매품으로 More 상세옵션 창을 열면 보이는 Pass count 옵션도 있다. 이 옵션은 n번 까진 멈추지 말라는 기능이다. 100개의 리스트를 순회하는데 35번은 건너뛰고 그 다음에 멈추고 싶다면 Pass count에 35를 입력하면 된다. 하지만 한번 멈춘 다음엔 다시 멈추지 않는다고 문서에 나와있으니 Condition 옵션과 적절히 비교해서 사용하길 바란다.
아니, 멈추라고 중단점 거는거 아니야? 싶지만 안 멈추는 중단점은 나름 매우 유용한 기능이다. 개발을 하다 묘한 버그 상황에 닥쳤을 때 쉽게 할 수 있는 선택은 Log.d("여기 도착했음 - a = ${a}" ) 이런 식의 임시 로그 떡칠이다. 하지만 아래와 같은 상황이 쉽게 발생한다.
(로그 붙이고 재빌드)
앗, 로그가 빠졌네? 여기도 또 로그 넣자! (재빌드)
아이고 여기가 아닌가벼... 여기도 로그 넣자! (재빌드)
안드로이드의 경우엔 빌드 시간도 무시못하기에 이러다보면 금방 시간을 허비하게 된다. 이 때엔 안 멈추는 중단점을 이용하면 쉽게 아래의 목적을 달성할 수 있다.
옵션 창에서 기본으로 켜져있는 Suspend 옵션을 끄면 안 멈추는 중단점이 된다. 이렇게만 해선 의미가 없고, 아래 화면과 같이 Log message to console 이나 Evaluate and log 옵션을 켜야 의미가 있다. 이 로그는 debug 윈도우의 console 탭에 표시된다. 괜히 logcat 들여다보면서 왜 안찍히냐고 하지 말자.

옵션 설정

출력된 로그
이 글에서 다룬 내용은 다 intellij 설명서의 Debugging에 나와있다. 읽기 힘들어서 문제이지. 더 알아보고 싶은 분은 위 문서를 찬찬히 읽어보시기 바란다.