태그 : eclipse








# by | 2008/01/18 16:04 | 프로그래밍 이야기 | 트랙백(1) | 덧글(11)
기초 : 중단점_Breakpoint들과 단계별 실행
가장 단순한 방법부터 시작을 해보면, 먼저 중단점를 설정하고 실행 코드 추적을 시작해라.
| 장점 | 단점 |
|
|
최적의 상황: 빠르고 단순한 방법이 필요하고, 모든 코드를 가지고 있으며 어느 부분에서 멈춰야 하는지 알있을 때. 특정 위치의 자세한 정보(전달 인수, 지역 변수 등)가 필요한 경우.
팁: 모든 소스코드를 가지고 있지 않다고 해도 메소드 중단점이나 클래스 로딩 중단점을 설정해서 메소드나 클래스에 들어갈 때 멈추게 할 수 있다.
원초적: 디버그 메세지
디버기 메세지 설정하기로 계속해보자. 가장 단순한 방법은 System.out.print 명령을 사용해서 콘솔로 메세지를 출력하는 것이다. 다음 단계는 아마도 로깅 메카니즘( JDK logging, Apache Commons Logging, Log4j)을 사용하는 것이 될 수 있다.
| 장점 | 단점 |
|
|
최적의 상황: 코드를 가지고 있고 어디를 살펴보아야 할지에 대해 좋은 생각이 있는 경우. 이벤트 핸들어에 좋은 해법이다. 복잡한 흐름이 실행되는 중에 어떤 이벤트가 발생하는지 이해하는데 효율성이 높아 실용적이다.
팁: 지금 실행중인 메소드를 출력해주는 제너릭 메소드를 만드는 것은 쉽다. 내가 즐겨쓰는 가장 좋은 방법은 스텍 트레이스를 얻는 것이다. 호출 스택 중 마지막 엔트리가 디버그 메세지 메소드가 될 것이다. 그 엔트리 전의 것들은 그것을 호출하는 메소드들이 된다. 스택 트레이스를 얻는 방법은 다음과 같다.
Thread.currentThread().getStackTrace()를 사용한다.getStackTrace를 사용해서 호출 스택을 얻는다. 이 인스턴스를 throw 할 필요는 없다.. 쟁점: 동적 프록시_Dynamic Proxy
단순한 디버그 메세지 보다 향상된 방법이다. Dynamic Proxy는 자바의 특별한 기능으로 개발자가 프록시 클래스를 도입해 기존 클래스 앞에 놓고 기존 인터페이스로 들어오는 호출들을 가로챌 수 있게 해준다. 일단 호출을 가로채고 나면 필요한 모든 정보가 포함된 적절한 디버그 메세지를 출력 할 수 있을 것이다.
| 장점 | 단점 |
|
|
최적의 상황: 이벤트 핸들러에 최고의 해법. 몇초만에 제너릭프록시로 깡통 이벤트 핸들러를 만들어 이벤트의 순서를 볼 수 있다. 이벤트 핸들러들을 이해하려 할 때에 가장 단순하면서도 빠른 방법이다.
팁: Sun의 사이트에서 제너릭 동적 플락스 코드를 찾을 수 있다. 이것은 대부분 좋지만 한가지 작은 제약이 있는데 프록시로 감싸게 될 인스턴스의 클래스가 직접 구현했던 인터페이스들만을 임플리먼트 한다. 그 조상들의 어떤 인터페이스도 임플리먼트하지 않는다. 이 문제는 조상들의 목록을 따라가며 모든 인터페이스들을 뽑아내는 것으로 쉽게 수정할 수 있다. 앞으로 올릴 포스트들 중 하나에서 좀 더 나은 방법을 제시하겠다.
무차별 공격: 실행시 프로파일러
프로파일러는 특별한 JVM 훅으로 모든 호출을 추적하는 강력한 도구이다. 좌우간, 이것은 왠지 반 인치짜리 못에 10 파운드짜리 해머를 쓰는 것 같다.
| 장점 | 단점 |
|
|
최적의 상황: 매우 특별한 동작에 대한 완전한 그림은 원할 때 (예를 들어 매운 짧은 실행 흐름)
팁: 좋은 도구의 구입비는 시트당 500불 정도 이다. 대부분의 무료 도구들은 기본적 수준의 기능만 가지고 있다. 이 작업을 위한 최고의 무료 오픈소스 도구는 Eclipse Testing and Performance Tools Platform (TPTP)이다. 이 도구를 사용해본 좋은 경험을 가지고 있어 추천한다. 이것은 어떻게 실행되는지 이해하기에 가장 좋은 방법 중 하나인 sequence diagram을 제공한다. TPTP를 사용하곤 했었는데 내가 맥으로 바꾸기고 보니 호환이 되지 않았다. 여유 시간이 좀 있었으면 수정하려고 시도했을 것이다.
새시대: Aspects
Aspect Oriented Programming (AOP)는 단순하지 않은 아이디어이다. Aspects의 개념은 빼고 단순히 결론만 한마디로 말한다면, '빠르고 쉽게 코드의 실행을 가로채는 방법'이다. 원소스코드의 변경 없이 메소드, 생성자, 필드 접근등의 주위에 후크를 선별적으로 걸 수 있다. 이 후크안에서 디버그 메세지를 출력 할 수 있다.
| 장점 | 단점 |
|
|
최적의 상황: 다시 구축 할 수 있는 실행 코드를 추적하려고 할 때
팁: 그냥 사용하라. AOP는 아직 주류에서 멀리 떨어져 있다. 언제 주류에 이를지도 확실하지 않다. 품질이나 사양에 대한 논쟁을 차치하고 대부분의 개발자들은 한시간 안에 AOP 기반의 로깅을 설정해서 실행할 수 있다. 앞으로 올린 포스트에서 정확한 사용 단계를 보여 주려 한다. 이클립스 사용자라면 Aspect Java Development Toots (AJDT)를 추천한다.
결론
어떤 방법을 선택했나요? 두가지 서로 다른 경우로 나누려 합니다. 실행 코드의 짧은 부분을 완벽하게 추적할 것이냐 아니면 주어진 클래스나 계층으로 들어가거나 거꾸러 여기서 발생하는 이벤트들을 추적할 것이냐.
실행을 완벽히 추적하려 할 때:
이벤트를 추적하려고 할 때:
보는 것 처럼 이 문맥에서 난 중단점을 좋아하지 않는다. 중단점은 자신의 코드를 디버깅 할 때에는 아주 훌륭하다. 그렇지만 실행 추적에는 그렇지 않다. 이를 하는데에는 보다 더 효율적인 방법들이 있다.
갱신: 몇몇 독자들이 지적한 것 처럼 AspectJ는 패키지된 JAR를 다루는데 사용 할 수 있다. 나중에 이 선택사항과 AspectJ을 탐구한 글을 올릴 예정이다.
# by | 2007/12/11 18:12 | 프로그래밍 이야기 | 트랙백(1) | 핑백(1) | 덧글(4)
◀ 이전 페이지다음 페이지 ▶