Android Studio (IntelliJ) 디버거 활용 팁
2016년 devfest에서 안드로이드 개발에 유용한 도구들이란 주제로 발표할 때 안드로이드 스튜디오의 디버거 팁을 살짝 다뤘는데, 얼마 전 사내 팀 스터디에서 다시 한번 정리한 내용을 공유해본다.
단위 테스트의 어려움 때문인진 몰라도 안드로이드 앱을 만들다보면 웹 애플리케이션 개발을 할 때 보다 디버거에 의존할 일이 많다. 이 때 몇 가지 디버거의 기능을 사용하면 개발 속도, 특히나 디버깅 시간을 많이 단축할 수 있을 것이다.
아래 모든 설명은 맥을 기반으로 작성했다. 하지만 윈도우도 단축키만 살짝 다를 뿐 모든 기능은 동일하다.
중단점(Breakpoint) 걸기
코드와 라인 번호 사이의 공간을 클릭하면 중단점을 설정할 수 있다.
- 좌클릭: 중단점 설정. 한번 더 좌클릭하면 설정된 중단점을 해제한다.
- 우클릭: 세부 설정 팝업 표시.
- Option+ 좌클릭: 중단점 활성/비활성 전환. 중단점을 해제해버리면 열심히 설정한 세부 정보가 다 날아가버리므로 중단점을 잠깐만 사용하지 않을 경우엔 비활성화 기능을 이용하자.
디버깅 모드로 실행하기
디버깅을 하려면 앱을 디버깅 모드로 실행하거나, 실행중인 안드로이드 앱에 디버거를 붙이면 된다. 대게는 실행중인 앱에 디버거를 붙이는 방식을 사용하게 된다. 이 명령은 툴바의 아이콘을 누르거나, Cmd+Shift+A 를 누르면 나오는 명령 검색 창에서 Attach debugger to Android process
를 선택해서 실행할 수 있다. 기왕이면 단축키를 하나 지정하는 편을 권장한다.
내비게이션
중단점에 동작이 멈춘 상태에서 다음 라인으로 넘어가거나, 함수 호출 내부로 이동하는 등으로 프로그램을 순차적으로 실행할 수 있다.
- Step into(F7): 함수 호출 내부로 이동한다.
- Smart step into(Shift + F7): 한줄에 호출한 함수가 여러개일 경우, Step into의 경우 가장 먼저 호출된 함수의 내부로 이동한다. 그런데 이동하고자 하는 함수가 맨 먼저 호출된 함수가 아닐 경우, 이동할 함수를 직접 선택할 수 있다.
- Step over(F8): 다음 줄로 넘어간다.
- Step out(Shift+F8): 현재 함수를 빠져나간다.
- Run to cursor(Option+F9): 멈추고자 하는 줄이 저~ 밑에 있을 경우 Step over를 연타할 수도 있지만 Run to cursor 기능을 이용하면 한번에 현재 커서가 위치한 줄로 넘어갈 수 있다.
- Resume(Option+Cmd+F8): 멈춘 상태를 해제하고 계속 프로그램을 실행함
- Stop process(Cmd+F2): 디버깅 프로세스를 종료하고 계속 프로그램을 실행함
값 평가 / 조작
실행이 멈춘 상태에서 다양한 객체나 변수들의 값을 평가하거나 조작할 수 있다. 코틀린에선 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에 나와있다. 읽기 힘들어서 문제이지. 더 알아보고 싶은 분은 위 문서를 찬찬히 읽어보시기 바란다.