adsense



이클립스에서 java 디버깅하기 기초

자바 어플리케이션이 제대로 동작하지 않을 때 문제점을 파악하고 디버깅하기 위한 기초적인 요령입니다.

가장 알기 쉽게, 어플리케이션이 강제 종료(크래시)되거나 뻗어버리는 경우(주로 Excepion이 try-catch에 붙잡혀서 크래시만 되지 않은 상태)를 예로 들어보겠습니다.
※스크린샷은 클릭해서 크게 볼 수 있습니다.


이클립스의 Window-Show view-Console을 선택, 이클립스창 하단에 Console창을 활성화합니다. (대개는 기본적으로 활성화되어 있습니다.)

자바 어플에서 Exception이 발생하면 Console에 아래 그림과 같이 오류 메시지가 뜹니다.



메시지의 구성은 제일 위에 익셉션의 종류, 그리고 어느 함수에서 익셉션이 발생했고, 그 함수는 어디에서부터 호출되었는가가 역순서로 나타납니다.

훑어보면 (파일명.java:숫자) 이런 식으로 나타나는, 자신이 만든 java 파일의 이름을 찾을 수 있습니다.



여기서 숫자는 익셉션이 발생한 해당 java 파일의 줄 번호입니다.



자신이 만든 것 중 가장 상위의 것(발생 원인이 반드시 거기는 아니지만 일단)의 (파일명.java:숫자)를 마우스로 더블클릭하면 해당 파일의 라인으로 바로 이동합니다.

여기서 어째서 이런 에러가 발생했는가 파악하기 위해 브레이크 포인트를 겁니다. shift+ctrl+B 키로 포인트를 걸거나 해제합니다.



해당 라인에 걸어도 되지만, 몇 라인쯤 앞쪽에 브레이크 포인트를 거는 것이 요령입니다.

그 다음, 어플을 F11키를 눌러 디버그 모드로 실행합니다. (추적을 행하기 때문에 ctrl+F11로 실행하는 것 보다 느립니다)


이제 자바VM은 브레이크 포인트를 만나면 브레이크가 걸리고, 화면이 디버그 퍼스펙티브로 바뀝니다. (이 화면 기준으로 우상단에서 퍼스펙티브를 선택할 수 있습니다. 디버그가 끝나면 Java 탭을 클릭해서 보통의 코딩 퍼스펙티브로 돌아오면 됩니다)

브레이크가 걸린 시점에서 Run 메뉴를 열어보면 Resume, Stop, Step Into, Step Over..등의 메뉴가 보입니다.
이외에도 몇 가지 더 있지만 디버깅 과정에서 우리가 가장 많이 사용하게 될 것은 주로 이 네 가지입니다.

F6키(Step Over)를 누르면 한 줄씩 아래로 처리하며 내려가는 것을 볼 수 있습니다.

익셉션이 발생한 지점까지 아무 일 없이 통과했다면 익셉션이 걸린 라인에서 잠시 대기.
대개의 익셉션 오류는 사용자가 선언, 생성한 객체, 그리고 그에 대한 억세스 과정에서 생기기 때문에 현재 객체들의 상태(변수들 포함)가 어떻게 되었는지 파악하는게 디버깅의 요령입니다.


우상단의 공간을 보면 Variables란 탭이 있습니다.
여기 현재 활성화된 객체들이 나타납니다. 클릭해서 하위요소값들도 확인할 수 있습니다.


혹은 소스상의 변수명 위에 마우스 커서를 올려서 확인할 수도 있습니다. 어느 방법이 좋은가는 그때그때..

잘 보면 BufferedImage 객체인 img의 width와 height가 -1이 들어 있습니다.
즉, img에 제대로 된 이미지가 부여되지 않았다=로드 실패라고 추정할 수 있습니다.


어째서 실패했을까, 확인해보면 이렇게 리소스 파일명을 잘못 적어서 로딩에 실패한 것입니다. (파일명은 몰라도 경로명을 잘못 적은 케이스는 상당히 흔합니다..)

오류의 원인 제공자(?)가 반드시 익셉션이 발생한 위치가 아니라는 것도 함께 알 수 있습니다.


어플리케이션이 크래시되거나 동작정지에 빠지면, 원인은 대개

- 객체가 정상적으로 생성되지 못했거나, null 상태의 객체를 억세스 (NullPointerException, IllegamArgumentException)
- 존재하지 않는 파일에 억세스 시도 (FileNotFound)
- 배열의 범위를 벗어난 억세스 (ArrayOutOfIndex)
- 메모리 크래시 (OutOfMemory)
- 0으로 나누기 시도 (DevisionByZero)

중에서 발생하는게 보통입니다.

아마 제일 만나기 쉬운게 NullPointerException 일텐데, 알아도 쉽지 않은 것이, 이 버그의 상당수가 기존의 sdk나 api를 사용하면서 객체 획득 과정을 제대로 이해하지 못해 발생하는 경우가 지극히 많습니다.

크래시/동작정지는 비교적 수정하기 쉽지만, 값 자체가 잘못 계산되거나 하는 경우는 좀 더 섬세하게 트레이스해야 하는 경우가 많습니다.

하지만 디버깅의 기본 방법은 이것과 다르지 않으니, 초보자분들께 참고가 되었으면 좋겠습니다.



덧글

  • 공부중 2014/11/15 14:11 # 삭제 답글

    빨간색 부분이 미동작 부분 맞나요?
  • 펭귄대왕 2014/11/15 18:32 #

    이건 예시를 들기 위해 의도적으로 만든겁니다. 블로그에 올라와있는 소스하고는 상관없이요.
  • 공부중 2014/11/15 23:27 # 삭제 답글

    아녀 빨간색 부분이 미동작이고

    초록색이 동작 이고 객체나 메소드가 있다는 말아닌가용?
  • 펭귄대왕 2014/11/16 04:22 #

    어느 부분을 말씀하시는건지 잘 모르겠습니다. 색으로 구별하시면 안돼요. 빨간 사각형 친 부분과 설명을 봐 주세요.
  • 공부중 2014/11/16 16:12 # 삭제 답글

    아 아닙니다.. 처음부터 글보면서 다시 해봐야겠습니다.
  • 펭귄대왕 2014/11/16 21:23 #

    유튜브같은데서 찾아보시면 다양한 이클립스 디버깅 요령이 영상강의로 올라온 것도 있으니 그것도 참조하시면 좀 더 직관적으로 이해하시는데 도움이 될 것 같습니다. 전 그런쪽은 서툴러서..
  • 공부중 2014/11/18 20:41 # 삭제 답글

    제가 몇일동안 계속 찾아봤는데 그 오류를 고칠수없어서

    혹시 어느부분 오류인지 좀 알려주실수 있을까요?

    소스는 메일로 보내드리겟습니당.
  • 펭귄대왕 2014/11/19 02:35 #

    답장 드렸습니다
댓글 입력 영역


Books

Geek라이프

메가 드라이브 퍼펙트 카탈로그
마에다 히로유키 저/조기현 역

미소녀 일러스트 테크닉
B-은하, pen스케, 카와이 저/정유진 역

핵심강좌! Cocos2d-x
이재환 저

피규어의 교과서 레진 키트 & 도색 입문 편
후지타 시게토시 저/김정규 역
예스24 | 애드온2
일본서적 전문사이트 NEPIC