이번 포스트에서는 다양한 상황을 이용해 디버거를 사용해보자. 디버깅에는 다음의 소스 코드를 사용한다.
package debug;
import java.util.*;
public class DebugTest01 {
static int[] arr = new int [10];
public static void main(String[] args) {
int dan = 5;
for (int i = 0; i < 10; i++) {
arr[i] = multi(i, dan);
}
System.out.println(Arrays.toString(arr));
}
static int multi(int num1, int num2) {
return num1 * num2;
}
}
break point 잡기/해제하기
디버깅 모드에서 동작 중 디버깅을 시작할 지점을 break point라고 한다. break point를 잡기 위해서는 에디터의 줄번호 좌측에 있는 영역(마커 바라고 한다.)을 더블클릭한다. 지정된 break point를 다시 더블클릭하면 break point 지정이 해제된다.
break point가 적용되는 시점은 해당 라인을 실행하기 전이다. 따라서 아직 메모리에 dan 변수는 생성되지 않은 시점이다.
debug toolbar
디버깅을 위해서는 debug toolbar 메뉴를 사용한다. break point를 잡고 Debug 버튼을 클릭하면 debug toolbar의 아이콘들이 활성화 된다.
아이콘
메뉴 이름
설명
Debug
디버깅을 시작한다.
Step Into
다음 라인으로 이동한다. 만약 메서드를 만나면 매서드 내부로 진입한다.
Step Return
현재 메서드에서 즉시 return 한다. (호출한 곳으로 이동)
Step Over
다음 라인으로 이동한다. 메서드를 만나도 내부로 진입하지 않고 다음 라인으로 이동한다.
Resume
다음 브레이크 포인트를 만날때까지 진행한다.
Suspend
현재 작동중인 Thread를 일시 정지한다.
Terminate
현재 작동중인 Thread를 종료한다.
Drop To Frame
메서드를 처음부터 다시 실행한다.
Use Step Filters
Step Filter를 사용한다.(토글)
Skip All Breakpoints
모든 브레이크 포인트를 생략한다.
Disconnect
원격 디버깅에서 remote와의 접속을 끝낸다.
Variables
Variables는 현재 동작중인 메서드의 변수들을 보여주는 View이다.
Name에는 변수의 이름, Value는 변수의 값이 표현된다. 변수를 클릭하면 하단에 변수의 내용을 표현해준다. 기본 값으로는 non static 변수들이 표시되는데 static까지 같이 표현하고 싶다면 ፧ > Java > Show Static Variables를 선택한다.
메서드 내부에서 다름 메서드를 호출한 후 결과 값을 return 받았을 때는 no method return value 부분에 리턴 받은 값이 출력된다.
Variables는 메서드 마다 실행되기 때문에 다른 메서드로 디버거가 이동하면 내용은 리셋 된다.
Expressions
Expressions View는 표현식을 지정해 놓고 모니터링 할 수 있다. 화면 구성은 Variables와 마찬가지로 Name과 Value로 나뉘어 있는데 Name에는 확인하고 싶은 expression을 지정하면 된다.
expression들은 아직 메모리에 등장하지 않은 요소들이 있어서 표현할 수 없다면 오류가 표시되고 동작 가능한 시점에 값이 출력된다.
Variables와 달리 메서드 단위로 동작하지 않기 때문에 지정한 expression을 계속해서 모니터링 할 수 있다.
Breakpoint Properties
구구단을 디버깅 하다가 *7까지는 잘 검증이 됐지만 *8부터 디버깅을 해봐야할 경우도 발생한다. 이를 위해 처음부터 한땀 한땀 디버깅 해간다면 매우 시간 낭비이다. 이때 Berakpoint Properties를 사용할 수 있다.
break point를 오른쪽 클릭해서 Breakpoint Properties를 선택하거나 BreakPoints View에서 원하는 BreakPoint를 선택하면 메뉴로 진입할 수 있다.
BreakPoint Properties에서 신경쓸 부분은 Hit count와 Conditional이다.
HitCount는 값과 상관 없이 몇 번째 호출된 시점에서 디버깅을 시작할 것인가 하는 것이다. 이 숫자는 1부터 시작한다. 따라서 *8부터 디버깅 하고 싶다면 i가 0부터 시작하니까 9번째 호출되는 시점이다.
Hit count가 9일 때 i는 8에서 멈춰 선 것을 확인할 수 있다.
Conditional은 조건 값을 이용할 경우 사용한다. Hit count와 달리 반복해야하는 회수를 지정하기 어려울 때 아주 유용하다. Conditional을 체크한 후 하단에 boolean 결과가 나오는 표현식을 적어주면 된다.
이제 i==8인 상황에서 디버거가 대기중인 것을 볼 수 있다. Hit count보다 좀 더 직관적인것 같다.
Debug Shell
Debug Shell은 디버거가 대기중인 시점에 알고 싶은 내용을 코딩으로 질의할 수 있는 기능을 제공한다.
메뉴
아이콘
설명
Display Result of Evaluating Selected Text
선택된 코드를 실행하고 결과를 출력한다.
Execure the Selected Text
선택된 코드를 실행한다.
Create a Watch Expression From the Selected Text
선택된 코드를 Expressions에 추가한다.
예를 들어 현재 arr의 모든 요소들의 합을 알고 싶다면 아래와 같이 작성해볼 수 있다. 신통하게도 자동완성까지 완벽하게 지원된다.
Debug Shell에 작성한 내용을 드래그로 선택한 후 Execute the Selected Text를 선택하면 코드를 그대로 실행한다.
또는 어떤 표현식을 작성 후 Display Result of Evaluating Selected Text를 선택하면 실행 결과를 Debug Shell에 직접출력해준다.