Android Studio (IntelliJ) 디버거 활용 팁
2016년 devfest에서 안드로이드 개발에 유용한 도구들이란 주제로 발표할 때 안드로이드 스튜디오의 디버거 팁을 살짝 다뤘는데, 얼마 전 사내 팀 스터디에서 다시 한번 정리한 내용을 공유해본다.
단위 테스트의 어려움 때문인진 몰라도 안드로이드 앱을 만들다보면 웹 애플리케이션 개발을 할 때 보다 디버거에 의존할 일이 많다. 이 때 몇 가지 디버거의 기능을 사용하면 개발 속도, 특히나 디버깅 시간을 많이 단축할 수 있을 것이다.
아래 모든 설명은 맥을 기반으로 작성했다. 하지만 윈도우도 단축키만 살짝 다를 뿐 모든 기능은 동일하다.
중단점(Breakpoint) 걸기
코드와 라인 번호 사이의 공간을 클릭하면 중단점을 설정할 수 있다.
- 좌클릭: 중단점 설정. 한번 더 좌클릭하면 설정된 중단점을 해제한다.
- 우클릭: 세부 설정 팝업 표시.
- Option+ 좌클릭: 중단점 활성/비활성 전환. 중단점을 해제해버리면 열심히 설정한 세부 정보가 다 날아가버리므로 중단점을 잠깐만 사용하지 않을 경우엔 비활성화 기능을 이용하자.
![](https://steemitimages.com/500x500/https://steemitimages.com/DQmbkQ6h8GXLj9HAk5biWWfPNj2eWZHemSS3zTMEQFFGJnJ/image.png)
디버깅 모드로 실행하기
디버깅을 하려면 앱을 디버깅 모드로 실행하거나, 실행중인 안드로이드 앱에 디버거를 붙이면 된다. 대게는 실행중인 앱에 디버거를 붙이는 방식을 사용하게 된다. 이 명령은 툴바의 아이콘을 누르거나, Cmd+Shift+A 를 누르면 나오는 명령 검색 창에서 Attach debugger to Android process
를 선택해서 실행할 수 있다. 기왕이면 단축키를 하나 지정하는 편을 권장한다.
![](https://steemitimages.com/600x600/https://steemitimages.com/DQmRXWUjDXNLuMirtx7tt8PpTbfpPzLro555cmbGJrUP9Q1/image.png)
내비게이션
중단점에 동작이 멈춘 상태에서 다음 라인으로 넘어가거나, 함수 호출 내부로 이동하는 등으로 프로그램을 순차적으로 실행할 수 있다.
- 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
기능을 이용해 등록해두면 매번 평가식을 입력하지 않아도 된다.
![](https://steemitimages.com/600x600/https://steemitimages.com/DQmdrreqoGibPQYQiW6Da3ALV4ciUuNWVWufpEhc287Z6kp/image.png)
Code fragment 모드
![](https://steemitimages.com/600x600/https://steemitimages.com/DQmeqwu1SQUExJvP2ztmJK7SwKWDKdmrDmZw3a6yUzMHp26/image.png)
Watch
조작
평가 뿐 아니라 값을 바꿔버릴 수도 있다. http response code가 200이 떨어졌지만 500으로 바꿔버리는 등의 조작을 쉽게 할 수 있다.
Variable 목록에서 우클릭 > Set value...
메뉴를 선택하면 된다. 단순한 숫자/문자값 뿐 아니라 객체 인스턴스도 새로 만들어서 교체할 수 있다. 인스턴스를 바꾸고싶다면 입력창에 생성자를 입력하면 된다.
![](https://steemitimages.com/640x0/https://steemitimages.com/DQmaQujLsMxvpSB5bmsWqQKRpQSCp8vzSbf6jCmv3dMUf2B/image.png)
Set Value... 메뉴
![](https://steemitimages.com/DQmWzjyVhu3EzqCV5B6qLeSsjWHNWMzNax7FPLDa1pRgrXL/image.png)
생성자를 입력하여 객체 바꾸기
상세 옵션
이제 중단점에서 우클릭하면 나오는 옵션 창의 주요 기능을 다뤄본다. 옵션 창에서 More
영역을 누르면 더욱 세부적인 설정을 할 수 있는 창이 뜬다.
조건부 중단점 설정
반복문으로 100명의 user list 를 순회하다가 name 이 "홍길동" 인 객체에만 딱 멈추고 싶다면 어떻게 할까? 무조건 중단점을 걸고, 홍길동이 나올 때 까지 resume을 연타해야 할까?
이 땐 Condition
옵션을 활용하면 된다. 이 옵션을 켜면, 입력한 표현식의 평가 결과가 true일 경우에만 중단점에서 동작을 멈춘다. 따라서 user.name == "홍길동"
이런 표현식을 입력하면 간단하게 문제를 해결할 수 있다.
![](https://steemitimages.com/600x600/https://steemitimages.com/DQmP61Su8aBDmhdLt6S3kE8KTJs9GGXkVoa9xBJXGCf4aJP/image.png)
자매품으로 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 들여다보면서 왜 안찍히냐고 하지 말자.
![](https://steemitimages.com/600x600/https://steemitimages.com/DQmUbwmCK8fQheKJu297qZWKyHwAuxFEuqaPjFqSmxeFJhu/image.png)
옵션 설정
![](https://steemitimages.com/600x600/https://steemitimages.com/DQmVBadMeeBT3aTxpWDo3ChFZTtYwrhEWGpzeoX4wGqpkkp/image.png)
출력된 로그
더 공부하기
이 글에서 다룬 내용은 다 intellij 설명서의 Debugging에 나와있다. 읽기 힘들어서 문제이지. 더 알아보고 싶은 분은 위 문서를 찬찬히 읽어보시기 바란다.