Eclipse 디버깅(Debugging)
디버깅은 프로그램의 버그를 발견하고 제거하는 과정입니다. 이 과정에서 프로그램에 직접 테스트 값을 입력해보고 흐름을 직접 따라가면서 어느곳에 문제가 있는지 찾아나갑니다. 프로그램을 개발할때에는 수없는 디버깅을 거치게 됩니다. 이는 개발 뿐만 아니라 이미 운영중인 프로그램의 유지보수 기간에도 해당하는데, 완성된 프로그램에도 오류가 발생하면 오류를 찾기위한 디버깅을 할 수 있습니다.

JAVA 프로그램을 주로 개발하는 무료 IDE(통합 개발 환경)인 이클립스는 강력한 디버깅 기능들을 제공합니다. 이번글에서는 간단한 JAVA 소스를 디버깅하는 방법을 알아보도록 하겠습니다.




퍼스펙티브
이클립스는 용도에 따른 여러가지의 퍼스펙티브(Perspective)를 제공합니다. 퍼스펙티브는 Java, JavaEE, Debug, Git 등 이클립스를 사용할때 어떤 작업을 하는지에 따라 구성을 달리 해놓은 작업화면 또는 작업모드(Mode)를 의미합니다. 예를들어 순수 Java SE 어플리케이션을 개발할때에는 Java 퍼스펙티브를 이용할 수 있고 이클립스로 Git을 다루거나 SVN을 이용해야 한다면 Git, SVN 퍼스펙티브로 전환하여 사용할 수 있습니다.




디버그  퍼스펙티브 만들기
디버깅 시에는 debug 퍼스펙티브를 이용하며, 디버그 퍼스펙티브를 만들어 보겠습니다. 그러나 디버그 퍼스펙티브를 만들지 않는다고 해도 디버깅이 시작되면 자동으로 디버그 퍼스펙티브로 전환할 수 있습니다.

두가지 방법이 있는데, 상단 메뉴 Window > Perspective > Open Perspective > Debug 선택 또는 Other(클릭 후 검색)
하거나 또는 이클립스 우측 상단에 퍼스펙티브 + 버튼을 눌러 Debug 퍼스펙티브를 검색하여 선택할 수 있습니다.



Debug를 선택하고 Open 클릭



이후 Debug 퍼스펙티브 아이콘을 클릭하여 사용 가능합니다. 화면 구성이 조금 달라지긴 했지만 개발시 사용하는 퍼스펙티브와 큰 차이는 없습니다. 각각의 View 항목들은 드래그 앤 드롭으로 옮겨서 자신이 보기 편한 형태로 구성할 수도 있습니다.





예제 소스
이클립스 디버깅을 학습하기 위한 간단한 소스예제입니다. 딱히 의미가 있는 코드가 아니고 정말 아무런 의미도 없는 디버깅 학습용 소스입니다. 자신의 소스로 이 포스팅을 따라오셔도 관계없습니다.
import java.util.ArrayList; 
import java.util.List; 
 
 
public class DebugTest { 
       public static void main(String[] args) { 
              List<Person> personList = new ArrayList<Person>();                                 
              personList.add(new Person(10"kim")); 
              personList.add(new Person(20"lee")); 
              personList.add(new Person(30"park")); 
              
              print(personList); 
              
       }
       
       
       public static void print(List<Person> personList) { 
              System.out.println("print start"); 
              
              for(Person person : personList) { 
                     System.out.println(person); 
              }
       }
       
}
 
 
class Person { 
       private Integer age; 
       private String name; 
       
       public Person(Integer age, String name) { 
              this.age = age; 
              this.name = name; 
       }
       
       public Integer getAge() { 
              return age; 
       }
       
       public String getName() { 
              return name; 
       }
       
       @Override 
       public String toString() { 
              return "Person [age=" + age + ", name=" + name + "]"
       }
       
}
 
cs



브레이크 포인트
디버깅을 시작하기 전에 특정 라인의 코드에서 어떤일이 일어나고 있는지를 알고 싶을때 해당 코드에 포인트를 하나 찍어두는데 이를 브레이크 포인트라고 합니다. 브레이크 포인트는 평소에는 영향이 없지만 디버그 모드로 프로그램을 실행 했을 때 동작합니다.

디버깅이 시작되고 프로그램이 실행되다가 진행 흐름이 브레이킹 포인트 지점에 도달하게 되면 프로그램이 정지(실질적으로는 해당 스레드가 정지) 되면서 그 지점에서 현재 시점에 프로그램이 어떤 상태인지를 파악할 수 있습니다.



브레이크 포인트 지정하기
브레이크 포인트를 지정하는 방법으로는 두 가지가 있습니다. 첫번째로는 라인넘버 왼쪽에 있는 마커바(Marker bar)에 디버깅을 원하는 라인에 더블클릭 하는 것이고 두번째로는 커서를 브레이크 포인트를 지정하고 싶은 코드 위에 두고 Ctrl + Shift + B 단축키를 지정하는 방법입니다.

브레이크 포인트가 지정되면 마커바에 파란색 점으로 표시됩니다. 브레이크 포인트는 실행되는 코드에만 지정할 수 있으며, 빈 공백 라인에는 지정할 수 없습니다.





브레이크 포인트 제거하기
브레이크 포인트를 제거할때는 지정할때와 반대로 마커바에 찍힌 브레이크 포인트를 더블클릭 하거나 해당 코드에 커서를 두고 Ctrl + Shift + B를 누르면 다시 제거됩니다.




