특집기사:이클립스 디버그 로깅 스타일

위클립스
이동: 둘러보기, 찾기
Article.png 특집기사 정보
Jeeeyul.jpg
저자 이지율

이클립스 상용 플러그인 개발을 시작한지 2년쯤 지났을 때, 문득 어떤 의문에 빠진적이 있었다.

우리 제품의 타겟 플랫폼에 포함된 모든 플러그인들은 println()등을 이용한 메시지를 단 한번도 쓰지 않고 개발된걸까?

그런 의문을 가진 이유는 간단했는데, 내 플러그인을 디버깅하는 동안, 다른 플러그인이 만든 메시지가 콘솔에 전혀 보이지 않았기 때문이다. 별도 외부 로그 매커니즘을 썼다 한들, 결국 시스템 콘솔로 뭔가 출력되긴 해야 할 것인데 말이다. 게다가 수천개에 달하는 그 모든 플러그인들이 디버그 메시지 없이 작성되었을리가 없지 않은가?

반대로 내 플러그인은 메시지를 항상 출력하므로, 내 플러그인타겟 플랫폼에 포함하여 개발을 진행하는 개발자들의 콘솔에는 그들의 디버그 메시지와 내 디버그 메시지가 뒤섞여 보일 것이고, 이는 서드파티를 지원하는 올바른 입장이 아닐 것이 분명하다.

이 문서는 그 의문에 대한 해답과, 그 해답을 자신의 플러그인에도 적용하는 방법을 안내한다.

목차

[편집] 개요

개발하는 동안 표준 콘솔을 이용해 디버그 메시지를 출력하는 것은 일반적인 접근 법이다. 대표적인 관용구는 다음과 같다:

private static final boolean DEBUG = true;
   ...
   if (DEBUG){
      System.out.println("So far so good");
   }

이 접근법의 장점은 배포 직전에 DEBUG 필드를 false로 지정하여 디버그 메시지를 끌 수 있다는 점이다. 이 필드는 정적으로 초기화 되므로, 자바 컴파일러는 도달불가능한 코드 블록을 분석 한 뒤, 알아서 if 블록구문 전체를 제거하고 컴파일한다.

이는 이상적인 듯 하지만 반대로 생각하면, 배포된 제품에서 유용한 디버그 메시지를 얻을 방법이 없다는 뜻도 된다. 특정 유저가 문제를 발견하면, 할 수 없이 디버그 필드를 켜고 다시 빌드하여 제품을 보내주기 전까지 쓸만한 피드백을 얻을 수 없을 것이다.

[편집] 이클립스 추적 매커니즘

이클립스는 기본적으로 꺼져있지만, 간단하게 켜거나 글 수 있는 추적 매커니즘을 제공한다.

이를 이용해 추적가능한 디버그 메시지를 추적하려면, 추적 메시지 출력 부분에 Plugin.isDebugging()Platform.getDebugOption()를 이용한 조건문을 추가해야 한다:

private static final String DEBUG_ONE = "org.eclipse.faq.examples/debug/option1";
   ...
   String debugOption = Platform.getDebugOption(DEBUG_ONE);
   if (ExamplesPlugin.getDefault().isDebugging() && "true".equalsIgnoreCase(debugOption)){
      System.out.println("Debug statement one.");
   }

위의 코드는 Plugin.setDebugging(boolean)을 이용하여 동적으로 디버그 메시지를 켜거나 끌 수 있게 한다. 이는 콘솔에 보여질 메시지를 동적으로 통제할 때 유용하다. 추적을 끄고 코드를 진행하다, 디버그가 필요한 구간에서 켜면된다.

만약 여러분의 플러그인이 세분화된 주제에 대해 개별적으로 디버그 메시지를 켜거나 끌 필요가 없다면, 디버그 옵션은 사용하지 않아도 무방하다.

[편집] 대체 스타일

런타임시 동적으로 켜고 끄는 것에 관심이 없거나, 조건문에 등에 의한 코드량 증가, 퍼포먼스등이 신경쓰인다면, 더 빠르고 깔끔한 스타일도 있다:

