2007년 8월 30일 목요일

이클립스 디버그

언제까지 System.out.println()으로 버그를 잡으려 할 것인가.

이클립스에서 VC처럼 디버깅을 하자.


사실 디버깅은 처음 접하는 사람에겐 쉽지 않다.
책을 보고 따라하면 너무나 쉬운데 막상 프로그래밍하면서 적용하다 보면 애를 먹고는 한다.
그러다 과감하게 난 System.out.println()의 강력함을 알고 있다며 중요 요소에 값을 찍는다.
그러다 어디가 어디서 나오는 값인지 몰라서 갑갑하게 돼고,
그러다 이번 프로그래밍엔 문제가 많았어. 다시 짜지 뭐. 난 부지런하니까... 하게 돼고...
그러다 다시 디버깅 책을 찾아 따라하게 돼고....

그렇지만, 언젠가 좋아지겠지 하며 오늘도 이런 악순환을 계속해본다.
정말 언젠간 좋아지겠지.


이클립스에서 디버깅을 해본 사람은 알 것이다.
무료인데도 정말 너무나 훌륭한 녀석이다.

정말 고마운 분들이 세상엔 많이 계시고, 그 분들로 인하여 영광을 입은 이클립스 사용자들이 이클립스에서 디버깅을 위해서 가장 먼저 해야 할 것은 어디가 문제가 될 것인가를 아는 눈이다. 이건 그 사람의 내공의 깊이에 달려있는 문제이긴 하지만, 효과적인 툴의 도움을 받는다면 더욱 문제 해결의 실마리를 찾기 쉽게 된다.

.이클립스에서 디버깅을 하기 위해서 가장 먼저 문제가 될 만한 곳을 찾아라.
->결과(console 창)가 보이는 화면에서 Exception이나 오류가 발생했을 때의 해당 위치,
->논리적으로 뭔가 애매 모호한 프로그램 부근
->업무 시간이 끝날 때 즈음 급하게 나갈려고 대충 짠 부근
등이 주요 타겟이다.

1.브레이크포인트
의심이 되는 위치에 추가한다.
- 변수명에 설정하면 프로그램에서 이 변수를 사용할 때마다 프로그램이 정지한다.
- 프로그램 라인에 설정하면 해당 프로그램 라인을 지날 때 프로그램이 정지한다.

브레이크 포인트를 여러개 추가한 상태에서 포인트는 그대로 둔채 몇개를 잠시 끄고 싶을 때는 마우스 왼쪽 클릭해서 Disable Breakpoint를 설정하면 된다.(반대는 Enable Breakpoint)

2.Hit Count
브레이크 포인트가 추가되었을때 변수나 프로그램 라인이 몇번 째 호출 되었을때 멈추라는 명령은 Hit Count를 설정함으로서 수행할 수 있다. 이런 경우는 보통 for나 while문에서 몇번의 루프 반복 이후에 문제가 발생할 때 보다 편리하게 이용할 수 있다. '한 100번 쯤 뒤에 문제가 발생하던데' 하면 Hit Count를 95정도로 설정하면 될 테지.

3.멀티 쓰레드 디버깅
멀티 쓰레드 디버깅을 해보신적이 있으신가... 그렇다면 이 문서 자체가 유용하지 않으실 정도로 내공이 쌓인 분이시겠지만... 멀티 쓰레딩을 디버깅하는 아픔을 겪어보신 분이 아니라면, 그런 문제에 부딪히기 전에 이클립스에서 가상 머신(VM)을 아예 멈춰서 전체 쓰레드 동작을 정지시키는 훌륭한 옵션이 있음을 꼭 알고 계시길 바란다.
이 기능은 breakpoint를 설정한 상태에서 컨텍스트 메뉴에서 Suspend VM을 선택하면 된다. Suspend Thread는 원래대로 해당 Thread만 멈추게 된다. 혹 이해가 잘 안되는 사람을 위해 추가로 얘길 한다면 일반적으로 Thread programming을 하지 않고 static void main()을 이용한 기본적인(?) 프로그래밍을 하는 경우는 main이라는 one Thread만 동작하기 때문에 Suspend Thread나 Suspend VM이나 똑같은 작동을 한다.(신경쓰지 않아도 된다는 얘기다.)

