IT_Programming/Dev Tools

이클립스 디버깅 2

JJun ™ 2010. 10. 15. 10:05

----------------------------------------------------------------------------------------------

 출처: https://www.ibm.com/developerworks/kr/library/os-ecbug/

          http://rahxephon.tistory.com/1290 

----------------------------------------------------------------------------------------------

 

 

원격 디버깅

 

Eclipse 디버거는 원격 애플리케이션을 디버깅 하는데도 재미있는 옵션을 제공한다.

자바 애플리케이션을 실행하는 원격 VM으로 연결하여 애플리케이션에 부착할 수 있다.

원격 디버깅 세션에서 실행하는 것은 로컬 디버깅과 비슷하다.

하지만, 원격 디버깅 설정에는 Run > Debug 윈도우에서 다른 설정을 해야 한다.

왼쪽 뷰에서 Remote Java Application 항목을 선택한 다음 New를 클릭한다.

새로운 원격 시작 설정이 이루어지면 세 개의 탭(Connect, Source, Common)이 보인다.

 

Connect 탭의 Project 필드에서 (소스 코드 검색용) 시작 참조용으로 사용할 프로젝트를 선택한다.

Connect 탭의 Host 필드에서, 자바 프로그램이 실행되는 원격 호스트의 IP 주소나 도메인 이름을 입력한다.

Connect 탭의 Port 필드에서, 원격 VM이 연결을 수락하는 포트를 입력한다.

 

일반적으로, 이 포트는 원격 VM이 시작될 때 지정된다. Terminate 명령어를 원격 세션에서 사용할 수 있는지 여부를 디버거가 결정하도록 하려면 Allow termination of remote VM 옵션을 선택한다.

 

연결된 VM을 종료하고 싶다면 이 옵션을 선택한다. 이제 여러분이 Debug 옵션을 선택하면,

디버거는 지정된 주소와 포트에 있는 원격 VM으로 연결하고 결과가 Debug 뷰에 디스플레이 된다.

 

런처(launcher)가 지정된 주소에 있는 VM에 연결되지 않으면 에러 메시지가 나타난다.

일반적으로, 원격 디버깅 기능의 가용성은 원격 호스트에서 실행되는 Java VM에 달려있다.

 


그림 10. 원격 디버깅 세션을 위한 연결 프로퍼티 설정하기 




 

다른 언어 디버깅 하기

 

자바가 Eclipse에서 가장 일반적으로 사용되지만, Eclipse는 다른 많은 언어들도 지원할 수 있는

확장성 있는 플랫폼이다. Eclipse는 C/C++ Development Tools (CDT) 프로젝트를 통해 C/C++을 지원한다.

 

CDT는 C/C++ 코드를 디버깅하는 기능으로 표준 Eclipse Debug 뷰를 확장하고, CDT Debug 뷰에서는

워크벤치의 C/C++ 프로젝트의 디버깅을 관리할 수 있다. CDT에는 내부 디버거가 없지만 GNU GDB

디버거에 대한 프론트엔드를 제공한다. 이것은 로컬에서만 사용된다. PHP Development Tools (PDT) 같은

프로젝트도 고유의 디버거를 제공한다. (그림 11)

 


그림 11. PHP 디버거
 

 

 


 

 

이클립스에서 디버깅을 하기 위해서 가장 먼저 문제가 될 만한 곳을 찾아라.

→ 결과(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를 통해서 내가 원하는 형태로 객체가 표시되도록 할 수 있다. 복잡한 코드에서는 강력한 기능을 발휘하는 메뉴이다.