private static final boolean DEBUG_TWO = ExamplesPlugin.getDefault().isDebugging() &&
         "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.faq.examples/debug/option2"));
   ...
   if (DEBUG_TWO){
      System.out.println("Debug statement two.");
   }

위의 코드는 맨 처음 소개한 대표적 관용구만큼 성능이 좋지는 않다. 왜냐하면 디버그 필드가 정적으로 초기화되지 못하기 때문에 컴파일러는 불필요한 구문을 제거하는 등의 최적화를 수행하지 못하기 때문이다. 그래도 대부분의 애플리케이션에서 충분한 성능을 보여준다.

[편집] 디버그 추적 켜기

디버그 옵션 설정

추적을 켜기 위해, 디버그 옵션 목록을 담은 추적 옵션 파일을 하나 만들어야 한다. 기본적으로 이클립스 플랫폼은 설치 경로의 .options을 찾아 읽는다.

이 파일은 텍스트 파일이며, 문법은 키/값 쌍 형태의 자바 Properties(ISO-8859-1) 파일과 같다. 모든 값은 String으로 취급된다:

  1. org.eclipse.faq.examples/debug=true
  2. org.eclipse.faq.examples/debug/option1=true
  3. org.eclipse.faq.examples/debug/option2=true

1첫번째 줄은 Plugin.isDebugging()의 값을 true로 만들어 준다. 다음 두줄은 Platform.getDebugOption()으로 넘어오는 디버그 옵션 String 값을 정의한다.

이 파일을 이용해 디버그 옵션을 원하는데로 초기화하여 제품을 실행할 수 있으므로, 문제를 경험한 엔드유저에게 디버그 옵션 추적파일만 제공하면 쓸만한 정보를 얻을 수 있을 것이다. 기본적으로 콘솔은 사용자에게 보이지 않으므로 다음과 같이 실행해야 한다:

eclipse -debug

혹은 VM으로 javaw.exe 대신 java.exe를 이용하게 해도 된다.

eclipse -vm "c:/Pro.../jre/bin/java.exe"

[편집] 내 플러그인에 추적 매커니즘 추가하기

직접 개발한 플러그인을 추적하고 싶다면, 플러그인 프로젝트에 .options 파일을 하나 만들고 기본 값들을 갖도록 할 수 있다. 이 파일을 선언함으로써, 다른 개발자나 사용자들에게 디버그 옵션이 존재함을 알릴 수 있으며, 워크벤치 실행 설정 UI는 이를 자동으로 인식하여, 디버그 옵션 설정 페이지를 만들어 준다. 이 UI는 값이 true 또는 false 인 경우, 체크박스로 표시되며, 그 외의 경우 텍스트 필드로 사용자가 값을 수정할 수 있게 한다.

대게의 디버그 옵션은 콘솔에 출력할 특정 주제의 디버그 메시지를 켜고 끄는 용도로 사용되지만, 자원의 관리상황을 추적[1]하고 연동하는 등, 디버깅을 위해 동작 형태 자체가 달라지는 경우도 있다.

[편집] 추적 메시지 활용

이클립스 플러그인 개발자라면, 다른 플러그인들의 동작상황을 추적하고 싶은 경우가 종종 있을 것이다. 예를 들어 활성화된 UI Context나 커맨드와 핸들러의 매핑상태등을 알고 싶을 수 있다. 디버그 런치 구성에서 Tracing 탭을 잘 살펴보면, 여러 주제에 대해 추적이 제공되고 있는 것을 알 수 있을 것이다. 원하는 추적 옵션을 켜고 디버깅 해보면, 원하는 정보들을 얻을 수 있을 것이다.

[편집] 참조

  1. SWT 리소스 릭 추적을 위한 디버그 옵션

이 기사에 대한 의견은 토론 페이지를 통해 나눌 수 있습니다.

개인 도구
이름공간
변수
행위
포탈
탐색
도움
도구모음