디버깅 시작하기
브레이크 포인트를 원하는 코드에 걸어두었다면 디버깅을 시작합니다 main 메서드가 있는 Java SE 어플리케이션이라면 단축키 F11을 누르거나 클래스 마우스 우클릭 후 Debug As > Java Application을 클릭합니다. 또는 상단의 디버깅 아이콘을 클릭해도 됩니다.




JavaEE로 구현한 웹 어플리케이션이라면 Servers 뷰에서 서버 마우스 우클릭 후 Debug를 클릭합니다.


디버깅 진행하기
디버깅이 시작됐다면 브레이크 포인트를 걸어둔 로직이 진행되는 순간 디버그 퍼스펙티브로 전환할 것이냐는 팝업이 나타납니다.
This kind of launch is configured to open the Debug perspective when it suspends.
...
Do toy want to open this perspective now?

귀찮은 경우 Remember my decision 체크 후 Yes를 클릭합니다. 



퍼스펙티브가 전환됨과 동시에 디버깅 모드가 시작됩니다.
여기서 잠깐! No를 눌러 현재 퍼스펙티브(JAVA 또는 JAVAEE)에서 디버깅을 진행할수도 있지만 평소 개발할때의 퍼스펙티브 화면구성과 디버깅시의 퍼스펙티브 화면구성을 달리하여 사용하는 경우는 전환하여 사용하는것이 유용합니다.

예를들어 일반 코딩시에는 Servers 뷰 Outline, package explorer나 프로젝트 뷰, 콘솔 등의 개발시 사용되는 화면구성을 하겠지만 디버깅시에는 브레이크 포인트 뷰나, 디버그 뷰, 디스플레이 뷰 등 디버깅에 유용하고 디버깅과 관련된 여러 정보들을 볼 수 있는 화면 구성이 유용할 것입니다. 그러나 이 둘 모두를 한 화면에 놓고 쓸 수는 없고 그렇다 하더라도 너무나 화면이 복잡해질 수 있기 때문에 전환하여 사용하는 것을 권장합니다.


프로그램이 실행되면서 가장 최초의 브레이크 포인트의 코드가 실행되면 프로그램이 정지되면서 다음과 같이 초록색 블록으로 현재 다음의 코드를 실행하기 직전이라는 사실을 알려줍니다. 또한 마커 바에는 화살표로 표시되고 있습니다.






값 확인하기
디버깅을 하는 가장 큰 이유는 특정 코드를 실행하는 시점에 변수에 어떤 값이 들어있는가를 확인하는것입니다. 디버깅 모드에서는 해당 브레이크 포인트에 디버깅이 걸렸을 때 변수 위에 마우스 커서를 올려보면 팝업이 뜨면서 값을 확인할 수 있습니다. 참조변수의 경우에는 변수가 가리키는 객체의 멤버값들을 볼 수 있습니다.








디버깅 중간에 코드 실행하기
디버깅 중간에 코드를 실행할 수 있습니다. 이를 이용하면 예외를 발생시켜볼 수도 있고 특정 변수나 객체에 값을 추가하는것도 가능합니다.

현재 11번 라인에 디버깅이 걸려있는 상태입니다.




이상태에서 throw new RuntimeException(); 을 입력하고 커서로 블록을 씌운 후 Ctrl + Shit + D를 입력합니다. 코드를 실행하고 F8키를 눌러 디버깅을 진행하면 예외가 발생함과 동시에 예외로 인해 프로그램이 종료됩니다.






단축키
여기서 몇가지 단축키를 통해 다음 스텝(단계)으로 진행이 가능합니다. 단축키에 따라 얼마 만큼의 단위로 프로그램이 진행될 것인지의 행동을 실행할 수 있습니다.

F5 - 프로그램을 코드 한 라인씩만 실행합니다. 만약 특정 메서드를 실행하게 되면 해당 메서드 내부에 들어가서 진행됩니다. 정말 모든 코드를 한줄 한줄 세밀하게 진행하는 경우 사용합니다.

F6 - 프로그램을 코드 한 라인씩만 실행합니다. 다만 F5 단축키와의 차이점이라면 현재 클래스 상의 코드에서만 실행하며 다른 메서드를 호출하는 부분을 만나도 해당 메서드 선언 코드로 들어가서 진행하지 않는다는 점 입니다. 메서드 내부는 볼 필요 없고 현재 코드만 세밀하게 디버깅 하는 경우 사용합니다.

F7 - 현재 실행하는 메서드가 실행되고난 직후 다음 라인으로 넘어가지 않고 그상태로 정지합니다. 실행하는 메서드의 리턴값을 변수에 저장하는 경우에 디버깅 하는 경우 리턴 직후의 상태를 알고싶은 경우 유용합니다.

F8 - F8을 누르면 프로그램이 다시 진행되면서 다음 브레이크 포인트로 이동합니다. (프로그램이 쭈욱 진행되다가 다음 브레이크 포인트를 만났을때 다시 정지됨) 여기서는 20번째 라인의 출력문으로 이동합니다. 제가 가장 많이 사용하는 단축키이며 저는 브레이크 포인트를 필요한 코드에 모두 찍어두고 F8로 디버깅 하는것을 선호합니다.

Ctrl + F2 - 프로그램을 종료시킵니다.


연관글
블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

,