4.스텝 단위 디버깅
성격이 급하신 분들이나, VC를 사용하다 이클립스를 쓰는 분들은 당장 이것들이 필요할 것이다.
Step Into(F5키):프로그램을 한 스텝진행, 다음 실행 문이 함수 안이면 함수 안으로 들어감.
Step Over(F6키):함수 호출을 지나치고 현재 위치에서 한 스텝씩 진행
Step Return(F7키):현재 함수 끝까지 바로 가서 리턴한 후 함수 호출부로 되돌아 간다.
Resume(F8키):멈추어 있던 쓰레드를 다시 진행시키고 다음 브레이크포인트까지 실행
Suspend:쓰레드를 일시 정지한다. 강제로 breakpoint를 현재 수행문에 지정한 것과 같다.
Drop to Frame:선택한 스택 프레임의 첫 행으로 실행 포인트를 옮긴다. 특정 함수를 실행하다 그 함수의 처음부터 다시 디버깅하려고 할때.
Terminate:종료

Run to Line(Ctrl+R):쓰레드가 정지된 상태에서 테스트 하고 싶은 곳을 에디터로 소스에서 선택한 뒤 Run to Line을 실행 하면 그 곳까지 프로그램 수행 후 자동 정지한다.

5. 스텝 필터링
F5키를 눌러 한 스텝씩 진행하다 보면 java가 제공하는 라이브러리 내부로 들어가는 경우가 발생한다. F6만 누른 다면 문제가 발생하지 않겠지만, 내가 만든 함수 안으로는 들어가보고 싶을 때 신경써서 F5, F6, F7을 누르는 건 상당히 피곤한 일이다. 이럴 때 사용할 수 있는 기능이 스텝 필터링이다. 말 그대로 한 발짝 움직일 때 하지 않았으면 하는 일을 지정해 주는 것이다. 이를 위해서 스텝 필터를 먼저 설정해야 한다.

6.Display
디버깅 중, 내가 만든 함수를 이용해 현재의 결과를 보고 싶어 할 수 있다. 예를 들면, isInteger()라는 함수를 만들었고, 이 함수가 함수 인자가 Integer형인지를 리턴 한다고 할때 디버깅 상황에서 현재 상태에 이 함수의 결과를 알고 싶다면, 디버깅을 중단하고 나가서 isInteger()코드를 추가하지 말아라.
단지, Window메뉴의 Show View메뉴의 Display를 켜고 isInteger()를 치고 눌러보자.
이 Display는 내가 만든 함수 뿐만 아니라 확인하고 싶은 수식을 직접 입력할 수도 있다.

7.Drop to Frame
F6키를 사정없이 눌러서 내가 보고 싶어하는 소스 코드 부분을 지나친 적이 있는가. 이럴 때 당신에게 필요한 기능이 Drop to Frame이다. Drop to Frame을 사용하면 현재 메서드의 첫 행으로 되돌아 간다.

8.Detail Formatter
String 객체의 배열을 다루는 class를 사용할 때 너무 많은 String 배열로 인해서 내가 원하는 부분을 찾는 데 어려웠던 적이 있는가? 예를 들면, 한 String 객체의 전체 문자열을 각 array 별로 보여주도록 (ex)S[0] = "나는 언제나")) 하기를 바랬던 적이 있냐 하는 말이다. 이럴 경우 Java메뉴의 Debug메뉴의 Detail Formatters를 통해서 내가 원하는 형태로 객체가 표시되도록 할 수 있다. 복잡한 코드에서는 강력한 기능을 발휘하는 메뉴이다.

댓글 없음: