Right now do !

[JAVA] 자바에서 OutputDebugString, DbgView.exe 사용기

by 지금당장해

 서비스 프로그램을 작성하다보면 내부 로직이 복잡하게 Thread로 얽히는 것이 일반적인 상황일 것이다. 이러다 보니 로그를 보며서 진행 흐름을 머리속으로 Synchronize하게 되는데, 사실 로그 파일이라는 것이 로깅 프레임웍에 따라 롤링도 되고 이를 실시간으로 업데이트 해주는 별도의 뷰어를 사용해야 하니 필자 같은 소위 M빠들은 DbgView를 이용하여 프로그램 Statement 사이 사이에 날려주는 디버그 정보를 읽어 디버그 혹은 UI가 없는 녀석들의 동작을 감시한다.  헌데   오늘 간만에 JAVA코드를 만지작 거리다 갑자기 그런 생각이 Java에서는 않되나? 역시 있었다.

JAVA에는 JNI라고 하는 네이티브 인터페이스 메커니즘이 있고 이를 활용하여 해서 OutputDebugString함수를 사용하는 방법으로 내 궁금증을 해소 해봤다. 사실 이 내용이 모두에게 유용하지는 않다. 우리 프로젝트 팀 만해도 반은 Mac을 쓰고 있고 반은 Windows인데다. 이 코드를 넣어놓으면 리눅스나 유닉스 환경에서는 불용이다. 뭐 이런 쓸데 없는 글을 쓰냐고 욕이 들여오지만 나는 유용하다. 그리고 나와 같은 JAVA를 개발하는 M빠 개발자를 위해 ...

 

흐름은 C#에서 Native를 이용하는 것과 비슷하다. 아래 코드는 C#에서 동일한 함수를 사용하는 방법이다. 

C#은 해당 Native함수의 함수 원형을 선언하고 그 위에 어트리뷰트를 달아 어떤 DLL에 속한 함수인지 지정하는 방식이다.

[DllImport("kernel32.dll")]
static extern void OutputDebugString(string lpOutputString);

// 필요한 곳에서 아래와 같이 호출한다.
OutputDebugString("[HONG_DEBUG] - Init configuration.");

 

자바는 이에 비해 살작 복잡다. 먼저 준비물이 필요하다. 호출하려는 함수의 원형을 정의한 Interface를 하나 구현하고 사용할때 이 인터페이스에 해당 Native를 Mapping하는 방식으로 구현한다.

 

package org.apache.catalina;

import com.sun.jna.Library;

public interface Kernel32  extends Library {
    void OutputDebugStringA(String Text);
}


// 필요한 곳에서 아래와 같이 호출한다.

Kernel32 lib = Native.load("kernel32", Kernel32.class);
lib.OutputDebugStringA("");

이 코드는 jna-5.2.0.jar를 이용했다. 필자는 Maven을 통해 다운받아 참조 했다. 각자가 의존성 관리 하는 방식이 다를테니 자세한 설명은 넘어가겠다.

 

오늘은 여기까지~~

블로그의 정보

지금 당장 해!!!

지금당장해

활동하기