이클립스 디버깅 Tip ETC 2012. 8. 3. 10:10

예전 테스트 에디터를 사용해 개발할 때는 문제가 있을 것으로 의심되는 부분에 코드의 어는 부분이 실행되는지, 해당 부분에서 변수나 수식의 값이 어떻게 변하는지를 보기 위해 System.out.println() 을 넣고, 콘솔로 출력되는 메시지를 보며 작업했었다. 하지만, 이런 방법은 불편함과 문제를 안고 있다.

이에 Eclipse는 디버깅 작업을 효율적으로 할 수 있도록 도와주는 여러 가지 도구를 제공한다.


1. 디버그 모드로 실행하기

프로그램을 디버깅하려면 디버그 모두로 실행해야 한다. 디버그 모드로 프로그램을 실행할 때는 메뉴바의 Run > Debug As를 이용하면 된다. 메뉴바에서 Run > Debug를 선택하면 Debug 다이얼로그가 뜨며, Java Application에서 실행하려는 설정을 선택하고, Debug버튼을 누르면 프로그램이 디버그 모드로 실행된다.


만약, 이클립스 디버그에 관해 별도의 세팅을 하지 않은 경우에 아래와 같이 다이얼로그가 뜨며, 여기서 Java Application으로 프로젝트를 생성한다. 생성 방법은 Java Application노드에서 오른쪽 버튼 클릭 > New를 클릭하자.

그러면, 아래와 같은 다이얼로그가 나타난다.

위의 그림과 같이 Entry Point를 설정해 준다. 즉, main메소드가 있는 클래스의 이름을 셋팅해주고 기타 등등의 설정을 한후 Debug버튼을 클릭하면 디버그가 실행이 된다.

아래 그림은 Debug 다이얼로그에서 Main탭의 Stop in main 체크박스에 체크한 상태에서 프로그램을 디버그 모드로 실행한 모습이다. Stop in main 체크박스에 체크했기 때문에, main()매서드의 첫 코드가 실행되기 직전에 진행이 멈추었다. 이렇게 멈춘 프로그램을 계속하려면, Debug 뷰의 툴바에서 Resume 버튼을 누른다.

2. 브레이크포인트 (Breakpoint) 설정하기

작성한 프로그램이 의도대로 실행되지 않는다면, 의심되는 부분을 집중적으로 살펴봐야 하는데, 바로 이럴 때 사용하는 것이 브레이크포인트이다.

Eclipse는 프로그램을 실행하다가 브레이크포인트를 만나면 프로그램의 실행을 멈추고 에디터에 브레이크포인트가 지정된 행을 하이라이트한다. 이상태에서 프로그램을 한 단계씩 실행시키며 프로그램의 흐름이 원하는 대로 진행되는지, 각 변수나 수식의 값이 제대로 설정되고 있는지를 확인 할 수 있다. 브레이크포인트는 디버그 모드로 실행될 때만 의미가 있다.

브레이크포인트를 사용해보자. 에디터에서 브레이크포인트를 지정하고 싶은 위치에 에디터의 왼쪽에 있는 마커(marker bar)를 더블클릭하거나 마커바에서 오른쪽 버튼 클릭 > Toggle Breakpoint를 선택해도 된다. 브레이크포인트가 추가되면 마커바에 파란색 동그라미로 표시된다. 삭제는 파란색 동그라미를 더블클릭하면 제거된다.

브레이크포인트를 설정하고 디버그를 실행하면 아래와 같은 그림이 나온다.

설정된 브레이크포인트들은 [Breakpoints View]에 전부 리스트 되며 설정된 브레이크포인트는 Breakpoints View에서 해당 항목을 check, uncheck 함에 따라 활성화 또는 비활성화된다

* 브레이크포인트 활성화/비활성화

상황에 따라 브레이크포인트를 활성화하거나 비활성화할 수 있다. 활성화 상태에서 브레이크포인트의 팝업 메뉴중 Disable Breakpoint를 선택하면 비활성화 된다. 비활성화 브레이크포인트는 흰색 동그라미로 표시되고, 이 상태에서는 프로그램의 실행을 멈추지 않는다. 이는 특정 브레이크포인에서 실행을 멈추지 않고 싶지 않지만, 그렇다고 삭제하고 싶지 않은 경우에 이용한다.

비활성화를 활성화 하려면 팝업 메뉴에서 Enable Breakpoint를 선택하면 된다.

