이번 포스트 시리즈에서는 이클립스에서 A.P.S를 위한 디버거 사용에 대해 알아본다. 먼저 디버깅을 위한 환경 설정에 대해서 알아보자.
여기서는 아래의 코드에 대해 디버깅을 실행해보자.
package debug;
import java.util.Arrays;
public class Test {
static int[] arr;
public static void main(String[] args) {
int dan = 5;
arr = new int[10];
for (int i = 1; i < 10; i++) {
arr[i] = multi(dan, i);
}
System.out.println(Arrays.toString(arr));
}
static int multi(int num1, int num2) {
return num1 * num2;
}
}
debugging perspective
debug perspective로 전환하기
일단 debugging을 위한 perspective로 전환이 필요하다. debug perspective로 전환하기 위한 방법은 여러 가지인데 첫 번째 방법은 줄번호 왼쪽의 break point 표시 바를 더블클릭해서 break point를 잡은 후 디버그를 클릭한다.
최초 실행 시에는 debug 실행 시 자동으로 perspective를 변경하도록 설정할 것인지 묻는데 편리한 옵션이므로 Remember my decision을 체크하고 switch 버튼을 클릭한다.
또는 두 번째 방법으로 Open Perspective 버튼 클릭 후 Debug를 선택해서도 진입이 가능하다.
이 후에 디버그 모드를 사용하려면 벌레 모양의 아이콘만 클릭하면 된다.
View의 배치
debug perspective의 주요 view들은 다음과 같다.
Debug: 메서드 호출 스택을 확인할 수 있다.
Variables: 현재 실행되는 메서드 스택의 변수들을 보여준다. 따라서 메서드가 변경 될 때마다 달라진다.
Breakpoints: 잡혀있는 모든 break point에 대한 정보를 보여준다.
Expressions: 표현식을 적을 수 있는 곳으로 지속적으로 모니터링 할 대상들을 기입하기도 한다.
Debug Shell: 명령을 입력하면서 디버깅 해볼 수 있다.
Console: 표준 입출력을 위해 사용된다.
처음 perspective를 열면 여러 창들이 복잡하게 나오는데 각자 사용하기 편하게 View들을 배치하는 것이 좋다. 모든게 동시에 필요하지는 않기 때문이다. 모니터의 크기도 중요한 고려 사항이다.
호불호가 있는데 필자의 경우 아래 처럼 View를 배치한다.
가장 중요한 Editor 부분과 Variables와 Expressions는 자주 참조하기 때문에 언제나 보일 수 있게 했다. Variable과 Expressions는 자료의 특성상 가로보다는 세로로 배치하는게 유리하다. Debug Shell, Console, Debug는 가로로 겹치게 배치해서 필요할 때만 참조한다.
다시 한번 이야기 하지만 지극히 개인적이다.
view의 배치를 마쳤으면 Window > Perspective > Save Perspective as 메뉴를 이용해서 기존 설정을 바꿔주자.
Debugger 설정
이번에는 디버거에서 유용한 옵션들에 대해 살펴보자. window > preferences > java > debug 메뉴에서 다음 설정들을 살펴보자.
Detail Formatters
Variables View에서 변수가 출력되는 toString 메서드를 재정의 할 수 있다. 예를 들어 배열을 출력한다고 했을 때 기본적으로는 배열의 주소값에 해당하는 id만 보이고 내용을 알고 싶다면 변수를 선택했을 때 하단에 출력된다. value에 바로 내용이 출력된다면 훨씬 직관적일 것이다.
Detail Formatters의 Show variable details 항목에서 As the label for all variables를 선택하면 변수 옆에 바로 값이 표현된다.
Step Filtering
디버거를 통해서 코드를 한줄 한줄 따라가다 보면 시스템 라이브러리까지 파고들 때가 종종 발생한다.
System.out.println(Arrays.toString(arr));
System.out.println을 디버깅 할 필요는 없다. 물론 Step Over를 잘 눌러줬다면 괜찮았겟지만 상당히 귀찮다. 이런 경우 Step Filtering에 건너뛸 패키지, 클래스를 지정할 수 있다.
Step Filtering에서 Use Step Filters를 체크한 후 건너뛸 항목을 선택해준다.
organize import 중지
organize imports를 사용하면 저장 시 정확히 사용한 클래스만 import 한다. 즉 java.util.* 형태로 import 되어있더라도 java.util.ArrayList 형태로 변경시켜 버린다. 또한 소스 코드에서 사용하지 않은 클래스는 import에서 제외 시킨다. 가끔 디버깅 과정에서 Debug Shell 이나 Expressions에서 소스에 나오지 않은 추가적인 클래스를 사용할 경우가 있는데 import가 되어있지 않으면 사용할 수가 없다.
따라서 소스 코드에는 없더라도 Debug Shell 등에서 클래스를 사용하려면 window > preferences > java > Code Style > Organize Import 에서 java 항목을 삭제한다.