루프 안에 설정된 브레이크포인트의 반복 횟수가 많을 경우(오류로 인한 무한 로프) 특정 회수에 대해서만 프로그램이 멈추게 하기 위해서는 브레이크포인트가 설정된 마커바에서 오른쪽 버튼의 팝업 메뉴의 [Breakpoint properties]를 눌러 나타나는 팝업 창의 [Hit Count]를 체크하고 방문 횟수를 입력한다.

또는 Hit Count를 설정하려는 브레이크포인틀 선택한 다음 컨텍스트 메뉴에서 Hit Count를 선택하려는 브레이크포인트를 선택한 다음 컨텍스트 메뉴에서 Hit Count를 선택하면 아래와 같은 그림이 뜨며, 여기에 적절한 숫자를 입력하면 된다.

브레이크포인트에 Hit Count가 설정되면, Breakpoint 뷰에서 해당 브레이크포인트 옆에 아래 그림과 같이 Hit Count 숫자가 표시된다.

3. 디버그 진행하기

설정한 환경 (breakpoint, hit count, stop in main...) 에 따라 프로그램의 진행을 수동으로 관리할 수 있다. 여기에서는 [Debug View]의 툴 바에 있는 메뉴들을 중심으로 Debug 진행 관리 방법을 살펴보자.

(1) Resume (F8): 멈췄던 쓰레드 다시 진행. 다음 브레이크포인트까지 계속 진행

(2) Suspend: 쓰레드를 멈춤

(3) Terminate: 프로그램 종료

(4) Step Into (F5): 스텝 단위로 프로그램 실행, 메서드가 호출될 경우 그 메서드 안으로 이동

(5) Step Over (F6): 메서드가 호출되더라도 메서드 안으로 이동하지 않고 현재 코드 진행

(6) Step Return (F7): 현재 메서드로부터 리턴. 메서드 호출부로 위치 이동

(7) Drop to Frame: 특정 메서드를 실행하다 그 메서드의 처음부터 다시 실행

(8) Step Filtering: 디버깅 도중 디버깅 대상이 되지 않는 메서드 안으로는 들어가지 않게 설정하는 곳. [Window > Preferences > Java > Debug > Step Filtering]에서 설정

아래 그림과 같이 Debugging을 하며 관련된 변수들을 관찰할 수 있는 창이 있는데 이 창이 [Variables View]이다. 현재 가용한 변수들이 나열되고 현재 진행 시점에 할당되어 있는 값을 볼 수 있다.

[Display View] 현재 스택 프레임의 컨텍스트에서 실행할 수 있는 모든 종류의 수식을 입력 및 실행이 가능하다. 원본 코드의 수정 없이 다양한 형태로 메서드나 변수 값들을 또는 그 조합 결과를 확인해 볼 수 있다. [Window > Show View > Display] 로 Display View를 활성화 시킨다. 관찰하고자 하는 수식이나 메서드들을 기술해 놓는다. Debugging을 하면서 현재 Display View에 기술된 수식 또는 메서드의 상태 값을 알기 위해서는 해당 항목을 선택한 수 뷰 툴바의 [Display Result of Evaluating Selected Test] 또는 [Ctrl + Shift + D]를 누르면 값을 보여준다. 잘못된 입력이나 값을 알 수 없는 상황일 경우 에러를 보여준다.

[Inspect]는 Display View에서는 결과를 문자열로만 파악할 수 있다. 때문에 객체의 상태를 알기 위해서는 다른 방법을 사용해야 하며 그 중 하나가 Inspect 기능을 이용하는 것이다. Inspect 는 관찰 대상 수식을 선택하고 컨텍스트 메뉴에서 Inspect를 선택 (Ctrl + Shift + I)하는 것이다. 하지만 Inspect는 일시적인 관찰 방법이며 자세한 관찰을 하고 싶을 경우 [Ctrl + Shift + I]를 다시 눌러 Expression View 로 대상을 옮겨 관찰한다.

[Watch] 특정 수식을 지속적으로 관찰하고 싶을 경우 inspect 기능이나 Display View를 이용하는 것은 번거로울 수 있다. 이런 때 Watch 기능이 아주 유용할 수 있다. Watch 기능은 Expressions View안에서 작동한다. 위 그림에서 작은 '(X+Y)' 아이콘이 붙은 항목들이 Watch 기능이 적용되고 있는 것들이다. Watch 항목은 Expressions View 내에서 [컨텍스트 메뉴 > Add Watch Expression]을 눌러 나타나는 [Add Watch Expression] 위한 팝업 창에 여러 가지 수식을 입력하여 지속 관찰할 수 있다.